繼上一次webpack的基礎配置分享以後,本次將分享一些工做中項目經常使用的配置插件、也會包含一些本身瞭解過以爲不錯的插件,若有分析不到位的,歡迎糾錯,嗯,這些東西文檔都有,大佬可繞過。javascript
Wepack4以後廢棄了不少的插件,這裏只會講解webpack4還支持的(包含4以前插件
),已經廢棄的將再也不闡述。css
上一次的分享以後,有部分網友留言質疑:騙小白的贊、是否原創、是不是抄別人等等,固然也有不少的網友支持和鼓勵,無論褒貶,蘇南都很是的感謝,是大家讓我認識到本身的不足與優劣。html
你們的留言,讓我想起了本身剛入門前端初期的心酸,基本靠本身自學,沒有人帶,遇到問題像無頭的蒼蠅,處處亂撞網上一頓搜索,百度未曾欺我,在點了一個又一個的廣告以後,翻過十頁八頁以後終於找到了問題的解決方案。前端
執着於對前端的熱愛,經常一個問題卡到深夜,初入前端的我曾一度感嘆在編輯器寫一些東西,在網頁上就能跑,甚至感嘆 js
寫上一個 alert
hello world,瀏覽器就會自動彈出一個窗口,彷彿全世界都在向你招手,當時的興奮是難以形容的,甚至幻想着將來有一天,可能有千萬、億萬的用戶,在用你寫的東西。—— 雖然尚未到億萬,但夢想仍是要有的java
這幾天一直在想,這篇插件的總結仍是否要繼續寫下去?從寫博客到今天,將近兩個月吧,也算是一個新人,技術方面雖然說工做了幾年,但也不敢說多牛B,寫博客的初衷是爲了對本身工做中遇到的問題/心得等作一個總結,俗話說:好記性不如爛筆頭;同時也但願能把本身遇到的問題、坑點分享給他人,讓遇到一樣問題的基友們能少走那麼一點點彎路。webpack
終於最後在想了好久以後明白,人無完人,百人百性、千人千面,無論你作什麼總會有不一樣的聲音,一樣無論你分享什麼,總會有人須要或鄙視。因此走本身的路,讓別人打車吧,堅持本身所想 努力成爲本身想成爲的樣子,就是對本身最大的確定 ———— 至曾經初入前端的咱們。git
各位早安,這裏是@IT·平頭哥聯盟,我是首席填坑官∙蘇南,用心分享 與您一塊兒成長 作有溫度的攻城獅。
公衆號:honeyBadger8
,羣:912594095github
extract-text-webpack-plugin
比較多一些,二者相比它有什麼優點呢?extract-text-webpack-plugin
實例,則會生成多個css的文件,mini-css-extract-plugin
,它默認就會對你的樣式進行模塊化拆分,嗯,有點跟output
裏的配置一個意思,異步按需加載,再也不僅僅是js的特權;//extract-text-webpack-plugin 編譯打包
config.module.rules.push({
test: /\.(scss|css)$/,
use: ExtractTextPlugin.extract({
use: [
"css-loader",
{ //首席填坑官∙蘇南的專欄 交流:91259409五、公衆號:honeyBadger8
loader: 'postcss-loader',
options: {
plugins: [
require('autoprefixer')({ //添加前綴
browsers: CSS_BROWSERS,
}),
],
minimize: true
},
},
"sass-loader"
]
})
})
config.plugins.push(new ExtractTextPlugin({
filename: 'css/[name].css',
disable: false,
allChunks: true,
}));
//mini-css-extract-plugin 編譯打包
config.module.rules.push({
test: /\.(scss|css)$/,//同時處理css/scss
use: [
{
loader: MiniCssExtractPlugin.loader,
},
"css-loader", //css處理器
{
loader: 'postcss-loader',
/* postcss 這個插件的做用在於,與已有的工具集成一塊兒使用,不多有單獨使用的狀況, 通用咱們用的最多的,是配合 autoprefixer 來添加各瀏覽器的前綴,以達到更好的兼容, 再深刻一些就是 cssnext 就是容許開發者自定義屬性和變量 : color:var(--theme-color,#42b983); */
options: {
plugins: [
require('autoprefixer')({
browsers: CSS_BROWSERS,
}),
],
},
},
"sass-loader" //sass處理器 、甚至還能夠再加一個less的處理器
]
})
config.plugins.push(new MiniCssExtractPlugin({
filename: 'css/[name].css', //這裏配置跟output寫法一致
chunkFilename: 'css/[id][chunkhash:8].css',
}));
config.plugins.push(new OptimizeCssAssetsPlugin({})); //壓縮文件
複製代碼
assetNameRegExp
:默認是所有的css都會壓縮,該字段能夠進行指定某些要處理的文件,cssProcessor
:指定一個優化css的處理器,默認cssnano
,cssProcessorPluginOptions
:cssProcessor後面能夠跟一個process方法,會返回一個promise對象,而cssProcessorPluginOptions就是一個options參數選項!canPrint
:布爾,是否要將編譯的消息顯示在控制檯,沒發現有什麼用!new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.optimize\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', { discardComments: { removeAll: true } }],
//autoprefixer: { browsers: CSS_BROWSERS }, 也是能夠指定前綴的
},
canPrint: true
})
複製代碼
optimization
配置下的的splitChunks
、runtimeChunk
基本是一致的,;CommonsChunkPlugin
的替代品,用於提取一些公共模塊;chunks
:要進行處理的類型,它有三個值:all,async,initialminSize
:最少大小maxSize
:最大包的大小,超出生成新的包minChunks
:至少要引用N次的模塊,maxAsyncRequests
:最大的按需加載並行請求數量maxInitialRequests
:最大的初始化加載請求次數new webpack.optimize.SplitChunksPlugin({
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 1,
maxInitialRequests:1,
name: true, //能夠指定
……,//首席填坑官∙蘇南的專欄 交流:912594095
}),
new webpack.optimize.RuntimeChunkPlugin({
name: 'manifest',
name: entrypoint => `runtimechunk~${entrypoint.name}` //動態文件名
})
複製代碼
HotModuleReplacementPlugin
插件後,它會暴露一個module.hot
對象,它下面有不少的屬性:accept
:它有兩個參數,一個是受權模塊(能夠直接是單個文件路徑、也能夠是一個數組包含多個文件路徑),第二個參數,是回調函數,即更新後要作的邏輯處理。decline
有點黑名單的意思,就是忽略一些模塊,不更新它們,status
當前更新的狀態,idle、check、prepare、ready、dispose、apply、fail等;accept
最多,下面有個示例;//webpack config
plugins:[
new webpack.HotModuleReplacementPlugin()
]
//路由入口頁
……
if (module.hot) {
module.hot.accept([
'./pages/routes'
], (err) => {
const NextRoute = require('./pages/routes')
// 從DOM 中移除已經掛載的 React 組件 而後重裝
ReactDOM.unmountComponentAtNode(APP_DOM);
ReactDOM.render(
<Provider store={Store}> <Router routes={NextRoute} history={browserHistory}/> </Provider>, APP_DOM); }); } …… 複製代碼
filename
:輸出文件名;template
:模板文件,不侷限於html後綴哦;removeComments
:移除HTML中的註釋;collapseWhitespace
:刪除空白符與換行符,整個文件會壓成一行;inlineSource
:插入到html的css、js文件都要內聯,即不是以link、script的形式引入;inject
:是否能注入內容到 輸出 的頁面去;chunks
:指定插入某些模塊;hash
:每次會在插入的文件後面加上hash ,用於處理緩存,如:;new HtmlWebPackPlugin({
filename: path.resolve(__dirname, '../assets/index.html'),
template: path.resolve(__dirname,"../views/temp.html"),
minify:{ //壓縮HTML文件 
  removeComments:true,
  collapseWhitespace:true
},
inlineSource: '.(js|css)',
inject: false,
chunks: ['vendors', 'index'], //首席填坑官∙蘇南的專欄
hash:true,
favicon、meta、title等均可以配置,頁面內使用「<%= htmlWebpackPlugin.options.title %>」便可
……
})
複製代碼
cache
: Boolean/String ,字符串便是緩存文件存放的路徑;test
:正則表達式、字符串、數組均可以,用於只匹配某些文件,如:/.js(?.*)?$/i;parallel
: 啓用多線程並行運行來提升編譯速度,常常編譯的時候聽到電腦跑的呼呼響,可能就是它乾的,哈哈~;output.comments
: 刪除全部註釋,compress.warnings
:插件在進行刪除一些無用代碼的時候,不提示警告,compress.drop_console
:喜歡打console的同窗,它能自動幫你過濾掉,不再用擔憂線上還打印日誌了;//默認:
optimization:{
minimizer:true
};
//自定義
minimizer: [
new UglifyJsPlugin({
cache: true,
// cache: "assets",
parallel: true, //也能夠指定 Number ,即最多並行運行數量
sourceMap: true,
uglifyOptions: {
output: {
comments: false,
…… //首席填坑官∙蘇南的專欄,QQ:912594095
},
compress: {
warnings: false,
drop_console:true,
……
}
},
}),
],
複製代碼
自帶
的一個插件,不用另外再安裝依賴,//字符串:
new webpack.BannerPlugin('給文件添加一些信息,打包日期:'+ new Date());
//自定義
plugins: [
new webpack.BannerPlugin({
{
banner: ' \n @item:蘇南的項目 \n @author:suSouth \n @date:'+new Date()+' \n @description:蘇南的項目 \n @version:'+package.version+' \n', // 要輸出的註釋內容
test:string/正則/數組,//可用於匹配某些文件才輸出,
entryOnly: boolean, // 便是否只在入口 模塊 文件中添加註釋;
……
}
})
],
複製代碼
preload
、prefetch
,從字面意思上講:預加載
,preload-webpack-plugin
它的做用就是在編譯打包的時候,幫咱們把以上的操做都作了,HtmlWebPackPlugin
配置輸出的文件內,as
: 表示你預加載的資源類型;能夠有有先多:script、font、image、style、video等等,更多詳細請查看API,它還能夠返回function;include
:要插入,進行預加載的文件,它有:allChunks、initial、asyncChunks、數組等選項,數組即表示指定插入某些文件fileBlacklist
:即文件黑名單,能夠指定某個文件,也可使用正則來匹配;、) web
//注意點1:請把配置必定寫在HtmlWebPackPlugin插件以後,不然會報`HtmlWebpackPlugin.getHooks is not a function`錯誤,
//注意點2:webpack4以後,請使用最新版本 npm install --save-dev preload-webpack-plugin@next,
new PreloadWebpackPlugin({
rel: 'prefetch',
as: 'script',
// as(entry) {
// if (/\.css$/.test(entry)) return 'style';
// return 'script';//首席填坑官∙蘇南的專欄,QQ:912594095
// },
include: 'asyncChunks',
// fileBlacklist: ["index.css"]
fileBlacklist: [/\index.css|index.js|vendors.js/, /\.whatever/]
})
複製代碼
analyzerHost
、analyzerPort
:自定配置打開的地址、端口,默認使用:127.0.0.1:8888reportFilename
: 報告生成的路徑,默認以項目的output.path輸出;openAnalyzer
:是否要自動打開分析窗口,plugins:[
new BundleAnalyzerPlugin({...}) //默認配置就很好了,能知足咱們的要求
]
複製代碼
以上就是今天爲你們整理的幾個項目中經常使用的插件,可能有些地方理解的不是特別到位,歡迎你們補充,同時我也給你們準備了一個整合後完整的webpack配置的示例,若有興趣可自行測試,若是以爲不錯記得點個贊哦,固然您能動動手指關注下方公衆號就更棒了,謝謝支持!正則表達式
做者:蘇南 - 首席填坑官
交流:91259409五、公衆號:
honeyBadger8
本文原創,著做權歸做者全部。商業轉載請聯繫
@IT·平頭哥聯盟
得到受權,非商業轉載請註明原連接及出處。