JavaScript webpack模塊打包器如何優(yōu)化前端性能
一、webpack的使用背景
- 隨著前端的項(xiàng)目逐漸擴(kuò)大,必然會導(dǎo)致性能問題。尤其大大型復(fù)雜的項(xiàng)目中,前端業(yè)務(wù)可能因?yàn)橐粋€(gè)小小的數(shù)據(jù)依賴,導(dǎo)致整個(gè)頁面的卡頓甚至崩潰。
- 一般項(xiàng)目在完成后,會通過webpack進(jìn)行打包,利用webpack對前端項(xiàng)目性能優(yōu)化是一個(gè)十分重要的環(huán)節(jié)。
二、webpack如何優(yōu)化
通過webpack優(yōu)化前端的手段有:JS代碼壓縮、CSS代碼壓縮、Html文件代碼壓縮、文件大小壓縮、圖片壓縮、Tree Shaking、代碼分離、內(nèi)聯(lián)chunk。
1. JS代碼壓縮
terser是一個(gè)JavaScript的解釋、絞肉機(jī)、壓縮機(jī)的工具集,可以幫助我們壓縮、丑化我們的代碼,讓bundle更小。在production模式下,webpack 默認(rèn)就是使用 TerserPlugin 來處理我們的代碼的。如果想要自定義配置它,配置方法如下:
const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
...
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
parallel: true // 電腦cpu核數(shù)-1
})
]
}
}
2.CSS代碼壓縮
CSS壓縮通常是去除無用的空格等,因?yàn)楹茈y去修改選擇器、屬性的名稱、值等。CSS的壓縮我們可以使用另外一個(gè)插件:css-minimizer-webpack-plugin。
// npm install css-minimizer-webpack-plugin -D
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
module.exports = {
// ...
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
parallel: true
})
]
}
}
3. HTML文件壓縮
使用HtmlWebpackPlugin插件來生成HTML的模板時(shí)候,通過配置屬性minify進(jìn)行html優(yōu)化。
module.exports = {
...
plugin:[
new HtmlwebpackPlugin({
...
minify:{
minifyCSS:false, // 是否壓縮css
collapseWhitespace:false, // 是否折疊空格
removeComments:true // 是否移除注釋
}
})
]
}
4. 文件大小壓縮
對文件的大小進(jìn)行壓縮,減少http傳輸過程中寬帶的損耗。
// npm install compression-webpack-plugin -D
new ComepressionPlugin({
test:/\.(css|js)$/, // 哪些文件需要壓縮
threshold:500, // 設(shè)置文件多大開始壓縮
minRatio:0.7, // 至少壓縮的比例
algorithm:"gzip", // 采用的壓縮算法
})
5. 圖片壓縮
一般來說在打包之后,一些圖片文件的大小是遠(yuǎn)遠(yuǎn)要比 js 或者 css 文件要來的大,所以圖片壓縮較為重要。
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name]_[hash].[ext]',
outputPath: 'images/',
}
},
{
loader: 'image-webpack-loader',
options: {
// 壓縮 jpeg 的配置
mozjpeg: {
progressive: true,
quality: 65
},
// 使用 imagemin**-optipng 壓縮 png,enable: false 為關(guān)閉
optipng: {
enabled: false,
},
// 使用 imagemin-pngquant 壓縮 png
pngquant: {
quality: '65-90',
speed: 4
},
// 壓縮 gif 的配置
gifsicle: {
interlaced: false,
},
// 開啟 webp,會把 jpg 和 png 圖片壓縮為 webp 格式
webp: {
quality: 75
}
}
}
]
},
]
}
6. Tree Shaking
Tree Shaking是一個(gè)術(shù)語,在計(jì)算機(jī)中表示消除死代碼,依賴于ES Module的靜態(tài)語法分析(不執(zhí)行任何的代碼,可以明確知道模塊的依賴關(guān)系)。在webpack實(shí)現(xiàn)Tree Shaking有兩種不同的方案:useExports(通過標(biāo)記某些函數(shù)是否被使用,之后通過Terser來進(jìn)行優(yōu)化);sideEffects(跳過整個(gè)模塊/文件),直接查看該文件是否有副作用。
usedExports只需要將usedExports設(shè)為true;使用之后,沒被用上的代碼在webpack打包中會加入unused harmony export mul注釋,用來告知 Terser 在優(yōu)化時(shí),可以刪除掉這段代碼
module.exports = {
...
optimization:{
usedExports:true;
}
}
sideEffects配置方法在package.json中設(shè)置sideEffects屬性,如果sideEffects設(shè)置為false,就是告知webpack可以安全的刪除未用到的exports。如果有些文件需要保留,可以設(shè)置為數(shù)組的形式。
"sideEffecis":[
"./src/util/format.js",
"*.css" // 所有的css文件
]
7. 代碼分離
將代碼分離到不同的bundle中,之后可以按需加載,或者并行加載這些文件。默認(rèn)情況下,所有的JS代碼在首頁全部加載,會影響到首頁的加載速度。代碼可以分出更小的bundle,以及控制資源加載的優(yōu)先級,提供代碼的加載性能。通過插件splitChunksPlugin來實(shí)現(xiàn)。
module.exports = {
...
optimization:{
splitChunks:{
chunks:"all"
}
}
}
8. 內(nèi)聯(lián)chunk
可以通過InlineChunkHtmlPlugin插件將一些chunk的模塊內(nèi)嵌到html
const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
...
plugin:[
new InlineChunkHtmlPlugin(HtmlWebpackPlugin,[/runtime.+\.js/]
}
9. 利用CDN加速以及提取公共第三方庫
三、總結(jié)
- 壓縮代碼:刪除多余的代碼、注釋、簡化代碼的寫法等等?式。可以利?webpack的 UglifyJsPlugin 和 ParallelUglifyPlugin 來壓縮JS?件, 利? cssnano (css-loader?minimize)來壓縮css
- 利?CDN加速: 在構(gòu)建過程中,將引?的靜態(tài)資源路徑修改為CDN上對應(yīng)的路徑??梢岳?webpack對于 output 參數(shù)和各loader的 publicPath 參數(shù)來修改資源路徑
- Tree Shaking: 將代碼中永遠(yuǎn)不會?到的?段刪除掉??梢酝ㄟ^在啟動webpack時(shí)追加參數(shù) --optimize-minimize 來實(shí)現(xiàn)
- Code Splitting: 將代碼按路由維度或者組件分塊(chunk),這樣做到按需加載,同時(shí)可以充分利?瀏覽器緩存
- 提取公共第三?庫: SplitChunksPlugin插件來進(jìn)?公共模塊抽取,利?瀏覽器緩存可以?期緩存這些?需頻繁變動的公共代碼
到此這篇關(guān)于JavaScript webpack模塊打包器如何優(yōu)化前端性能的文章就介紹到這了,更多相關(guān)JavaScript webpack內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)html轉(zhuǎn)pdf的三種方法詳解
近期項(xiàng)目需要實(shí)現(xiàn)將?html?頁面轉(zhuǎn)換成?pdf?報(bào)告的需求,經(jīng)過一番調(diào)研以及結(jié)合過往經(jīng)驗(yàn),發(fā)現(xiàn)了三種技術(shù)方案,下面我們就來看看它們的具體實(shí)現(xiàn)步驟吧2024-02-02
關(guān)于使用runtimeStyle屬性問題討論文章
關(guān)于使用runtimeStyle屬性問題討論文章...2007-03-03
JavaScript 異步調(diào)用框架 (Part 5 - 鏈?zhǔn)綄?shí)現(xiàn))
在上一篇文章里面,我們?yōu)楫惒秸{(diào)用框架設(shè)計(jì)了一種鏈?zhǔn)秸{(diào)用方式,來增強(qiáng)異步調(diào)用隊(duì)列的代碼可讀性,現(xiàn)在我們就來編寫實(shí)現(xiàn)這部分功能的代碼。2009-08-08
ionic實(shí)現(xiàn)可滑動的tab選項(xiàng)卡切換效果
這篇文章主要為大家詳細(xì)介紹了ionic實(shí)現(xiàn)可滑動的tab選項(xiàng)卡切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
JavaScript offset實(shí)現(xiàn)鼠標(biāo)坐標(biāo)獲取和窗口內(nèi)模塊拖動
在頁面開發(fā)時(shí)我們少不了各種鼠標(biāo)交互動作,那么JavaScript中如何實(shí)現(xiàn)鼠標(biāo)坐標(biāo)獲取和窗口內(nèi)模塊拖動,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-05-05
js判斷手機(jī)瀏覽器操作系統(tǒng)和微信瀏覽器的方法
做手機(jī)端的前端開發(fā),少不了對手機(jī)平臺的判斷。如,對于app下載,就要判斷在Android平臺下就顯示Android下載提示;在iOS平臺下就顯示iOS下載提示2016-04-04
js構(gòu)造函數(shù)創(chuàng)建對象是否加new問題
本篇文章主要給大家詳細(xì)分析了js構(gòu)造函數(shù)創(chuàng)建對象加new與不加new的問題,有這方面興趣的參考學(xué)習(xí)下。2018-01-01
JavaScript前端開發(fā)時(shí)數(shù)值運(yùn)算的小技巧
這篇文章主要介紹了JavaScript前端開發(fā)時(shí)數(shù)值運(yùn)算的小技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

