Webpack 中的 mode
是一个核心配置选项,用于指定构建模式(开发模式或生产模式),它会自动启用 Webpack 内置的优化策略。以下是详细解释:
1. mode
的作用
mode
允许你根据当前环境(开发或生产)启用不同的 Webpack 默认优化行为,包括:
- 代码压缩(如 TerserPlugin 压缩 JS)
- 作用域提升(Scope Hoisting,合并模块以减少代码体积)
- 开发工具支持(如 Source Map 生成)
- 环境变量注入(如
process.env.NODE_ENV
) - 性能优化(如移除调试代码)
2. mode
的可选值
-
development
(开发模式)- 特点:
- 不压缩代码,保留 Source Map。
- 优化构建速度,适合本地开发调试。
- 启用
NamedChunksPlugin
和NamedModulesPlugin
,保留模块名称便于调试。
- 示例:
// webpack.config.js module.exports = { mode: 'development', };
- 特点:
-
production
(生产模式)- 特点:
- 启用代码压缩、Tree Shaking、作用域提升。
- 移除未使用的代码(Dead Code Elimination)。
- 禁用开发工具(如 Source Map 默认关闭)。
- 自动设置
process.env.NODE_ENV
为'production'
。
- 示例:
module.exports = { mode: 'production', };
- 特点:
-
none
(无模式)- 特点:
- 禁用所有默认优化行为。
- 完全由开发者手动配置所有插件和优化项。
- 特点:
3. 如何设置 mode
方式 1:配置文件
在 webpack.config.js
中直接指定:
module.exports = {
mode: 'production', // 或 'development' / 'none'
};
方式 2:命令行参数
通过 --mode
标志传递:
webpack --mode=production
4. mode
的底层行为
-
development
模式:- 默认启用
devtool: 'eval'
(快速 Source Map)。 - 设置
process.env.NODE_ENV
为'development'
。 - 禁用性能优化(如代码压缩)。
- 默认启用
-
production
模式:- 默认启用
devtool: false
(无 Source Map)。 - 设置
process.env.NODE_ENV
为'production'
。 - 启用
TerserPlugin
压缩 JS 和 CSS。 - 启用
ModuleConcatenationPlugin
(作用域提升)。
- 默认启用
5. 实际应用场景
场景 1:区分开发与生产环境
// webpack.config.js
module.exports = {
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
};
场景 2:自定义优化策略
若默认优化不满足需求,可在 mode
基础上手动配置:
module.exports = {
mode: 'production',
optimization: {
minimize: false, // 覆盖默认的压缩行为
},
};
场景 3:跨环境变量传递
通过 mode
自动注入 process.env.NODE_ENV
,代码中可直接使用:
if (process.env.NODE_ENV === 'development') {
console.log('开发模式');
}
6. 注意事项
- 优先级:命令行参数
--mode
会覆盖配置文件中的mode
。 - 兼容性:Webpack 4+ 支持
mode
,旧版本需手动配置插件(如UglifyJsPlugin
)。 - 扩展性:若需更复杂的配置,建议结合
webpack-merge
分环境管理配置。
总结
mode
的本质:一种快速启用预设优化的方式,避免手动配置重复插件。- 开发模式:关注构建速度和调试体验。
- 生产模式:关注代码体积和运行性能。
- 灵活使用:可通过
mode
+ 自定义配置实现精细化构建控制。