Webpack 5
#webpack
目录
- 1. 总结
- 2. 性能优化:持久化缓存(Persistent Caching)
- 3. 资源模块(Asset Modules)
- 4. 模块联邦(Module Federation)
- 5. 性能优化:Tree Shaking 优化
- 6. 更好的代码生成
- 7. Node.js Polyfills 自动加载被移除
- 8. 顶层 await 支持
- 9. 改进的开发体验
- 10. 新的 WebAssembly 支持
- 11. 改进的长期缓存
- 12. 更新的配置验证
- 13. 改进的打包体积
- 14. 主要优势总结
1. 总结
- 持久化缓存
- 默认启用,使用文件系统缓存
- 顶层 await 支持
- 资源模块 Asset Modules
- 内置了资源模块类型,不再需要额外的loader
- ==模块联邦==
- 改进了对
WebAssembly
的支持
2. 性能优化:持久化缓存(Persistent Caching)
Webpack 5 引入了更好的持久化缓存机制,可以显著提升构建性能:
- 改进了持久化缓存机制,默认启用
- 通过
文件系统缓存
提高重复构建性能
// webpack.config.js
module.exports = {
cache: {
type: 'filesystem', // 使用文件系统缓存
buildDependencies: {
config: [__filename] // 构建依赖
},
name: 'my-cache' // 缓存名称
}
}
3. 资源模块(Asset Modules)
取代了 file-loader、url-loader 和 raw-loader
,直接内置支持资源文件:
- 内置了资源模块类型,不再需要额外的loader
- 支持四种新的模块类型:
- asset/source
- asset
- asset/inline
- asset/resource
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/i,
type: 'asset', // 可选 'asset/resource'、'asset/inline'、'asset/source'
parser: {
dataUrlCondition: {
maxSize: 8 * 1024 // 8kb
}
}
}
]
}
}
4. 模块联邦(Module Federation)
- 允许多个独立的构建可以组成一个应用
- 支持运行时动态加载远程模块
- 实现真正的微前端架构
- 可以共享依赖,减少重复加载
允许多个独立的构建可以组成一个应用程序:
// host/webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'host',
remotes: {
app1: 'app1@http://localhost:3001/remoteEntry.js'
}
})
]
}
// remote/webpack.config.js
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'app1',
filename: 'remoteEntry.js',
exposes: {
'./Button': './src/Button'
}
})
]
}
5. 性能优化:Tree Shaking 优化
- 改进了Tree Shaking算法
- 能够处理更多的模块类型
- 支持嵌套的树摇,提高打包效率
- 改进了 Tree Shaking 机制,支持更多场景:
// package.json
{
"sideEffects": [
"*.css",
"*.scss"
]
}
// webpack.config.js
module.exports = {
optimization: {
usedExports: true,
minimize: true
}
}
6. 更好的代码生成
支持 ECMAScript 模块的输出:
module.exports = {
experiments: {
outputModule: true
},
output: {
library: {
type: 'module'
}
}
}
7. Node.js Polyfills 自动加载被移除
- 不再自动引入 Node.js polyfills
- 减小了打包体积
- 需要显式引入所需的polyfills
- 更好的Node.js支
- 改进了对Node.js模块的处理
- 提供了更好的CommonJS支持
// webpack.config.js
module.exports = {
resolve: {
fallback: {
"http": require.resolve("stream-http"),
"https": require.resolve("https-browserify"),
"stream": require.resolve("stream-browserify")
}
}
}
8. 顶层 await 支持
- 支持在模块顶层使用await
- 无需包装在async函数中
// 支持直接在模块顶层使用 await
const data = await fetch('https://api.example.com/data');
export { data };
9. 改进的开发体验
更好的错误提示和开发工具支持:
module.exports = {
stats: {
errorDetails: true
}
}
10. 新的 WebAssembly 支持
改进了对 WebAssembly 的支持:
- 异步导入WebAssembly
- 支持WebAssembly as ESM
- 改进的WebAssembly集成
module.exports = {
experiments: {
asyncWebAssembly: true,
syncWebAssembly: true
}
}
11. 改进的长期缓存
通过确定性的模块 ID 和 chunk ID 生成算法:
module.exports = {
optimization: {
moduleIds: 'deterministic',
chunkIds: 'deterministic'
}
}
12. 更新的配置验证
更严格的配置验证:
module.exports = {
mode: 'production', // 必须指定 mode
entry: './src/index.js',
output: {
clean: true // 构建前清理输出目录的新选项
}
}
13. 改进的打包体积
优化了打包体积,移除了一些内部结构:
module.exports = {
optimization: {
minimize: true,
splitChunks: {
chunks: 'all',
minSize: 20000
}
}
}
14. 主要优势总结
- 性能提升:
- 持久化缓存提升构建速度
- 改进的 Tree Shaking
- 更优的长期缓存策略
- 开发体验:
- 内置资源模块处理
- 更好的错误提示
- 更严格的配置验证
- 新功能:
- 模块联邦支持微前端架构
- 原生支持
WebAssembly
- 支持
顶层 await
- 包体积优化:
- 移除自动的 Node.js polyfills
- 优化内部结构
- 更好的代码生成