我正在尝试将一个angular应用程序从gulp转换为webpack。在gulp中,我使用gulp预处理来替换html页面中的一些变量(例如数据库名称),这取决于NODE_ENV。用webpack实现类似结果的最佳方法是什么?
当前回答
现在2020年,我也面临着同样的问题,但是对于这个老问题,有很多新的答案,就列举一些吧:
这是webpack.config.js
plugins: [
new HtmlWebpackPlugin({
// 1. title is the parameter, you can use in ejs template
templateParameters:{
title: JSON.stringify(someting: 'something'),
},
}),
//2. BUILT_AT is a parameter too. can use it.
new webpack.DefinePlugin({
BUILT_AT: webpack.DefinePlugin.runtimeValue(Date.now,"some"),
}),
//3. for webpack5, you can use global variable: __webpack_hash__
//new webpack.ExtendedAPIPlugin()
],
//4. this is not variable, this is module, so use 'import tt' to use it.
externals: {
'ex_title': JSON.stringify({
tt: 'eitentitle',
})
},
这4种方法只是基本的,我相信还有更多的方法。但我认为这是最简单的方法。
其他回答
这是另一个类似于@zer0chain的答案的答案。但是,有一个区别。
设置webpack -p就足够了。
即:
--define process.env.NODE_ENV="production"
这就等于
// webpack.config.js
const webpack = require('webpack');
module.exports = {
//...
plugins:[
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
})
]
};
所以你可能只需要打包这样的东西。json节点文件:
{
"name": "projectname",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"debug": "webpack -d",
"production": "webpack -p"
},
"author": "prosti",
"license": "ISC",
"dependencies": {
"webpack": "^2.2.1",
...
}
}
下面是一些来自DefinePlugin的提示:
DefinePlugin允许您创建可以在编译时配置的全局常量。这对于允许开发构建和发布构建之间的不同行为是有用的。例如,您可以使用一个全局常量来确定是否进行日志记录;也许您在开发构建中执行日志记录,但在发布构建中不执行。这就是DefinePlugin所促进的那种场景。
这样你就可以检查你是否输入webpack -help
Config options:
--config Path to the config file
[string] [default: webpack.config.js or webpackfile.js]
--env Enviroment passed to the config, when it is a function
Basic options:
--context The root directory for resolving entry point and stats
[string] [default: The current directory]
--entry The entry point [string]
--watch, -w Watch the filesystem for changes [boolean]
--debug Switch loaders to debug mode [boolean]
--devtool Enable devtool for better debugging experience (Example:
--devtool eval-cheap-module-source-map) [string]
-d shortcut for --debug --devtool eval-cheap-module-source-map
--output-pathinfo [boolean]
-p shortcut for --optimize-minimize --define
process.env.NODE_ENV="production"
[boolean]
--progress Print compilation progress in percentage [boolean]
dotenv-webpack
一个安全的webpack插件,支持dotenv和其他环境变量,只公开您选择和使用的内容。
通过一些基于默认选项的配置解决方案来实现这一点,一旦包有.env.defaults文件作为env变量的初始值,您就可以在开发中使用它,并让.env用于生产。
使用
安装包
npm install dotenv-webpack --save-dev
创建一个.env.defaults文件
API_URL='dev_url/api/'
创建一个.env文件,保留它为空,使用默认值,在部署过程中更新它 配置webpack - webpack. Config .js
new Dotenv({
defaults: true
})
开发环境测试文件。js
console.log(process.env.API_URL)
// Outputs: dev_url/api/
在构建时,更新空的.env文件
API_URL='prod_url/api/'
Dotenv-webpack将使用这个来覆盖env.defaults
产品环境测试文件。js
console.log(process.env.API_URL)
// Outputs: prod_url/api/
dotenv-webpack dotenv-defaults
你可以使用——env传递环境变量,而不需要额外的插件
Webpack -
webpack --config webpack.config.js --env.foo=bar
Webpack 5+(无)
webpack --config webpack.config.js --env foo=bar
然后,使用webpack.config.js中的变量:
module.exports = function(env) {
if (env.foo === 'bar') {
// do something
}
}
进一步阅读:Webpack 2.0不支持自定义命令行参数? # 2254
这里有一种方法,对我来说是有效的,并允许我通过重用json文件保持我的环境变量DRY。
const webpack = require('webpack');
let config = require('./settings.json');
if (__PROD__) {
config = require('./settings-prod.json');
}
const envVars = {};
Object.keys(config).forEach((key) => {
envVars[key] = JSON.stringify(config[key]);
});
new webpack.DefinePlugin({
'process.env': envVars
}),
我发现下面的解决方案是最容易为Webpack 2设置环境变量:
例如,我们有一个webpack设置:
var webpack = require('webpack')
let webpackConfig = (env) => { // Passing envirmonment through
// function is important here
return {
entry: {
// entries
},
output: {
// outputs
},
plugins: [
// plugins
],
module: {
// modules
},
resolve: {
// resolves
}
}
};
module.exports = webpackConfig;
在Webpack中添加环境变量:
plugins: [
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
}),
]
定义插件变量并将其添加到插件中:
new webpack.DefinePlugin({
'NODE_ENV': JSON.stringify(env.NODE_ENV || 'development')
}),
现在当运行webpack命令时,传递env。NODE_ENV作为参数:
webpack --env.NODE_ENV=development
// OR
webpack --env.NODE_ENV development
现在您可以在代码中的任何地方访问NODE_ENV变量。
推荐文章
- 节点和错误:EMFILE,打开的文件太多
- JavaScript函数中的默认参数值
- 使用RegExp.exec从字符串中提取所有匹配项
- 测试一个值是奇数还是偶数
- 空数组似乎同时等于true和false
- 它是可能的动画scrollTop与jQuery?
- 如何清除下拉框中的所有选项?
- 基于原型的继承与基于类的继承
- 我如何使一个HTML文本框显示空时提示?
- 如何隐藏谷歌隐形reCAPTCHA徽章
- 在JavaScript中调换2d数组
- 如何使用JavaScript停止浏览器后退按钮?
- 跟踪鼠标位置
- 如何获得<html>标签html与JavaScript / jQuery?
- 浏览器检测JavaScript?