环境分离
环境分离可以分别提供
- 给开发时候使用的开发的配置
- 提供给真正生产时产生最终用户访问的文件的打包配置
生产环境和开发环境刚好相反,开发环境在本地运行,而生产环境是要产出运行在线上服务器面向最终用户使用的代码,因此两者的构建目标差异很大,比如打包后的文件在生产环境中要尽可能的小,逻辑代码分离,优化静态资源(压缩图片),去除错误追踪 source map文件等, 也不需要提供 webpack-dev-server 开发服务器。
因此开发环境和生产环境不要共用一份webpack配置文件,需要分别指定
但是两个环境还是有很多配置可以共用的,比如entry、output、module等,因此可以把公共部分的配置抽离出来放到一个独立的文件然后进行合并,我们可以使用webpack-merge工具来进行合并。
注意:entry、output、module这些配置在我们当前示例可以通用,但未必适合所有项目。
安装依赖
npm install --save-dev webpack-merge
开始拆分webpack.config.js文件,拆分后该文件可废弃。https://blog.csdn.net/NI_chunz/article/details/106850682
新建config文件夹:
- webpack-demo
- config // 存放配置文件的文件夹
- webpack.base.js // 公共的配置
- webpack.dev.js // 开发环境的配置
- webpack.prod.js // 生成环境的配置
1 | - // 其他文件 |
配置文件
config/webpack.base.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | const path = require("path"); const ExtractTextPlugin = require("extract-text-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { // 入口 entry: "./src/index.js", // 输出 output: { filename: "bundle.js", path: path.resolve(__dirname, "../dist") // 注意此处输出目录是父级文件夹 }, // 模块加载器 module: { rules: [ { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: ["css-loader"] }) }, { test: /\.less$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: ["css-loader", "less-loader"] }) }, { test: /\.(png|svg|jpg|gif)$/, use: [ { loader: "file-loader", options: { publicPath: "./images/", outputPath: "images" } } ] } ] }, plugins: [ // 提取css样式到单独文件 new ExtractTextPlugin("style/style2.css"), // 每次构建前清除dist目录 new CleanWebpackPlugin(), // 自动生成index.html到dist new HtmlWebpackPlugin({ template: "public/index.html" }), ] } |
webpack.dev.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | const merge = require('webpack-merge'); const base = require('./webpack.base.js'); module.exports = merge(base, { mode: "development", // 生成map映射文件 devtool: "source-map", // 开发服务器配置 devServer: { port: 8000 // 默认端口是8080 }, }) webpack.prod.js const merge = require('webpack-merge'); const base = require('./webpack.base.js'); module.exports = merge(base, { mode: "production" }) |
注意:拆分完webpack.config.js后可以把该文件删除了。
修改scripts启动命令,注意指定配置文件路径
package.json
1 2 3 4 5 6 7 8 9 10 | { // 其他配置 "scripts": { "build": "webpack --config ./config/webpack.prod.js", "dev": "webpack-dev-server --config ./config/webpack.dev.js --open" }, // 其他配置 } |
OK!以后开发的话就使用npm run dev命令,需要打包上线就运行npm run build,把dist目录丢给运维的同事部署即可(当然现在的项目工程里都有自动化部署了)。