DefinePlugin

DefinePlugin 允许创建一个在编译时可以配置的全局常量。这可能会对开发模式和生产模式的构建允许不同的行为非常有用。如果在开发构建中,而不在发布构建中执行日志记录,则可以使用全局常量来决定是否记录日志。这就是 DefinePlugin 的用处,设置它,就可以忘记开发环境和生产环境构建的规则。

  1. new webpack.DefinePlugin({
  2. // Definitions...
  3. });

用法

每个传进 DefinePlugin 的键值都是一个标志符或者多个用 . 连接起来的标志符。

  • 如果这个值是一个字符串,它会被当作一个代码片段来使用。
  • 如果这个值不是字符串,它会被转化为字符串(包括函数)。
  • 如果这个值是一个对象,它所有的 key 会被同样的方式定义。
  • 如果在一个 key 前面加了 typeof,它会被定义为 typeof 调用。

这些值会被内联进那些允许传一个代码压缩参数的代码中,从而减少冗余的条件判断。

  1. new webpack.DefinePlugin({
  2. PRODUCTION: JSON.stringify(true),
  3. VERSION: JSON.stringify('5fa3b9'),
  4. BROWSER_SUPPORTS_HTML5: true,
  5. TWO: '1+1',
  6. 'typeof window': JSON.stringify('object'),
  7. 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
  8. });
  1. console.log('Running App version ' + VERSION);
  2. if(!BROWSER_SUPPORTS_HTML5) require('html5shiv');

When defining values for process prefer 'process.env.NODE_ENV': JSON.stringify('production') over process: { env: { NODE_ENV: JSON.stringify('production') } }. Using the latter will overwrite the process object which can break compatibility with some modules that expect other values on the process object to be defined.

注意,因为这个插件直接执行文本替换,给定的值必须包含字符串本身内的实际引号。通常,有两种方式来达到这个效果,使用 '"production"', 或者使用 JSON.stringify('production')

index.js

  1. if (!PRODUCTION) {
  2. console.log('Debug info');
  3. }
  4. if (PRODUCTION) {
  5. console.log('Production log');
  6. }

通过没有使用压缩的 webpack 的结果:

  1. if (!true) {
  2. console.log('Debug info');
  3. }
  4. if (true) {
  5. console.log('Production log');
  6. }

通过使用压缩的 webpack 的结果:

  1. console.log('Production log');

功能标记(Feature Flags)

使用功能标记来「启用/禁用」「生产/开发」构建中的功能。

  1. new webpack.DefinePlugin({
  2. 'NICE_FEATURE': JSON.stringify(true),
  3. 'EXPERIMENTAL_FEATURE': JSON.stringify(false)
  4. });

服务 URL(Service URL)

在生产/开发构建中使用不同的服务 URL(Service URL):

  1. new webpack.DefinePlugin({
  2. 'SERVICE_URL': JSON.stringify('http://dev.example.com')
  3. });

贡献人员

EugeneHlushko EugeneHlushko byzyk byzyk rouzbeh84 rouzbeh84 simon04 simon04 smonusbonus smonusbonus