区分环境
[TOC]
试想,以我们现在的知识,能否区分环境呢?
自己实现的区分环境的方法
答案是可以的,因为我们可以使用webpack --config xxx.js
来指定让webpack加载哪个配置文件。
于是,我们可以创建
js
webpack.config.js //存放两个环境的公共配置
webpack.dev.js //存放dev环境的配置
webpack.prod.js //存档prod环境的配置
那么,怎么让webpack在不同的环境下加载不同的文件呢?
package.json
json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "webpack --config webpack.dev.js", //开发环境加载webpack.dev.js
"build": "webpack --config webpack.prod.js" //生产加载webpack.prod.js
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10"
}
}
webpack区分环境
有些时候,我们需要针对生产环境和开发环境分别书写webpack配置
为了更好的适应这种要求,webpack允许配置不仅可以是一个对象,还可以是一个函数
js
module.exports = env => {
return {
//配置内容
}
}
在开始构建时,webpack如果发现配置是一个函数,会调用该函数,将函数返回的对象作为配置内容,因此,开发者可以根据不同的环境返回不同的对象
在调用webpack函数时,webpack会向函数传入一个参数env,该参数的值来自于webpack命令中给env指定的值,例如
shell
npx webpack --env abc # env: "abc"
npx webpack --env.abc # env: {abc:true}
npx webpack --env.abc=1 # env: {abc:1}
npx webpack --env.abc=1 --env.bcd=2 # env: {abc:1, bcd:2}
这样一来,我们就可以在命令中指定环境,在代码中进行判断,根据环境返回不同的配置结果。
最佳实践
新建文件
js
webpack.config.js //存放两个环境的公共配置
webpack.dev.js //存放dev环境的配置
webpack.prod.js //存档prod环境的配置
webpack.config.js //实际上webpack还是加载的这个配置文件
webpack.common.js
js
// 存放webpack的公共配置
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist/scripts"),
filename: "[name]-[hash:5].js",
},
};
webpack.dev.js
js
module.exports = {
mode: "development",
devtool: "source-map",
};
webpack.prod.js
js
module.exports = {
mode: "production",
devtool: "none",
};
webpack.config.js
js
const commonConfig = require("./webpack.common.js");
const devConfig = require("./webpack.dev.js");
const proConfig = require("./webpack.prod.js");
//将webpack导出的配置更改为函数,env是在命令行时传入的
module.exports = (env) => {
console.log("环境", env);//{production:true}
if (env && env.production) {
//加载生产环境配置文件
return {
...commonConfig,
...proConfig,
};
} else {
//加载开发环境配置文件
return {
...commonConfig,
...devConfig,
};
}
};
package.json
json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "webpack",
"build": "webpack --env.production"//给webpack.config.js的env参数指定值
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10"
}
}