webpack浅析

1.介绍webpack

webpack是模块打包机,宗旨是一切皆模块。通过入口文件解析打包成bundle.js文件,通过loader转换不能识别的less,sass,图片,.vue等文件,通过plugin扩展webpack功能。

2.升级webpack4

安装npm-check-updates文件,更新pakage.json文件

删除node_modules文件和pakage-lock.json文件

重新安装webpack-cli(因为webpack4中webpack-cli和webpack分成两个npm包)

babel-core报错,安装回babel-loader7.1.5

extract-css-plugin更新到@next版本(或者使用mini-css-extract-plugin推荐使用,两者区别,前者会把所有css文件打包到一个app.css文件,后者会依据懒加载方式拆分,这样页面css可以和js一样使用按需加载)

mini-css-extract-plugin使用注意修改:

//util.js更改

if (options.extract) {
// return ExtractTextPlugin.extract({
// use: loaders,
// fallback: ‘vue-style-loader‘
// })
if(process.env.NODE_ENV !== ‘production‘){
return [‘style-loader‘].concat(loaders)
}
return [miniCssExtractPlugin.loader].concat(loaders)
} else {
return [‘vue-style-loader‘].concat(loaders)
}

//webpack.prod.js修改

// new ExtractTextPlugin({
// filename: utils.assetsPath(‘css/[name].[hash].css‘),
// allChunks: true,
// }),
new miniCssExtractPlugin({
filename: utils.assetsPath(‘css/[name].[chunkhash].css‘),
allChunks: true,
}),

去掉commonChunk配置,增加optimization.splitChunks,和plugins通层级

optimization: {
splitChunks: {
chunks: "all",
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: ‘~‘,
name: true,
cacheGroups: {
async: {
chunks: "async",
minChunks: 1, // 代码块至少被引用的次数
maxInitialRequests: 3, // 设置最大的请求数
minSize: 0, // 设置每个 chunk 最小的大小 (默认30000),这里设置为 0,以方便测试
automaticNameDelimiter: ‘~‘,
priority: 8
},
vendors: {
chunks: "all", // 使用 all 模式
test: /[\\/]node_modules[\\/]/, // 匹配 node_modules 下的模块
name: "vendors", // 包命名,最终的命名要结合 output 的 chunkFilename
minChunks: 1,
minSize: 30000,
priority: 10, // 设置优先级
reuseExistingChunk: true,
},
common: {
chunks: "all",
minChunks: 2,
name:‘common‘,
priority: 9,
reuseExistingChunk: true
}
}
},
runtimeChunk: {
name: ‘manifest‘
}
}

添加mode

添加vue-loader里面的vueLoaderPlugin

//webpack.base.js

const { VueLoaderPlugin } = require(‘vue-loader‘)

plugins: [
new VueLoaderPlugin()
],

3.项目优化

缓存、懒加载、压缩代码、内嵌图片、内嵌manifest、合并碎片包(js打包输出文件不适合太多,因为浏览器加载js线程一般为4到5个,所以文件比较小的一些第三方或公共js不适合单独打包成一个文件)

使用external cdn

<script src="https://cdn.staticfile.org/vue/2.6.10/vue.min.js" type="text/javascript"></script>
<!-- 为cdn引入资源不会阻塞页面渲染可以在script上添加defer或者async,异步加载 -->
<!-- async异步加载完成后,会立即执行,执行时间会阻塞html parse,所以不适合用来有dom操作的js文件 -->
<!-- defer异步加载完成后,会在html parse之后执行-->
<!-- vue 使用cdn加载不适合defer和async-->

4.打包文件分析(webpack4)

打包后的manifest.js文件是一个立即执行函数、可以对照打包后的boostrap.js查看

//webpackJsonp.push之后的回调执行函数

function webpackJsonpCallback(data) {

...//省略

return checkDeferredModules();
};

//加载函数

// The require function
function __webpack_require__(moduleId) {

// Check if module is in cache
if(installedModules[moduleId]) {
return installedModules[moduleId].exports;
}
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
i: moduleId,
l: false,
exports: {}
};

// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

// Flag the module as loaded
module.l = true;

// Return the exports of the module
return module.exports;
}

// The chunk loading function for additional chunks
__webpack_require__.e = function requireEnsure(chunkId) {
var promises = [];

// mini-css-extract-plugin CSS loading
var cssChunks = {"3":1,"4":1};
if(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);
else if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {
promises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {
...//省略
};

// JSONP chunk loading for javascript

var installedChunkData = installedChunks[chunkId];
if(installedChunkData !== 0) { // 0 means "already installed".

// a Promise means "currently loading".
if(installedChunkData) {
promises.push(installedChunkData[2]);
} else {
// setup Promise in chunk cache
var promise = new Promise(function(resolve, reject) {
installedChunkData = installedChunks[chunkId] = [resolve, reject];
});
promises.push(installedChunkData[2] = promise);

...//省略

return Promise.all(promises);
};

var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
jsonpArray.push = webpackJsonpCallback;(这里重置push函数,当别的文件使用window[‘webpackJsonp‘].push的时候会调用这个函数)
jsonpArray = jsonpArray.slice();
for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
var parentJsonpFunction = oldJsonpFunction;

参考文件webpack是怎么运行的

5.构建流程

Webpack 就像一条生产线,要经过一系列处理流程后才能将源文件转换成输出结果。 这条生产线上的每个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。 插件就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源做处理。 Webpack 通过 Tapable 来组织这条复杂的生产线。 Webpack 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条生产线中,去改变生产线的运作。 Webpack 的事件流机制保证了插件的有序性,使得整个系统扩展性很好。 —吴浩麟《深入浅出webpack》

解析webpack配置参数,合并从shell传入和webpack.config.js文件里配置的参数,生产最后的配置结果。
注册所有配置的插件,好让插件监听webpack构建生命周期的事件节点,以做出对应的反应。
从配置的entry入口文件开始解析文件构建AST语法树,找出每个文件所依赖的文件,递归下去。
在解析文件递归的过程中根据文件类型和loader配置找出合适的loader用来对文件进行转换。
递归完后得到每个文件的最终结果,根据entry配置生成代码块chunk。
输出所有chunk到文件系统。

初始化配置参数 -> 绑定事件钩子回调(这里相当于一个订阅和发布) -> 确定Entry逐一遍历 -> 使用loader编译文件 -> 输出文件

6.webpack插件介绍

参考webpack插件

原文地址:https://www.cnblogs.com/sisi2020/p/11369456.html

时间: 2024-10-25 03:15:43

webpack浅析的相关文章

vue-cli webpack浅析

一直对脚手架的webpack配置很感兴趣. 长话短说,先从npm start开始. 打开package.json 找到scripts 可以看到start 运行的是dev, dev 又是从 build/webpack.dev.conf.js 开始的. npm start 做了什么 npm start => npm run dev =>webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 0

webpack模块机制浅析【一】

webpack模块机制浅析[一] 今天看了看webpack打包后的代码,所以就去分析了下代码的运行机制. 下面这段代码是webpack打包后的最基本的形式,可以说是[骨架] (function(root,fn){ if(typeof exports ==='object'&&typeof module === 'object'){ module.exports = fn();//exports和module同时存在,说明时在node的CommonJs规范下,这个时候使用module.exp

浅析 -- webpack

1. 一切皆模块 正如js文件可以是一个"模块(module)"一样,其他的(如css.image或html)文件也可视作模 块.因此,你可以require('myJSfile.js')亦可以require('myCSSfile.css').这意味着我们可以将事物(业务)分割成更小的易于管理的片段,从而达到重复利用等的目的. 2. 按需加载 传统的模块打包工具(module bundlers)最终将所有的模块编译生成一个庞大的bundle.js文件.但是在真实的app里边,"

webpack系列--浅析webpack的原理

一.前言 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发框架,开发效率会大幅下降. 在众多前端工程化工具中,webpack脱颖而出成为了当今最流行的前端构建工具. 二.webpack的原理 知其然知其所以然. 1.核心概念 (1)entry:一个可执行模块或者库的入口. (2)chunk:多个文件组成一个代码块.可以将可执行的模块和他所依赖的模块组合成一个c

Vue.js系列之项目搭建(vue2.0 + vue-cli + webpack )

1.安装node node.js环境(npm包管理器) cnpm npm的淘宝镜像 从node.js官网下载并安装node,安装过程很简单,一路"下一步"就可以了(傻瓜式安装).安装完成之后,打开命令行工具,输入 node -v,如果出现相应的版本号,则说明安装成功. npm包管理器,是集成在node中的,所以,直接输入 npm -v就会显示出npm的版本信息. 2.安装cnpm 在命令行中输入 npm install -g cnpm --registry=http://registr

angular踩坑之路:初探webpack

之前费了一番力气安装好了angular开发环境,后面的几天都是在angular中文官网上看文档,照着英雄教程一步一步操作,熟悉了angular的一些基本特性,这部分没有遇到什么大问题,还比较顺利.这两天在看官方文档中的Webpack简介,想跟着文档做一遍,了解一下如何用Webpack打包angular项目,结果遇到了一些问题,因为是初学angular和Webpack的小白,这些问题一时难以解决,花费了不少时间,想在这里记录一下. 首先跟着文档将相关的文件都添加到项目中,目录是这样子的: 根据文档

WebPack+WebStorm调试

怎么用webstorm来调试WebPack? 今天查了很多文档,最终在官网上耐心看完英文文档后,才解决.附上链接:https://blog.jetbrains.com/webstorm/2015/09/debugging-webpack-applications-in-webstorm/ 工具简介 Windows7 WebStorm2017 Webpack2 谷歌浏览器(默认浏览器) 操作 在Project视图里找到index.html,右击进入Debug模式 WebStrom会自动进入Debu

Python之encode与decode浅析

 Python之encode与decode浅析 在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下: # code: UTF-8 因为python 只检查 #.coding 和编码字符串,为了美观等原因可以如下写法: #-*-coding:utf-8-*- 常见编码介绍: GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换. GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码.

webpack教程

1 安装 webpack 2 初始化项目 3 webpack 配置 4 实时刷新 5 第三方库 6 模块化 7 打包.构建 安装 webpack# 我们通过 npm 在全局环境下安装 webpack: npm install webpack -g 安装完成后,我们可以使用 webpack 命令,执行 webpack --help 能够查看 webpack 提供的所有命令. 不过,建议在项目下安装一份局域的 webpack: npm install webpack --save-dev 如果觉得