摘要:另外需要指定這個(gè)參數(shù),表示在配置的數(shù)值以下的圖片才進(jìn)行編碼,超過(guò)的不進(jìn)行處理。代碼如下所以過(guò)程就是引入了,然后進(jìn)行打包處理,生成和。目前這個(gè)入門學(xué)習(xí)手記到這里就結(jié)束了。完相關(guān)文章入門學(xué)習(xí)手記一入門學(xué)習(xí)手記二入門學(xué)習(xí)手記三入門學(xué)習(xí)手記四
本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注。
前幾天朋友聚餐突然想到,再過(guò)不到半年時(shí)間,第一批20后即將出生。這種感覺就像是,現(xiàn)在的90后看60后~ 一不小心我們這些90后在20后的眼中就變成了上個(gè)世紀(jì)的人。o(╯□╰)o
回顧webpack這個(gè)系列,結(jié)合自己使用的一個(gè)過(guò)程,是時(shí)候結(jié)束一下了。
css優(yōu)化我在項(xiàng)目中發(fā)現(xiàn),有些時(shí)候css會(huì)有重復(fù),或者不知道誰(shuí)寫的根本就沒有使用過(guò)的css樣式。如果文件較小,影響不是很大。但是我有一個(gè)項(xiàng)目,發(fā)現(xiàn)其中的css有9000多行!
對(duì)于有代碼潔癖的我來(lái)說(shuō),這是不能忍受的~要是文件小的話,我還有機(jī)會(huì)可以一行行的查找,將多余的代碼刪除。可惜這個(gè)文件內(nèi)容過(guò)多。好在找到了一個(gè)webpack插件mini-css-extract-plugin,這個(gè)插件結(jié)合purifycss-webpack使用,就可以滿足我的需求,將功能交給webpack去做。
mini-css-extract-pluginmini-css-extract-plugin這個(gè)插件可以在webpack plugins中查看更多配置選項(xiàng)。這里我先只使用最簡(jiǎn)單的配置項(xiàng)。
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); plugins: [ new MiniCssExtractPlugin({ // css文件抽離 filename: "css/[name].min.css", // 指定抽離之后文件的名字和并且在css路徑之下 chunkFilename: "css/[id].min.css", }), ], module: { rules: [ { test: /.css$/, // 因?yàn)槲翼?xiàng)目中只有css代碼,所以正則只寫css use: [ { loader: MiniCssExtractPlugin.loader, // 指定使用mimi-css-extract-plugin options: { publicPath: "../", hmr: process.env.NODE_ENV === "development", // 只在開發(fā)環(huán)境下開啟hmr }, }, "css-loader", // 使用css-loader ], } ] }purifycss-webpack
purifycss-webpack這個(gè)插件可以去npm 官網(wǎng)查看更多配置項(xiàng)。
注:如果打開purifycss-webpack這個(gè)插件的npm說(shuō)明,頁(yè)面中會(huì)提示使用extract-text-webpack-plugin這個(gè)插件,并且示例代碼也是用這個(gè)插件演示的。但其實(shí)這個(gè)插件已經(jīng)廢棄了。官網(wǎng)推薦的使用就是上面使用的mini-css-extract-plugin這個(gè)插件。
const glob = require("glob"); // 這里一定要安裝glob-all這個(gè)插件而不是glob const PurifyCSSPlugin = require("purifycss-webpack"); new PurifyCSSPlugin({ // css 文件去重 paths: glob.sync(path.join(__dirname, "index.html")) // 指定html頁(yè)面,也可以使用通配符*進(jìn)行匹配全部html })
purifycss-webpack和mini-css-extract-plugin兩者結(jié)合使用,才能實(shí)現(xiàn)將css去重。
optimize-css-assets-webpack-plugin去重實(shí)現(xiàn)以后,文件縮減了不少,可是我還不滿足。因?yàn)槲蚁朐诰€上使用壓縮的css,進(jìn)一步縮小文件的大小,節(jié)省用戶流量。如果自習(xí)閱讀剛才文檔,會(huì)發(fā)現(xiàn)MiniCssExtractPlugin這個(gè)插件之中有提到生成環(huán)境下使用壓縮css和js的插件。
所以我就直接使用就好了。
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const TerserJSPlugin = require("terser-webpack-plugin"); optimization: { minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], // js壓縮和css 壓縮 }圖片優(yōu)化 url-loader
css提取去重、css壓縮完成之后,又發(fā)現(xiàn)可以進(jìn)一步優(yōu)化的地方。網(wǎng)站中一般都會(huì)使用一些小圖標(biāo)和logo,有些小圖標(biāo)會(huì)做成雪碧圖,有些并不會(huì)。后來(lái)通過(guò)搜索,發(fā)現(xiàn)其實(shí)可以將一些足夠小的小圖標(biāo)制作成base64,將小圖標(biāo)寫到css文件中,從而減少http請(qǐng)求數(shù)量。如果手動(dòng)去做這個(gè)過(guò)程,是比較繁瑣的。還好找到了url-loader這個(gè)插件。插件詳細(xì)配置可以看webpack Loaders
module: { rules: [ { test: /.(png|jpe?g|gif|svg)$/i, // 匹配的圖片文件類型 use: [ { loader: "url-loader", options: { limit: 1024, // 將1024以下的圖片制作成base64圖片,超過(guò)的不處理 name: "[name].[ext]", outputPath: "img/", publicPath: "../img/" // 指定這個(gè)地址之后,css中的background才會(huì)變成了base64~,并且路徑使用的是這個(gè)路徑 }, } ] } ] }
需要說(shuō)明的是,我修改了以下正則/.(png|jpe?g|gif|svg)$/i,這樣jpg和jpeg就都能匹配到了。另外需要指定limit這個(gè)參數(shù),表示在limit配置的數(shù)值以下的圖片才進(jìn)行base64編碼,超過(guò)的不進(jìn)行處理。
在這個(gè)過(guò)程中,遇到的問(wèn)題就是,如果圖片沒有base64,就會(huì)造成背景圖片background中引用的url地址不正確,導(dǎo)致圖片引用失敗。后來(lái)經(jīng)過(guò)調(diào)試發(fā)現(xiàn),指定options.publicPath這個(gè)屬性,就可以正確引用了。
image-webpack-loader處理完小圖標(biāo),我想到需要處理一下大圖片。因?yàn)槿绻麅H僅處理了小圖標(biāo),影響似乎并不大。真正占流量的其實(shí)是圖片。其實(shí)在做項(xiàng)目的時(shí)候,會(huì)將png圖片進(jìn)行一遍壓縮。但是我之前是使用的在線工具?,F(xiàn)在我想使用打包工具,自動(dòng)化進(jìn)行處理。
image-webpack-loader可以壓縮png、jpeg、gif、webp、svg。可以分別指定不同類型圖片的壓縮質(zhì)量。
{ loader: "image-webpack-loader", options: { mozjpeg: { progressive: true, quality: 65 }, // optipng.enabled: false will disable optipng optipng: { enabled: false, }, pngquant: { quality: "65-90", speed: 4 }, gifsicle: { interlaced: false, }, // the webp option will enable WEBP webp: { quality: 75 } } }
使用完這個(gè)插件之后,確實(shí)發(fā)現(xiàn)我的圖片縮小了不少。
整個(gè)配置上面只是簡(jiǎn)單的羅列出來(lái)了需要使用的各個(gè)loader和plugin。但是整個(gè)配置并不完整,完整的webpack-config.js代碼如下:
const path = require("path"); const glob = require("glob"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const TerserJSPlugin = require("terser-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const PurifyCSSPlugin = require("purifycss-webpack"); module.exports = { mode: "production", entry: { style: "./js/style.js", }, optimization: { minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], // css 壓縮 }, plugins: [ new CleanWebpackPlugin(), // 文件清空 new MiniCssExtractPlugin({ // css文件抽離 filename: "css/[name].min.css", chunkFilename: "css/[id].min.css", }), new PurifyCSSPlugin({ // css 文件去重 paths: glob.sync(path.join(__dirname, "index.html")), }) ], module: { rules: [ { test: /.css$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { publicPath: "../", hmr: process.env.NODE_ENV === "development", }, }, "css-loader", ], }, { test: /.(png|jpe?g|gif|svg)$/i, use: [ { loader: "url-loader", options: { limit: 1024, name: "[name].[ext]", outputPath: "img/", publicPath: "../img/" // 指定這個(gè)地址之后,css中的background才會(huì)變成了base64~,并且路徑使用的是這個(gè)路徑 }, }, { loader: "image-webpack-loader", options: { mozjpeg: { progressive: true, quality: 65 }, // optipng.enabled: false will disable optipng optipng: { enabled: false, }, pngquant: { quality: "65-90", speed: 4 }, gifsicle: { interlaced: false, }, // the webp option will enable WEBP webp: { quality: 75 } } } ], } ], }, output: { filename: "[name].min.js", path: path.resolve(__dirname, "./dist") } };
文件的entry入口是style.js。
所有的打包文件目錄是通過(guò)output.path指定的,輸出到了dist目錄下。
在配置loader時(shí),可以在一個(gè)正則匹配下,配置多個(gè)loader。例如我先配置了url-loader,然后配置了image-webpack-loader。
在入口文件style.js中,其實(shí)什么事情也沒有做,只是引入了需要使用的css文件。代碼如下:
import style from "../css/style.css";
所以過(guò)程就是style.js引入了style.css,然后webpack進(jìn)行打包處理,生成style.min.js和style.min.css。
整個(gè)的項(xiàng)目結(jié)構(gòu)如下:
以上就是我在項(xiàng)目中使用webpack的一個(gè)情況。目前這個(gè)入門學(xué)習(xí)手記到這里就結(jié)束了。
(完)
相關(guān)文章
webpack入門學(xué)習(xí)手記(一)
webpack入門學(xué)習(xí)手記(二)
webpack入門學(xué)習(xí)手記(三)
webpack入門學(xué)習(xí)手記(四)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105817.html
摘要:爭(zhēng)取早日能完全拋棄掉中文文檔,最終可以翻譯英文文檔,輸出英文文檔。待續(xù)相關(guān)文章入門學(xué)習(xí)手記一入門學(xué)習(xí)手記二入門學(xué)習(xí)手記三入門學(xué)習(xí)手記四 本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注。 showImg(https://segmentfault.com/img/bVbk0kO?w=1150&h=599); 之前用過(guò)gulp、grunt,但是一直沒有學(xué)習(xí)過(guò)webpack。這兩天剛好有時(shí)間,學(xué)習(xí)了下...
摘要:例如現(xiàn)在的入門學(xué)習(xí)手記系列。收到粉絲留言和打賞的喜悅。安裝上一篇入門學(xué)習(xí)手記一,主要是介紹了的核心概念,是整個(gè)學(xué)習(xí)過(guò)程的基礎(chǔ)知識(shí)。新生成的類似如下入門學(xué)習(xí)手記因?yàn)樯傻膬?nèi)容過(guò)多,我直接省略掉了。 showImg(https://segmentfault.com/img/bVbk5Nd?w=1150&h=599); 本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注。 最近開始想要維護(hù)一個(gè)個(gè)人的公眾...
摘要:本人微信公眾號(hào)前端修煉之路,歡迎關(guān)注。再過(guò)一天,就是年了,在這里祝大家新年快樂(lè),闔家歡樂(lè),萬(wàn)事大吉。 showImg(https://image-static.segmentfault.com/230/457/2304574665-5c1373e5a1763_articlex); 本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注。 再過(guò)一天,就是2019年了,在這里祝大家新年快樂(lè),闔家歡樂(lè),萬(wàn)事...
摘要:本人微信公眾號(hào)前端修煉之路,歡迎關(guān)注。距離上一次更新這個(gè)系列,過(guò)去了兩天。最近實(shí)在是有點(diǎn)忙,沒有擠出時(shí)間整理。感覺日更還真是困難 showImg(https://segmentfault.com/img/bVbk5Nd?w=1150&h=599); 本人微信公眾號(hào):前端修煉之路,歡迎關(guān)注。 距離上一次更新這個(gè)系列,過(guò)去了兩天。最近實(shí)在是有點(diǎn)忙,沒有擠出時(shí)間整理。感覺日更還真是困難
閱讀 2511·2021-11-16 11:44
閱讀 2127·2021-10-12 10:12
閱讀 2405·2021-09-22 15:22
閱讀 3119·2021-08-11 11:17
閱讀 1600·2019-08-29 16:53
閱讀 2742·2019-08-29 14:09
閱讀 3559·2019-08-29 14:03
閱讀 3441·2019-08-29 11:09