[ webpack4 ] 配置属于自己的打包系统教程(最终篇)—— 环境配置篇
GitHub 完整配置文件地址: https://github.com/yhtx1997/w...
由于篇幅過長(zhǎng)分三次發(fā)布,建議按順序看
[ webpack4 ] 配置屬于自己的打包系統(tǒng)教程(一)—— 基礎(chǔ)配置篇
[ webpack4 ] 配置屬于自己的打包系統(tǒng)教程(二)—— 資源配置篇
[ webpack4 ] 配置屬于自己的打包系統(tǒng)教程(最終篇)—— 環(huán)境配置篇
環(huán)境配置篇
主要內(nèi)容
- 開發(fā)環(huán)境生產(chǎn)環(huán)境分離
- 實(shí)時(shí)預(yù)覽
- webpack-dev-server 其他常用
- 代碼復(fù)用處理
開發(fā)環(huán)境和生產(chǎn)環(huán)境
到了這一步,該講講開發(fā)環(huán)境模式和生產(chǎn)環(huán)境模式了
- 開發(fā)環(huán)境是自己開發(fā)時(shí)用的,需要有實(shí)時(shí)編譯功能、模塊熱替換功能(更新文件不用完全更新頁面)、錯(cuò)誤提示到具體哪個(gè)文件幾行
- 生產(chǎn)環(huán)境是放到線上給用戶使用的,需要代碼壓縮功能
配置代碼組件化
我們先把之前配置好的 webpack 配置文件改下名,改名 webpack.common.js ,意思是開發(fā)環(huán)境和生產(chǎn)環(huán)境都需要的,將代碼壓縮之類的挪到生產(chǎn)配置下
之后安裝 webpack-merge ,官方推薦的是為每個(gè)環(huán)境寫單獨(dú)的 webpack 文件
雖然有簡(jiǎn)單的方法實(shí)現(xiàn)但是依然推薦寫單獨(dú)的配置文件,因?yàn)樵谶@樣的配置方式你可以更清楚你自己在做什么,還可以讓你的配置更加個(gè)性(自定義)
安裝 webpack-merge
npm install webpack-merge -D新建開發(fā)環(huán)境配置
我們新建一個(gè) js 文件,命名為 webpack.dev.js ,添加如下代碼
const merge = require('webpack-merge');//合并配置 const common = require('./webpack.common.js');//引入公共配置module.exports = merge(common, {mode: 'development',//聲明是開發(fā)環(huán)境//關(guān)于 dev 的配置})新建開發(fā)環(huán)境配置
我們新建一個(gè) js 文件,命名為 webpack.prod.js
添加如下代碼
const merge = require('webpack-merge');//合并配置 const UglifyJSPlugin = require('uglifyjs-webpack-plugin');//用來壓縮 js 代碼 const common = require('./webpack.common.js');//引入公共配置module.exports = merge(common, {mode: 'production',//聲明是生產(chǎn)環(huán)境//關(guān)于 prod 的配置 });開發(fā)環(huán)境
實(shí)時(shí)預(yù)覽
跟著配置并操作的小伙伴可能發(fā)現(xiàn)了,每次修改后都需要手動(dòng)在命令行輸入命令,并且還要刷新瀏覽器才能看到最新的效果
那么現(xiàn)在來解決這兩個(gè)問題,方法就是使用 webpack-dev-server
安裝
npm install webpack-dev-server -D配置
- 實(shí)時(shí)預(yù)覽
- 自定義請(qǐng)求代理
- 自定義 ip 及端口
- 注:使用 webpack-dev-server 并不會(huì)編譯到本地文件,而是放到內(nèi)存中
接下來加入錯(cuò)誤提示以及將生成 HTML 的代碼從公共配置( webpack.common.js )拿到這里
因?yàn)殚_發(fā)和生產(chǎn)有些許不一樣,我又不知道怎樣簡(jiǎn)單配置,所以開發(fā)環(huán)境和生產(chǎn)環(huán)境我都會(huì)放一個(gè)生成 HTML 的代碼
生產(chǎn)環(huán)境
- 每次打包都要清理掉舊文件
- 所有代碼都要進(jìn)行壓縮
- 重復(fù)的 js 代碼,需要只有一個(gè)就好
文件清理
從公共配置( webpack.common.js )將之前文件清理的代碼拿過來放到這里
const merge = require('webpack-merge'); const common = require('./webpack.common.js'); const CleanWebpackPlugin = require('clean-webpack-plugin');module.exports = merge(common, {mode: 'production',plugins: [new CleanWebpackPlugin(['dist']),new HtmlWebpackPlugin({title: '2048',template: './src/index.html',minify: true,//HTML 代碼壓縮hash: true}),], })代碼壓縮
先安裝壓縮代碼的插件
npm install uglifyjs-webpack-plugin -D npm install optimize-css-assets-webpack-plugin -D- uglifyjs-webpack-plugin 是 js 壓縮插件
- optimize-css-assets-webpack-plugin 是推薦和
復(fù)用代碼分離
假設(shè)需要使用 jQuery 來輔助開發(fā),我在 a.js b.js 兩個(gè)文件都引入了 jQuery ,將 a.js b.js 打包成 a.min.js b.min.js ,這時(shí)看他們的體積會(huì)比原來大很多,且 a 和 b 的代碼中都包含完整的 jQuery 代碼
為了解決這種情況,我們需要將 jQuery 這種復(fù)用的代碼分離到單獨(dú)的文件
在將環(huán)境設(shè)置為生產(chǎn)環(huán)境時(shí)默認(rèn)開啟了很多功能,其中 SplitChunksPlugin 就是用于避免重復(fù)依賴的
在我們不配置時(shí) 默認(rèn)配置是這樣的
optimization: {splitChunks: {chunks: 'async', minSize: 30000,minChunks: 1,}}- chunks: 表示哪些代碼需要優(yōu)化,有三個(gè)可選值:initial(初始?jí)K)、async(按需加載塊)、all(全部塊),默認(rèn)為async 改成 all 支持所有的
- minSize: 這個(gè)文件最少是多少才去優(yōu)化,默認(rèn)為 30000 實(shí)際測(cè)試是文件大于 30 kb,在 31kb時(shí)開始優(yōu)化
- minChunks: 最少引用幾次才去優(yōu)化,默認(rèn)為1 實(shí)際測(cè)試為在只引用一次的情況不優(yōu)化,只有大于它才優(yōu)化
- 注: 還有其他屬性個(gè)人感覺不常用就沒寫,了解更多可以看這里
最終代碼匯總
最終公共配置 webpack.common.js 代碼如下
const path = require('path'); const MiniCssExtractPlugin = require("mini-css-extract-plugin");module.exports = {entry: {512:'./src/js/512.js',1024:'./src/js/1024.js',2048:'./src/js/2048.js',},plugins: [new MiniCssExtractPlugin({filename: "css/[name].css"})],output: {filename: "js/[name].js",path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.js$/,exclude: /(node_modules|bower_components)/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env']}}},{test: /\.scss$/,use: [MiniCssExtractPlugin.loader,'css-loader','postcss-loader','sass-loader',]},{test: /\.(png|svg|jpg|gif)$/,use: ['file-loader']},{test: /\.(woff|woff2|eot|ttf|otf)$/,use: ['file-loader']},{test: /\.(csv|tsv)$/,use: ['csv-loader']},{test: /\.xml$/,use: ['xml-loader']}]},}最終開發(fā)環(huán)境 webpack.dev.js 代碼如下
const merge = require('webpack-merge'); const common = require('./webpack.common.js'); const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = merge(common, {mode: 'development',plugins: [new HtmlWebpackPlugin({title: '2048',template: './src/index.html',minify: false,hash: true})],devtool: 'inline-source-map',devServer: {contentBase: path.join(__dirname, 'dist'),host: 'localhost',port: 8080,proxy: {'/api': 'http://localhost:3000'}}})最終生產(chǎn)環(huán)境 webpack.prod.js 代碼如下
const merge = require('webpack-merge'); const common = require('./webpack.common.js'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin');module.exports = merge(common, {mode: 'production',plugins: [new CleanWebpackPlugin(['dist']),new HtmlWebpackPlugin({title: '2048',template: './src/index.html',minify: true,hash: true}),],optimization: {splitChunks: {chunks: 'all'},minimizer: [new UglifyJsPlugin({cache: true,parallel: true,sourceMap: true }),new OptimizeCSSAssetsPlugin({})],} });npm 項(xiàng)目配置代碼 package.json 代碼如下
{"name": "2048","version": "1.0.0","description": "","private": true,"main": "index.js","scripts": {"dev": "webpack-dev-server --open --config webpack.dev.js","build": "webpack --config webpack.prod.js"},"keywords": [],"author": "","license": "ISC","dependencies": {"webpack": "^4.28.3"},"devDependencies": {"@babel/core": "^7.2.2","@babel/preset-env": "^7.2.3","autoprefixer": "^9.4.3","babel-loader": "^8.0.4","clean-webpack-plugin": "^1.0.0","css-loader": "^2.1.0","csv-loader": "^3.0.2","extract-text-webpack-plugin": "^4.0.0-beta.0","file-loader": "^3.0.1","html-webpack-plugin": "^3.2.0","mini-css-extract-plugin": "^0.5.0","node-sass": "^4.11.0","optimize-css-assets-webpack-plugin": "^5.0.1","postcss": "^7.0.7","postcss-loader": "^3.0.0","sass-loader": "^7.1.0","style-loader": "^0.23.1","uglifyjs-webpack-plugin": "^2.1.1","webpack-cli": "^3.1.2","webpack-dev-server": "^3.1.14","webpack-merge": "^4.1.5","xml-loader": "^1.2.1"} }總結(jié)
以上是生活随笔為你收集整理的[ webpack4 ] 配置属于自己的打包系统教程(最终篇)—— 环境配置篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 他们
- 下一篇: Canvas实用库Fabric.js使用