webpack 清单

117 阅读3分钟

webpack

前置

基础

"webpack": "^5.72.0",

"webpack-cli": "^4.9.2",

"webpack-dev-server": "^4.9.0"

mini-svg-data-uri. : 最小化 SVG 文件需要安装一个第三方库,

mini-css-extract-plugin: 替代 style-loader

css-loader & style-loader & sass-loader & less-loader & postcss-loader

html-webpack-plugin

clean-webpack-plugin

devServer

hot: true, // 开启热更新

或者 new webpack.HotModuleReplacementPlugin() //

if (module.hot) {

module.hot.accept("./components/header.js", () => {});

}

static: path.join(__dirname, 'dist'), // 注意:Webpack5 中已用 static 替代 contentBase

publicPath: '/' // 服务器访问静态资源的默认路径,优先级高于 output.publicPath

babel

babel-loader @babel/core @babel/preset-env

core-js@3

babel/plugin-transform-runtime

@babel/runtime

@babel/runtime-corejs3

thread-loader

缓存

缓存:

babel缓存

cacheDirectory: true

--> 让第二次打包构建速度更快

文件资源缓存

hash: 每次wepack构建时会生成一个唯一的hash值。

问题: 因为js和css同时使用一个hash值。

如果重新打包,会导致所有缓存失效。(可能我却只改动一个文件)

chunkhash:根据chunk生成的hash值。如果打包来源于同一个chunk,那么hash值就一样

问题: js和css的hash值还是一样的

因为css是在js中被引入的,所以同属于一个chunk

contenthash: 根据文件的内容生成hash值。不同文件hash值一定不一样

--> 让代码上线运行缓存更好使用

optimization 生产环境才有意义

splitChunks: {

chunk: 'all' , 对代码进行分割

runtimeChunk:true // 代码分割时一定要使用 runtimeChunk, 否则将导致缓存失效

minimize: true,

minimizer: [

new TerserPlugin({

parallel: true // 使用多进程并发运行以提高构建速度

并发运行可以显著提高构建速度,因此** 强烈建议添加此配置 **

})

]

}

// 默认值存在的问题是:比如打包 mainutils.js 时, main中记录着 utils 的 hash值,导致缓存失效

使用: runtimeChunk: "single",

  • oneOf 只会匹配一个loader, 不用每次都走完全部的loader
  • 多个 loader 用use, 单个loader 用 loader
  • Loader 的作用是将不同的资源进行转换,那么 Plugin 则是在打包的过程中帮我们做一些事情,使打包过程更好管理。

当你运行 npm run bundle 时,它会先去 node_modules 文件夹中去找是否安装了 webpack 这个指令,如果有就会执行了,相当于被翻译成了 webpack 这个命令。

也就是看 node_modules 中的 webpack 下的 bin 中是否有对应的可执行指令文件

  • SVG 文件转换为 URI 编码后,与 base64 相比,体积会更小;
  • 处理 txt、xml 文件 type: 'asset/source' 更好,它会导出资源的源码,这样就能看到全貌,而非 base64 格式的编码字符串。

4与5的不同

根据 Webpack5 的文档,它简化了之前版本对于文件方面的配置,提供了 Asset Modules (静态资源模块),替代了之前常用的 raw-loader、url-loader、file-loader

Webpack5 中已用 static 替代 contentBase

asset 类型

当 type 设置为'asset',就会按照以下的策略去打包文件:

  • 如果一个模块大小超过 8 kb(这个值是默认的),就使用 asset/resource,被打包进输出文件夹中。(类似于 file-loader)
  • 否则,就使用 asset/inline,内联到打包文件中。(类似于 url-loader)

区别在于:前者会被单独放进输出文件夹中,后者被处理成 base64 编码字符串内敛进打包出的 JS 文件中。

后者的好处在于减少一次 http 请求,但是过长的字符串也会加重 js 的体积导致加载变慢,因此需要根据实际情况来确定到底采用哪一种方式去处理文件。

注意,当被作为后者处理时,是可以设置编码方式的,例如上面提到的特殊处理

手动通过 Rule.parser.dataUrlCondition.maxSize 去设置两者的界限:

module.exports = {
  mode: 'development',
  devtool: 'eval-cheap-module-source-map' // development
}
​
module.exports = {
  mode: 'production',
  devtool: 'nosources-source-map', // production
}

\