欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript webpack模塊打包器如何優(yōu)化前端性能

 更新時(shí)間:2022年08月04日 14:55:33   作者:飯啊飯°  
本系列主要整理前端面試中需要掌握的知識(shí)點(diǎn)。本節(jié)介紹webpack如何優(yōu)化前端性能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、webpack的使用背景

  • 隨著前端的項(xiàng)目逐漸擴(kuò)大,必然會(huì)導(dǎo)致性能問(wèn)題。尤其大大型復(fù)雜的項(xiàng)目中,前端業(yè)務(wù)可能因?yàn)橐粋€(gè)小小的數(shù)據(jù)依賴,導(dǎo)致整個(gè)頁(yè)面的卡頓甚至崩潰。
  • 一般項(xiàng)目在完成后,會(huì)通過(guò)webpack進(jìn)行打包,利用webpack對(duì)前端項(xiàng)目性能優(yōu)化是一個(gè)十分重要的環(huán)節(jié)。

二、webpack如何優(yōu)化

通過(guò)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 來(lái)處理我們的代碼的。如果想要自定義配置它,配置方法如下:

const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
    ...
    optimization: {
        minimize: true,
        minimizer: [
            new TerserPlugin({
                parallel: true // 電腦cpu核數(shù)-1
            })
        ]
    }
}

2.CSS代碼壓縮

CSS壓縮通常是去除無(wú)用的空格等,因?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插件來(lái)生成HTML的模板時(shí)候,通過(guò)配置屬性minify進(jìn)行html優(yōu)化。

module.exports = {
    ...
    plugin:[
        new HtmlwebpackPlugin({
            ...
            minify:{
                minifyCSS:false, // 是否壓縮css
                collapseWhitespace:false, // 是否折疊空格
                removeComments:true // 是否移除注釋
            }
        })
    ]
}

4. 文件大小壓縮

對(duì)文件的大小進(jìn)行壓縮,減少http傳輸過(guò)程中寬帶的損耗。

// npm install compression-webpack-plugin -D
new ComepressionPlugin({
    test:/\.(css|js)$/,  // 哪些文件需要壓縮
    threshold:500, // 設(shè)置文件多大開(kāi)始?jí)嚎s
    minRatio:0.7, // 至少壓縮的比例
    algorithm:"gzip", // 采用的壓縮算法
})

5. 圖片壓縮

一般來(lái)說(shuō)在打包之后,一些圖片文件的大小是遠(yuǎn)遠(yuǎn)要比 js 或者 css 文件要來(lái)的大,所以圖片壓縮較為重要。

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,
            },
            // 開(kāi)啟 webp,會(huì)把 jpg 和 png 圖片壓縮為 webp 格式
            webp: {
              quality: 75
            }
          }
        }
      ]
    },
  ]
} 

6. Tree Shaking

Tree Shaking是一個(gè)術(shù)語(yǔ),在計(jì)算機(jī)中表示消除死代碼,依賴于ES Module的靜態(tài)語(yǔ)法分析(不執(zhí)行任何的代碼,可以明確知道模塊的依賴關(guān)系)。在webpack實(shí)現(xiàn)Tree Shaking有兩種不同的方案:useExports(通過(guò)標(biāo)記某些函數(shù)是否被使用,之后通過(guò)Terser來(lái)進(jìn)行優(yōu)化);sideEffects(跳過(guò)整個(gè)模塊/文件),直接查看該文件是否有副作用。

usedExports只需要將usedExports設(shè)為true;使用之后,沒(méi)被用上的代碼在webpack打包中會(huì)加入unused harmony export mul注釋,用來(lái)告知 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代碼在首頁(yè)全部加載,會(huì)影響到首頁(yè)的加載速度。代碼可以分出更小的bundle,以及控制資源加載的優(yōu)先級(jí),提供代碼的加載性能。通過(guò)插件splitChunksPlugin來(lái)實(shí)現(xiàn)。

module.exports = {
    ...
    optimization:{
        splitChunks:{
            chunks:"all"
        }
    }
}

8. 內(nèi)聯(lián)chunk

可以通過(guò)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加速以及提取公共第三方庫(kù)

三、總結(jié)

  • 壓縮代碼:刪除多余的代碼、注釋、簡(jiǎn)化代碼的寫(xiě)法等等?式。可以利?webpack的 UglifyJsPlugin 和 ParallelUglifyPlugin 來(lái)壓縮JS?件, 利? cssnano (css-loader?minimize)來(lái)壓縮css
  • 利?CDN加速: 在構(gòu)建過(guò)程中,將引?的靜態(tài)資源路徑修改為CDN上對(duì)應(yīng)的路徑??梢岳?webpack對(duì)于 output 參數(shù)和各loader的 publicPath 參數(shù)來(lái)修改資源路徑
  • Tree Shaking: 將代碼中永遠(yuǎn)不會(huì)?到的?段刪除掉??梢酝ㄟ^(guò)在啟動(dòng)webpack時(shí)追加參數(shù) --optimize-minimize 來(lái)實(shí)現(xiàn)
  • Code Splitting: 將代碼按路由維度或者組件分塊(chunk),這樣做到按需加載,同時(shí)可以充分利?瀏覽器緩存
  • 提取公共第三?庫(kù): SplitChunksPlugin插件來(lái)進(jìn)?公共模塊抽取,利?瀏覽器緩存可以?期緩存這些?需頻繁變動(dòng)的公共代碼

到此這篇關(guān)于JavaScript webpack模塊打包器如何優(yōu)化前端性能的文章就介紹到這了,更多相關(guān)JavaScript webpack內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論