在我的情况下,我有许多环境需要支持,例如:
.env.local
,
.env.dev
等等。我已经解决了将特定环境的环境文件加载到webpack配置中的问题,具体步骤如下:
步骤1:为特定环境创建一个文件 - 例如:.env.local
API_HOST=127.0.0.1
API_KEY=mysecretkey
...
第二步:创建一个适用于所有环境的webpack配置文件 - webpack.common.js
...
...
const webpack = require('webpack')
const dotenv = require('dotenv')
...
...
module.exports = env => {
return {
resolve: {...},
devServer: {...},
module: {...},
plugins: [
new webpack.DefinePlugin(
{'process.env': JSON.stringify(dotenv.config(path: env.ENV_FILE}).parsed)})
}
}
这里需要注意的重要事项是,
module.exports
应该返回一个函数而不是一个对象,这样它才能访问由环境特定的webpack配置文件传递的环境变量(例如这个例子中的
ENV_FILE
),比如
webpack.local.js
(步骤3)。
步骤3:创建一个环境特定的webpack配置文件 - webpack.local.js
const { merge } = require('webpack-merge')
const common = require('./webpack.common')
module.exports = env => merge(common(env), {
mode: 'development',
output: {
publicPath: 'http://localhost:3000',
},
devtool: 'inline-source-map',
devServer: {
watchFiles: ['src/**/*'],
hot: true,
port: 3000
},
})
在这个特定环境的文件中,webpack.common.js文件被导入为一个函数(const common),该函数在webpack merge的过程中使用env参数进行调用。这里的env参数是通过package.json中webpack命令的--env选项填充的(步骤4)。
第4步:在package.json中设置webpack命令。
"scripts": {
"start": "webpack serve --open --env ENV_FILE=.env.local --config webpack.local.js",
"build:prod": "webpack --env ENV_FILE=.env.prod --config webpack.prod.js"
...
}
这里的npm命令`start`会使用`webpack.local.js`作为webpack配置来启动一个本地web服务器。当调用进入`webpack.local.js`时,它会将`ENV_FILE`键填充到由`module.exports`返回的函数的`env`参数中。
类似地,您可以设置`webpack.prod.js`,它可以根据上述`webpack.local.js`的示例来针对您的生产环境进行特定配置。