在 webpack 中传递环境相关变量

IT技术 javascript webpack
2021-02-03 15:11:03

我正在尝试将 angular 应用程序从 gulp 转换为 webpack。在 gulp 中,我使用 gulp-preprocess 根据 NODE_ENV 替换 html 页面中的一些变量(例如数据库名称)。使用 webpack 实现类似结果的最佳方法是什么?

6个回答

有两种基本方法可以实现这一点。

定义插件

new webpack.DefinePlugin({
    'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
}),

请注意,这只会“按原样”替换匹配项。这就是字符串采用其格式的原因。你可以有一个更复杂的结构,比如一个对象,但你明白了。

环境插件

new webpack.EnvironmentPlugin(['NODE_ENV'])

EnvironmentPluginDefinePlugin内部使用并通过它将环境值映射到代码。更简洁的语法。

别名

或者,您可以通过别名module使用配置从消费者方面来看,它看起来像这样:

var config = require('config');

配置本身可能如下所示:

resolve: {
    alias: {
        config: path.join(__dirname, 'config', process.env.NODE_ENV)
    }
}

让我们说process.env.NODE_ENVdevelopment它会映射到./config/development.js那时。它映射到的module可以像这样导出配置:

module.exports = {
    testing: 'something',
    ...
};
@tybro0103JSON.stringify('development')原样可能不是很有用。反而JSON.stringify(someVariable)可以!
2021-03-11 15:11:03
不得不说,决心“把戏”是辉煌的。我将 resolve 用于硬编码的本地包,但从未想过将其用于外部输入。现在我可以动态传入外部配置目录。谢谢!
2021-03-14 15:11:03
如果您使用的是 ES2015,您还可以使用字符串插值 - 'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
2021-03-29 15:11:03
你应该开始NODE_ENV这样做。如何设置取决于您的平台。
2021-04-05 15:11:03
感谢您指出它“按原样”替换匹配项的事实。我挣扎了一段时间想弄清楚为什么我的代码会抛出错误,这是因为我没有将值包装在JSON.stringify()
2021-04-09 15:11:03

只是另一种选择,如果您只想使用 cli 界面,只需使用definewebpack选项。我在我的中添加以下脚本package.json

"build-production": "webpack -p --define process.env.NODE_ENV='\"production\"' --progress --colors"

所以我只需要跑npm run build-production

对于 webpack@2,"-p" 已经是 --optimize-minimize --define process.env.NODE_ENV="production" 的快捷方式
2021-04-01 15:11:03
@okm 文档提到 -p 等于 --optimize-minimize --optimize-occurence-order,所以没有提到 --define process.env.NODE_ENV="production"。是不是有什么东西被删了?
2021-04-04 15:11:03
@NaderHadjiGhanbari 它在 webpack 版本 2 webpack.js.org/api/cli/#shortcuts 中
2021-04-08 15:11:03
有这方面的文件吗?我不能谷歌 --define :(
2021-04-09 15:11:03

我研究了几个关于如何设置特定于环境的变量的选项,最后得到了这个:

我目前有 2 个 webpack 配置:

webpack.production.config.js

new webpack.DefinePlugin({
  'process.env':{
    'NODE_ENV': JSON.stringify('production'),
    'API_URL': JSON.stringify('http://localhost:8080/bands')
  }
}),

webpack.config.js

new webpack.DefinePlugin({
  'process.env':{
    'NODE_ENV': JSON.stringify('development'),
    'API_URL': JSON.stringify('http://10.10.10.10:8080/bands')
  }
}),

在我的代码中,我以这种(简短的)方式获取 API_URL 的值:

const apiUrl = process.env.API_URL;

编辑 2016 年 11 月 3 日

Webpack 文档有一个例子:https ://webpack.js.org/plugins/define-plugin/#usage

new webpack.DefinePlugin({
    PRODUCTION: JSON.stringify(true),
    VERSION: JSON.stringify("5fa3b9"),
    BROWSER_SUPPORTS_HTML5: true,
    TWO: "1+1",
    "typeof window": JSON.stringify("object")
})

使用ESLint,如果您有no-undef规则,您需要在代码中明确允许未定义的变量http://eslint.org/docs/rules/no-undef像这样:

/*global TWO*/
console.log('Running App version ' + TWO);

编辑 2017 年 9 月 7 日(特定于 Create-React-App)

如果您不想配置太多,请查看 Create-React-App:Create-React-App - 添加自定义环境变量在幕后,CRA 无论如何都使用 Webpack。

什么是过程?它来自哪里?如果它是一个节点对象,它如何进入浏览器?
2021-03-11 15:11:03
@thevangelist 我终于想出了一个简单的解决方案,我的前提是为什么会有多个webpack.config.js文件,webpack应该根据环境cmd webpack调用加载不同的json配置,这里是我的解决方案github.com/Sweetog /yet-another-angular2-boilerplate
2021-03-18 15:11:03
您是否发现这会阻止在运行时传入任何环境变量?如果您替换整个,process.env那么process.env.PORT例如undefined在 webpack 构建期间不会解析为,这意味着您不能再从环境中覆盖端口?
2021-03-23 15:11:03
这是一个糟糕的解决方案,除了设置 NODE_ENV 和 API_URL 之外,你有两个几乎完全相同的 webpack.configs
2021-03-23 15:11:03
@BrianOgden 是的,确实如此,您应该为此使用 webpack-merge 之类的东西:npmjs.com/package/webpack-merge - 这个问题有点超出 IMO 的范围。
2021-03-24 15:11:03

你可以通过任何命令行参数,无需额外的插件使用--env以来的WebPack 2:

webpack --config webpack.config.js --env.foo=bar

使用 webpack.config.js 中的变量:

module.exports = function(env) {
    if (env.foo === 'bar') {
        // do something
    }
}

来源

请注意,-- env 语法似乎在 webpack 5 中的某个时候发生了变化:npx webpack --env goal=local
2021-03-16 15:11:03

在转译过程中,您可以直接使用EnvironmentPluginavailable inwebpack来访问任何环境变量。

你只需要在你的webpack.config.js文件中声明插件

var webpack = require('webpack');

module.exports = {
    /* ... */
    plugins = [
        new webpack.EnvironmentPlugin(['NODE_ENV'])
    ]
};

请注意,您必须明确声明要使用的环境变量的名称。

小错别字:不是plugins = [但是plugins: [
2021-03-15 15:11:03
webpack 文档中有一个关于这个用例的例子。github.com/webpack/docs/wiki/list-of-plugins#environmentplugin
2021-03-17 15:11:03
如果要将环境变量放在 .env 文件中,可以使用 dotenv 包并在 webpack.config.js 中对其进行初始化。npmjs.com/package/dotenv
2021-04-03 15:11:03