一次Webpack配置文件的分離實戰(zhàn)記錄
前言
隨著前端技術的發(fā)展,業(yè)務邏輯的增多及功能化的繁瑣已經(jīng)成為前端人員最燒腦的問題。前端自動化構建工具的出現(xiàn),為前端人員帶來了項目構建上的福音,成為每個前端工程師必回的技術棧,目前比較流行的Webpack以萬物皆模塊的思想構建我們的前端項目,同樣也是筆者正在使用的一個前端自動化構建工具。
Webpack對于每個前端人員來說都不會怎么陌生,它將每一個靜態(tài)文件當做一個模塊,經(jīng)過一系列的處理為我們整合出最后的需要的js、css、圖片、字體等文件。
webpack.config.js就是Webpack的配置文件,這個文件需要自己在項目根目錄下手動建立。
下面話不多說了,來一起看看詳細的介紹吧
單個配置文件所造成的問題
本文默認電腦前的你已經(jīng)了解一些Webpack基礎的配置,并懂得了webpack.config.js配置文件的基礎搭建。
隨著我們業(yè)務邏輯的增多,圖片、字體、css、ES6以及CSS預處理器和后處理器逐漸的加入到我們的項目中來,進而導致配置文件的增多,使得配置文件書寫起來比較繁瑣,更嚴重者(書寫特定文件的位置會出現(xiàn)錯誤)。更由于項目中不同的生產(chǎn)環(huán)境和開發(fā)環(huán)境的配置,使得配置文件變得更加糟糕。
使用單個的配置文件會影響到任務的可重用性,隨著項目需求的增長,我們必須要找到更有效地管理配置文件的方法。
管理配置文件的幾種方法
配置文件的管理有一下幾種方法。
- 在每個環(huán)境的多個文件中維護配置,并通過--config參數(shù)將webpack指向每個文件,通過模塊導入共享配置。
- 將配置文件推送到庫,然后引用庫。
- 將配置文件推送到工具。
- 維護單個配置文件的所有配置并在那里進行分支并依賴--env參數(shù)。
本文以第四種方式闡述webpack配置文件的分離。
分離配置文件
我們在根目錄下創(chuàng)建config文件夾,并創(chuàng)建四個配置文件,分別是:
- webpack.comm.js 公共環(huán)境的配置文件
- webpack.development.js 開發(fā)環(huán)境下的配置文件
- webpack.production.js 生產(chǎn)環(huán)境下的配置文件
- webpack.parts.js 各個配置零件的配置文件
合并配置文件的工具
如果配置文件被分成了許多不同的部分,那么必須以某種方式來組合他們,通常就是合并數(shù)組和對象,webpack-merge很好的做到了這一點。
webpack-merge做了兩件事:它允許連接數(shù)組并合并對象,而不是覆蓋組合。
const merge = require("webpack-merge"); merge( {a : [1],b:5,c:20}, {a : [2],b:10, d: 421} ) //合并后的結(jié)果 {a : [1,2] ,b :10 , c : 20, d : 421}
使用webpack-merge合并配置文件
首先將webpack-merge添加到項目中
npm install webpack-merge --save-dev
首先設置各個配置文件的連接
webpack.config.js
const commConfig = require("./config/webpack.comm"); const developmentConfig = requie("./config/webpack.development"); const productionConfig = require("./config/webpack.development") const merge = require("webpack-merge"); module.exports = mode => { if(mode === "production"){ return merge(commConfig,productionConfig,{mode}); } return merge(commConfig,developmentConfig,{mode}); }
上面代碼利用mode的值來判斷是開發(fā)環(huán)境還是生產(chǎn)環(huán)境
webpack.comm.js
const merge = require("webpack-merge"); const parts = require("./webpack.parts") //引入配置零件文件 const config = { //書寫公共配置 } module.exports = merge([ config, parts...... ])
webpack.production.js
const merge = require("webpack-merge"); const parts = require("./webpack.parts"); //引入配置零件文件 const config = { //書寫公共配置 } modules.exports = merge([ config, parts...... ])
webpack.development.js
const merge = require("webpack-merge"); const parts = require("./webpack.parts"); //引入配置零件文件 const config = { //書寫公共配置 } modules.exports = merge([ config, parts...... ])
使用--env值傳參
使用--env允許將字符串傳遞給配置。我們來修改下package.json
"dev": "webpack --env development ", "prod": "webpack --env production", "dev:server": "webpack-dev-server --env development "
這樣就使得env參數(shù)mode環(huán)境參數(shù)傳入到webpack.config.js中,就可以判斷是生產(chǎn)環(huán)境還是開發(fā)環(huán)境。
如何寫出可配置的webpack.parts.js
上面可以看出我們新建了一個webpack.parts.js文件,這個文件中主要是存放我們的一些配置零件。如何寫出可配置,可拔插的配置零件。就是我們這個文件的最重要的部分。
以loadCSS為例:
exports.loadCSS = ({reg = /\.css$/,include,exclude,uses = []} = {}) => ({ module : { rules:[{ test : reg, include, exclude, use[{ loader : "style-loader", },{ loader : "css-loader", }].concat(uses), }] } })
上面代碼中,利用exports導出單個配置零件,通過解構賦值來傳入?yún)?shù)。使用數(shù)組的concat來連接外部導入的loader。參數(shù)解析:
- reg:表示loader匹配的test正則,默認為css,這里可以是(less、sass、stylus)。
- include:表示所要打包的文件夾。
- exclude:表示要跳過打包的文件夾。
- uses:外部導入的loader。
在webpack.development.js中引入
module.exports = merge([ config, parts.loadCSS({ reg : /\.less/, use : ["less-loader"] }), parts.loadCSS(), ])
分離配置文件的好處
配置文件拆分可以是我們繼續(xù)擴展配置。最重要的收益是我們可以提取不同目標之間的共性。并且還可以識別要組合的較小配置部件,這些配置不見可以推送到自己的軟件包以跨項目使用。還可以將配置作為依賴項進行管理,而不是在多個項目中復制類似的配置。
我自己的parts配置
展示一部分我自己的部件配置,由于在學習階段,不足的地方還望大佬們提出,學習進步。
/** * @name 本地服務器配置 * @param host 打開的url * @param port 打開url的端口號 * */ exports.devServer = ({ host, port} = {}) => ({ devServer : { stats : "errors-only", host, port, open : true, overlay : true, } }) /** * @name 未從js中分離的cssLoader配置 * @param reg 匹配文件的后綴名test * @param include 所要打包的文件夾 * @param exclude 跳過打包的文件夾 * @param uses 所要向loadCSS中添加的loader */ exports.loadCSS = ({reg = /\.css$/,include,exclude,uses = []} = {}) => { return { module: { rules: [{ test: reg, use: [{ loader: "style-loader" }, { loader: "css-loader" }].concat(uses), include, exclude, }] }, } } /** * @name 從js中分離的cssLoader配置 * @param reg 匹配文件的后綴名test * @param include 所要打包的文件夾 * @param exclude 跳過打包的文件夾 * @param uses 所要向loadCSS中添加的loader * */ const MiniCssExtrectPlugin = require("mini-css-extract-plugin"); exports.extractCSS = ({reg = /\.css$/,include,exclude,uses = []} = {}) => { const plugin = new MiniCssExtrectPlugin({ filename : "styles/[name]-[hash:5].css", }) return { module: { rules: [{ test: reg, use: [{ loader: MiniCssExtrectPlugin.loader, options : { publicPath : "../" } }, { loader: "css-loader" }].concat(uses), include, exclude, }] }, plugins : [ plugin, ] } } /** * @name css tree-shaking:將沒有用到的css扔掉 * @param paths 監(jiān)聽css tree-shaking 的文件名 */ const PurifyCssPlugin = require("purifycss-webpack"); exports.purifyCSS = ({paths}) => ({ plugins : [ new PurifyCssPlugin({paths}) ] }) /** * @name autoprefixer 為css樣式添加瀏覽器前綴 * @author wangchong */ exports.autoprefix =() =>({ loader : "postcss-loader", options : { plugins : () => [require("autoprefixer")] } }) /** * @name loadImage :打包圖片資源 * @param include 所要打包的文件夾 * @param exclude 跳過打包的文件夾 * @param options loader的options配置 */ exports.loadImage = ({include,exclude,options} = {}) => ({ module : { rules : [ { test : /\.(png|jpg)$/, include, exclude, use : { loader : "url-loader", options, } } ] } })
文章總結(jié)自:Surviejs-webpack。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
火狐和ie下獲取javascript 獲取event的方法(推薦)
下面小編就為大家?guī)硪黄鸷蚷e下獲取javascript 獲取event的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11Bootstrap modal 多彈窗之疊加引起的滾動條遮罩陰影問題
這篇文章主要介紹了 Bootstrap modal 多彈窗之疊加引起的滾動條遮罩陰影問題,需要的朋友可以參考下2017-02-02document.createElement()用法及注意事項(ff下不兼容)
今天處理了一個日期選擇器的ie和ff的兼容問題,本來這種情況就很難找錯誤,找了好久才把錯誤定位到js中創(chuàng)建元素的方法document.createElement(),這個方法在ie下支持這樣創(chuàng)建元素2013-03-03Three.js+React實現(xiàn)帶火焰效果的艾爾登法環(huán)
《艾爾登法環(huán)》是最近比較火的一款游戲,觀察可以發(fā)現(xiàn)它的?Logo?是由幾個圓弧和線段構成。本文使用?React?+?Three.js?技術棧,實現(xiàn)具有火焰效果艾爾登法環(huán)?Logo,感興趣的可以了解一下2022-03-03