webpack优化之optimization.nodeEnv

本文介绍如何在Webpack中移除开发环境的检查代码,通过设置优化选项或使用DefinePlugin插件,减少打包体积,提高生产环境的性能。

1、前言:我们知道,在几乎所有框架中都有许多开发环境的代码检查和警告类型的代码,而这些代码在生产环境不是必须的。但是打包的时候会将这些代码保留下来,增加了打包的尺寸。

例如vue源码

// vue/dist/vue.runtime.esm.js
// …
if (process.env.NODE_ENV !== 'production') {
  warn('props must be strings when using array syntax.');
}
// …

2、消除检查警告代码

在webpack4中,通过设置optimization.nodeEnv="production"来移除这些代码

// webpack.config.js (for webpack 4)
module.exports = {
  optimization: {
    nodeEnv: 'production',
    minimize: true,
  },
};

在webpack3或以下可以通过DefinePlugin插件实现

// webpack.config.js (for webpack 3)
const webpack = require('webpack');

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': '"production"',
    }),
    new webpack.optimize.UglifyJsPlugin(),
  ],
};

这两者的工作方式一样,在打包时将代码中的process.env.NODE_ENV替换成对应设置的值,如下

 // vue/dist/vue.runtime.esm.js
if (typeof val === 'string') {
  name = camelize(val);
  res[name] = { type: null };
} else if (process.env.NODE_ENV !== 'production') {
  warn('props must be strings when using array syntax.');
}

//替换后如下
// vue/dist/vue.runtime.esm.js
if (typeof val === 'string') {
  name = camelize(val);
  res[name] = { type: null };
} else if ("production" !== 'production') {
  warn('props must be strings when using array syntax.');
}

然后代码压缩插件会移除if分支里为false的代码,则上面的代码最终如下

// vue/dist/vue.runtime.esm.js (without minification)
if (typeof val === 'string') {
  name = camelize(val);
  res[name] = { type: null };
}

 

### `optimization.usedExports` 配置详解 在 Webpack 中,`optimization.usedExports` 用于启用 **Tree Shaking** 功能,其作用是标记出模块中未被使用的导出内容(export),以便在最终打包时移除这些无用代码。该配置适用于使用 ES Module 方式导入的模块。 当启用 `usedExports: true` 时,Webpack 会在打包过程中分析哪些 export 没有被实际使用,并在输出的代码中进行标记。例如,在开发模式下,可以看到注释中标明了“unused harmony export”字样 [^3]。这种机制为后续的优化步骤提供了依据。 ```javascript // webpack.config.js 示例 module.exports = { mode: 'development', optimization: { usedExports: true, }, }; ``` 需要注意的是,仅启用 `usedExports` 并不会自动删除未使用的代码。只有将构建模式设置为 `production` 时,Webpack 才会结合此信息自动执行代码清理操作 [^2]。 --- ### `optimization.sideEffects` 配置详解 `optimization.sideEffects` 是 Webpack 中控制是否移除具有副作用模块的选项。其默认值为 `false`,表示不尝试移除无副作用的模块。启用该功能后,Webpack 将根据项目中的 `package.json` 文件中声明的 `"sideEffects"` 字段来判断哪些文件可以安全地被优化。 - 如果整个项目没有任何副作用,可以在 `package.json` 中设置 `"sideEffects": false`。 - 如果某些文件(如 polyfill 或全局样式)确实存在副作用,则可以通过数组形式列出这些文件路径,例如 `"sideEffects": ["./src/polyfill.js"]` [^2]。 在 Webpack 配置中,开启 `sideEffects: true` 后,构建工具会尝试移除那些没有副作用且未被使用的模块,从而进一步减小最终包体积。 ```javascript // webpack.config.js 示例 module.exports = { mode: 'production', optimization: { sideEffects: true, }, }; ``` 需要注意的是,在 `production` 模式下,该功能默认是开启的,因此不需要显式配置即可生效 [^1]。 --- ### `package.json` 中的 `sideEffects` 与 Webpack 配置的区别 虽然两者都涉及副作用相关的优化逻辑,但它们的作用范围和语义有所不同: - `package.json` 中的 `sideEffects` 告知 Webpack 当前项目的模块是否包含副作用,默认为 `true`,即假设所有代码都有副作用。 - Webpack 配置中的 `optimization.sideEffects` 控制是否启用对无副作用模块的删除功能,默认为 `false`,即不主动移除无副作用代码 [^1]。 结合使用这两个配置可以实现更精细的 Tree Shaking 优化效果。 --- ### 综合示例 以下是一个完整的 Webpack 配置示例,展示了如何同时启用 `usedExports` 和 `sideEffects` 来最大化 Tree Shaking 效果: ```javascript // webpack.config.js const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { mode: 'production', devtool: 'source-map', plugins: [ new HtmlWebpackPlugin(), ], optimization: { usedExports: true, sideEffects: true, }, }; ``` 同时,在 `package.json` 中应明确声明副作用情况: ```json { "sideEffects": false } ``` 这样配置后,Webpack 将尽可能多地识别并移除未使用或无副作用的代码,从而显著减少最终输出文件的大小。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值