我可以在 webpack 4 中使用 NODE_ENV="staging" 和 mode="production" 吗?

Posted

技术标签:

【中文标题】我可以在 webpack 4 中使用 NODE_ENV="staging" 和 mode="production" 吗?【英文标题】:Can I use NODE_ENV="staging" with mode="production" in webpack 4? 【发布时间】:2018-08-06 14:44:37 【问题描述】:

我的应用使用 NODE_ENV 来决定应该向哪个 api 服务器请求。

NODE_ENV="production" => https://api.***/
NODE_ENV="staging" => https://api.staging-***/
NODE_ENV="development" => http://localhost:3000/

我想使用 mode="production" 构建暂存包,但保留 NODE_ENV="staging"。

我尝试使用下面的配置进行构建,但 bundle.js 变成了 NODE_ENV="production"。


   mode: "production",
   plugins: [
     new webpack.DefinePlugin(
       'process.env': 
         'NODE_ENV': JSON.stringify("staging")
       
     )
   ]
 

【问题讨论】:

【参考方案1】:

我认为您希望您的暂存构建像您的生产构建一样得到优化。据我所知,一些库(如React)会检查NODE_ENV === "production" 是否会放弃一些错误处理或提供进一步的优化。因此,如果您将NODE_ENV 设置为staging,他们会“认为”这是一个开发环境。

在这种情况下,我要做的就是使用不同的变量,例如:

package.json

"scripts": 
  "dev": "webpack-dev-server --config webpack.config.js --env.TARGET_ENV=development",
  "staging": "webpack --config webpack.config.js --env.TARGET_ENV=staging",
  "production": "webpack --config webpack.config.js --env.TARGET_ENV=production"
,

webpack.config.js

module.exports = (env) => 
  const mode = env.TARGET_ENV === 'development' ? 'development' : 'production';

  return 
    mode: mode,
    plugins: [
      new webpack.DefinePlugin(
        'process.env': 
          'TARGET_ENV': JSON.stringify(env.TARGET_ENV)
        
      )
    ]
    // ...rest of config based on environment
  ;
;

【讨论】:

我们如何确保 TARGET_ENV 在运行时可以访问?【参考方案2】:

Webpack-cli 已被弃用,带有 env 的语法将不再适用于 Webpack-command (https://github.com/webpack-contrib/webpack-command#the---env-flag-is-nuked)。

为了满足您的要求,我将使用一个简单的环境变量并以标准节点方式使用它

var API_URL = 
  production: JSON.stringify('https://foo.bar/api'),
  development: JSON.stringify('http://localhost:3000/api'),
  staging: JSON.stringify('http://foo.stage.bar/api')


module.exports = function(argv) 
  const TARGET = process.env.TARGET_ENV ? process.env.TARGET_ENV : 'development';
  return 
    mode: argv.mode ? argv.mode : 'development',
....
    new webpack.DefinePlugin(
        'API_URL': API_URL[TARGET]
    ),
....

然后像这样调用 webpack:

TARGET_ENV=staging webpack 

通过这种方式,您会发现您的环境变量 API_URL 在应用程序中全局定义。

我会避免通过定义插件重新定义 NODE_ENV。

【讨论】:

关于--env 的非常有用的链接!谢谢你。正如您所说,我最终定义了环境变量以及EnvironmentPlugin (webpack.js.org/plugins/environment-plugin)。工作得很好:) 可能值得注意的是 webpack-command 现在已弃用,而不是 webpack-cli--env 标志仍然是一件事,但看起来您仍然可以执行此答案中概述的操作。 webpack.js.org/api/cli/#cli-environment-variables

以上是关于我可以在 webpack 4 中使用 NODE_ENV="staging" 和 mode="production" 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 webpack 4 中使用 NODE_ENV="staging" 和 mode="production" 吗?

Webpack 4,Vue 同时使用 Typescript 类和 JS 代码。

使用 Angular 4+ 版本时,是不是有任何专业人士可以用 Parcel 替换 Webpack?

如何使用 webpack-4 解析 sass 文件中的背景图像 URL?

webpack 4.0 中 clean-webpack-plugin 的使用

在 Webpack 4 中,我们可以使用 import() 令牌动态生成页面块,以便我们可以将 react 组件转换为 react-loadable 吗?