Webpack 5 在2020年10月正式发布,更新的内容比较多。我们从头梳理下本次更新的核心内容。
文章目录
一、构建优化
-
1.
Tree Shaking(删除无用代码)module.exports = { optimization: { usedExports: true, // 标记出未被导出的变量 minimize: true // 去除无用变量并压缩代码 } } -
2. 合并模块
concatenateModulesmodule.exports = { optimization: { concatenateModules: true // 生产模式(production)下默认启用 } } -
3. 副作用
sideEffectswebpack.config.js:module.exports = { optimization: { sideEffects: true // 开启副作用功能(编译时跳过被导出但未被使用、标记为不包含副作用的模块) } }package.json:标记所有模块无副作用{ "name": "webpack 5.0", "version": "1.0.0", "sideEffects": false } -
4. 嵌套的
Nested tree-shaking删除嵌套的模块未被使用的相关代码
-
5. 内部模块
Inner-module tree-shakingmodule.exports = { optimization: { innerGraph: true // 分析导出和导入之间的依赖关系(生产模式默认启用),进行代码压缩 } }
二、长期缓存
-
1.
Hash相关:hash:所有的chunk文件使用相同的hash,项目中任一文件变化都会影响所有的chunk文件的hash值chunkhash:针对与输出文件,任意文件改变只会影响其依赖的chunk,不会影响其它chunkcontenthash:基于单个文件内容产生的hash(webpack 4.0之前只针对于文本结构)
-
2.
deterministic长期缓存:module.exports = { optimization: { chunkIds: "deterministic", // 告知 webpack 当选择模块 id 时需要使用哪种算法 moduleIds: "deterministic", // 告知 webpack 当选择模块 id 时需要使用哪种算法 mangleExports: "deterministic" // 允许控制导出处理(export mangling) } }
三、增量构建
- 默认缓存到
node_modules/.cache/webpack中,当前可以利用cacheDirectory自定义目录module.exports = { cache: { type: 'filesystem', // 将缓存类型设置为文件系统,`webpack 4.0` 为 `memory` (开发模式) cacheDirectory: path.resolve(__dirname,'node_modules/.cac/webpack'), // 自定义缓存位置 } }
四、Web 新特性
-
1. 资源模块
webpack 4.0中我们想对png、mp3、woff2等资源进行处理时,需要利用url-loader来处理。在webpack 5.0中内置了对静态资源的处理,添加了 4种 新的模块类型,如下:模块类型 说明 asset/source导出资源的源代码。之前通过使用 raw-loader实现asset/inline导出一个资源的 Base64。之前通过使用url-loader实现asset/resource发送一个单独的文件并导出 URL。之前通过使用file-loader实现asset在导出一个 Base64和发送一个单独的文件之间自动选择,并且配置资源体积限制实现。之前通过使用url-loaderwebpack 4.0:之前的配置module: { rules: [ // 处理图片资源 { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, use: { loader: 'url-loader', options: { esModule: false, // 设为false,否则图片编译为 [object Module] limit: 10 * 1024 // 超过10k name: 'image/[name].[hash:7].[ext]', // outputPath: 'image' publicPath: _publicPath } } }, ] }webpack 5.0:现在的配置module: { rules: [ // 处理图片资源 { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, type: 'asset', generator: { filename: 'image/[name].[hash:7].[ext]' }, parser: { dataUrlCondition: { maxSize: 10 * 1024 // 超过10kb } } }, ] } -
2. 不再为
Node.js模块 自动引用Polyfills不在为例如:
path,process,os等类似依赖提供支持,Polyfill交由开发者自由控制module.exports = { resolve: { fallback: { crypto: require.resolve('crypto-browserify'), events: require.resolve('events'), http: require.resolve('stream-http'), https: require.resolve('https-browserify'), os: require.resolve('os-browserify/browser'), path: require.resolve('path-browserify'), process: require.resolve('process/browser') ... } } } -
3. 模块联邦
不同项目共享模块
-
4. 改进
target配置module.exports = { target: ['web', 'es5'] // Webpack将为网络平台生成一个运行代码,并且只使用ES5的功能 } -
5. 其他 ( 部分插件版本要求 )
webpack-dev-server:v4.0.0 +html-webpack-plugin:v5.0.0 +- …
本文概述了Webpack 5.0的重大更新,包括构建优化如TreeShaking、模块合并、副作用管理和新模块类型;长期缓存的改进,如Hash和deterministic策略;增量构建的提升;Web开发的新功能,如资源模块处理和Node.js模块依赖调整;以及目标配置和相关插件的更新。
1197

被折叠的 条评论
为什么被折叠?



