我最终使用了类似于Matt Derrick' Answer 的东西,但担心两点:
- 每次使用时都会注入完整的配置
ENV
(这对大型配置不利)。
- 我必须定义多个入口点,因为
require(env)
指向不同的文件。
我想出的是一个简单的作曲家,它构建一个配置对象并将其注入到一个配置模块中。
这是我正在使用的文件结构:
config/
└── main.js
└── dev.js
└── production.js
src/
└── app.js
└── config.js
└── ...
webpack.config.js
main.js
包含所有默认配置内容:
// main.js
const mainConfig = {
apiEndPoint: 'https://api.example.com',
...
}
module.exports = mainConfig;
并且dev.js
仅production.js
包含覆盖主配置的配置内容:
// dev.js
const devConfig = {
apiEndPoint: 'http://localhost:4000'
}
module.exports = devConfig;
重要的部分是webpack.config.js
组成配置并使用DefinePlugin生成__APP_CONFIG__
包含组合配置对象的环境变量:
const argv = require('yargs').argv;
const _ = require('lodash');
const webpack = require('webpack');
// Import all app configs
const appConfig = require('./config/main');
const appConfigDev = require('./config/dev');
const appConfigProduction = require('./config/production');
const ENV = argv.env || 'dev';
function composeConfig(env) {
if (env === 'dev') {
return _.merge({}, appConfig, appConfigDev);
}
if (env === 'production') {
return _.merge({}, appConfig, appConfigProduction);
}
}
// Webpack config object
module.exports = {
entry: './src/app.js',
...
plugins: [
new webpack.DefinePlugin({
__APP_CONFIG__: JSON.stringify(composeConfig(ENV))
})
]
};
最后一步现在是config.js
,它看起来像这样(这里使用 es6 import export 语法,因为它在 webpack 下):
const config = __APP_CONFIG__;
export default config;
在你的app.js
你现在可以import config from './config';
用来获取配置对象。