最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

webpack構(gòu)建打包的性能優(yōu)化實戰(zhàn)指南

 更新時間:2022年03月11日 15:16:06   作者:如期_而至  
webpack是前端開發(fā)中比較常用的打包工具之一,另外還有g(shù)ulp,grunt,下面這篇文章主要給大家介紹了關(guān)于webpack構(gòu)建打包的性能優(yōu)化的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

開發(fā)的時候,如果每次我們修改了文件,webpack都能很迅速地幫我們編譯完構(gòu)建完而且瀏覽器能保存狀態(tài)更新內(nèi)容,體驗會比較好;優(yōu)化產(chǎn)出代碼,減小體積,設(shè)置hash,可以提升生產(chǎn)環(huán)境上網(wǎng)頁的加載速度

一、優(yōu)化打包構(gòu)建速度,提升開發(fā)體驗和效率

1.1 優(yōu)化babel-loader

開啟緩存,只要是es6代碼沒有改動的部分,下次重新構(gòu)建的時候可以使用緩存,不被重新編譯。

    rules: [
        {
            test: /\.js$/,
            loader: ['babel-loader?cacheDirectory'],
            include: srcPath, //設(shè)置include或者exclude的范圍,限定需要編譯文件的目錄范圍
            //exclude: /node_modules/
        }
    ]

1.2 IgnorePlugin,避免引入無用模塊

比如有些庫包含多個國家的語言包(moment.js),我們只需要中文包或者英文報,所以我們需要避免引入不需要的語言包,

    plugins: [
        //忽略moment下的/locale目錄,再手動import locale內(nèi)部我們需要使用到的語言包
        new webpack.IgnorePlugin(/\.\/local/,/moment/)
    ]

1.3 noParse 避免重復(fù)模塊化解析

代碼中如果有xx.min.js之類的文件,基本已經(jīng)采用模塊化處理過的,無需在對類似文件進行遞歸解析處理,會引入進項目

module: {
    noParse: [/xx\.min\.js$/]
}

1.4 happyPack 多進程打包

開啟多進程打包,提高構(gòu)建速度

rules: [
    {
        test: /\.js$/,
        //把對.js文件的處理轉(zhuǎn)交給id為babel的HappyPack實例
        use: ['happypack/loader?id=babel'],
        include: srcPath
    }
],
plugins: [
    new HappyPack({
        //用唯一的標(biāo)識符id來代表當(dāng)前的HappyPack是用來處理一類特定的文件
        id: 'babel',
        //如何處理.js文件,用法和loader配置中一樣
        loaders: ['babel-loader?cacheDirectory']
    })
]

1.5 ParallelUglifyPlugin多進程壓縮js

在生產(chǎn)環(huán)境中使用,因為在開發(fā)環(huán)境下沒有必要壓縮js代碼

plugins: [
    new ParallelUglifyPlugin({
        //還是使用的UglifyJs壓縮,只不過幫助開啟了多進程
        uglifyJS: {
            output: {
                beautify: false,//最緊湊的輸出
                comments: false,//刪除所有的注釋
            },
            compress: {
                //刪除所有的'console'語句,可以兼容ie瀏覽器
                drop_console: true,
                //內(nèi)嵌定義了但只用到一次的變量
                collapse_vars: true,
                //提取出出現(xiàn)多次但是沒定義成變量去引用的靜態(tài)值
                reduce_vars: true
            }
        }
    })
]

1.6 熱更新

改完代碼,瀏覽器無需刷新,新代碼生效,狀態(tài)保留。

entry: {
    index: [
        'webpack-dev-server/client?http://localhost:8080/',
        'webpack/hot/dev-server',
        path.join(srcPath, 'index.js')
    ],
    other: path.join(srcPath, 'other.js')
}

plugins: [
    new HotModuleReplacementPlugin()
]

devServer: {
    xxx: 'xx'
    hot: true //開啟熱更新
}

配置完后,修改樣式,熱更新生效了,但修改js,熱更新沒有生效,接下來還需要在js中設(shè)置允許熱更新監(jiān)聽的模塊

if(module.hot){
    module.hot.accept(['xxx文件名'], () => {
        //在注冊了熱更新的js文件修改后,才會進行熱更新
    })
}

1.7 DllPlugin動態(tài)鏈接庫插件

前端框架如Vue、React,體積大,構(gòu)建慢,比較穩(wěn)定,不常升級版本。這種情況下,同一個版本只構(gòu)建一次,不用每次都重新構(gòu)建; 由于webpack已內(nèi)置DllPlugin,所以不需我們額外安裝插件,包含兩個插件 DllPlugin(用來打包出dll文件,只要打包過,就不需要再打包了),DllReferencePlugin(使用dll文件)

//webpack.dll.js文件中的配置
mode: 'development', 
entry: {
    //把react相關(guān)模塊放到一個單獨的動態(tài)鏈接庫
    react: ['react','react-dom']
},
output: {
    //輸出動態(tài)鏈接庫的文件名稱,[name]代表當(dāng)前動態(tài)鏈接庫的名稱
    filename: '[name].dll.js',
    path: distPath,
    //存放動態(tài)鏈接庫的全局變量名稱,例如對應(yīng)react來說就是 _dll_react
    //之所以在前面加上_dll_是為了防止全局變量沖突
    library: '_dll_[name]'
}
plugins: [
    new DllPlugin({
        //動態(tài)鏈接庫的全局變量名稱,需要和output.library中保持一致
        //該字段的值也就是輸出的manifest.json文件中name字段的值
        name: '_dll_[name]',
        path: path.join(distPath, '[name].manifest.json')
    })
]

配置好webpack.dll.js后,在package.json文件中定義執(zhí)行webpack.dll.js的命令

    "script": {
        "dll": "webpack --config build/webpack.dll.js"
    }

以上配置完執(zhí)行dll打包命令打包后會產(chǎn)出react.dll.js和react.manifest.json文件,需要在項目中使用到打包后的react.dll.js

//在inde.html中
<script src="./react.dll.js"></script>
//在webpack.dev.js中
plugins: [
    new DllReferencePlugin({
        //描述react動態(tài)鏈接庫的文件內(nèi)容
        manifest: require(path.join(distPath, 'react.manifest.json'))
    })
]

二、webpack性能優(yōu)化-產(chǎn)出代碼

可以從體積更??;合理分包,不重復(fù)加載;速度更快、內(nèi)存使用更少這幾方面去進行優(yōu)化

  • 2.1 小圖片base64編碼,使用url-loader,可減少網(wǎng)絡(luò)請求
  • 2.2 bundle加hash,如果文件沒有變,hash值不變,瀏覽器可以命中緩存
  • 2.3 提取公共代碼,可以是整個項目的體積更小
  • 2.4 IngorePlugin 忽略庫中不需要的包
  • 2.5使用cdn加速
output: {
    publicPath: 'http://cdn.xxx.com'//引用文件路徑是,路徑名前加cdn域名的前綴
}

打包后,將代碼放入cdn域名對應(yīng)的服務(wù)器中。

  • 2.6 使用production

mode為production時,打包后的代碼會自動壓縮,Vue/React會自動刪掉調(diào)式代碼(如開發(fā)環(huán)境的warning),也會自動啟用Tree-Shaking,將未使用到的代碼刪掉

mode: "production"
  • 2.7 Scope Hosting

將多個函數(shù)合并到一個函數(shù)中,可以使代碼體積更小,創(chuàng)建的函數(shù)作用域更少,代碼可讀性更好

module.exports = {
    resolve: {
        mainFields: ['jsnext: main','browser','main']
    },
    plugins: [
        //開啟Scope Hosting
        new ModuleConcatenationPlugin()
    ]
}

總結(jié)

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

相關(guān)文章

  • 輕松實現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼

    輕松實現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼

    輕松實現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼...
    2007-09-09
  • js中數(shù)組解構(gòu)與對象解構(gòu)示例代碼

    js中數(shù)組解構(gòu)與對象解構(gòu)示例代碼

    數(shù)組解構(gòu)是一種在 JavaScript 中從數(shù)組中提取值并將它們分配給變量的方式,在數(shù)組解構(gòu)中分為完全解構(gòu),不完全解構(gòu),解構(gòu)失敗以及解構(gòu)默認(rèn)值,這篇文章主要介紹了js中數(shù)組解構(gòu)與對象解構(gòu),需要的朋友可以參考下
    2023-09-09
  • 一分鐘理解js閉包

    一分鐘理解js閉包

    一分鐘理解js閉包,關(guān)于js閉包的內(nèi)容介紹了很多,本文帶著大家快速理解什么是js閉包,感興趣的小伙伴們可以參考一下
    2016-05-05
  • js實現(xiàn)鼠標(biāo)點擊左上角滑動菜單效果代碼

    js實現(xiàn)鼠標(biāo)點擊左上角滑動菜單效果代碼

    這篇文章主要介紹了js實現(xiàn)鼠標(biāo)點擊左上角滑動菜單效果代碼,涉及JavaScript基于鼠標(biāo)事件動態(tài)變換頁面元素樣式的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 深入分析javascript中的錯誤處理機制

    深入分析javascript中的錯誤處理機制

    這篇文章主要介紹了深入分析javascript中的錯誤處理機制的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • jQuery實現(xiàn)隨意改變div任意屬性的名稱和值(部分原生js實現(xiàn))

    jQuery實現(xiàn)隨意改變div任意屬性的名稱和值(部分原生js實現(xiàn))

    用原生js和jQuery實現(xiàn)隨意改變div屬性和重置,在輸入框輸入“屬性名”及“屬性值”,點擊確定按鈕查看效果,感興趣的你可不要錯過了哈
    2013-05-05
  • js實現(xiàn)杯子倒水問題自動求解程序

    js實現(xiàn)杯子倒水問題自動求解程序

    智力測試題經(jīng)常遇到類似的邏輯題,給幾個容量不等的杯子,讓你倒出多少的水,感興趣的朋友可以參考下哈希望可以幫助到你
    2013-03-03
  • JS實現(xiàn)的加減乘除四則運算計算器示例

    JS實現(xiàn)的加減乘除四則運算計算器示例

    這篇文章主要介紹了JS實現(xiàn)的加減乘除四則運算計算器,涉及javascript事件響應(yīng)及數(shù)學(xué)運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 淺談JS三座大山之異步和單線程

    淺談JS三座大山之異步和單線程

    首先我們要知道,js這門語言是單線程的,同時只能做一件事,比如說渲染dom,執(zhí)行js方法,這些事情只能一個一個做,不能分開執(zhí)行。(因為js需要操作dom,當(dāng)兩個js方法同時操作一個dom的時候就會出問題,所以js被設(shè)計成了單線程)。本文將介紹JS三座大山之異步和單線程。
    2021-06-06
  • 微信小程序網(wǎng)絡(luò)封裝(簡單高效)

    微信小程序網(wǎng)絡(luò)封裝(簡單高效)

    這篇文章主要介紹了微信小程序網(wǎng)絡(luò)封裝(簡單高效),微信小程序的網(wǎng)絡(luò)請求很便捷,直接調(diào)用就可以了。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論

通江县| 河北区| 临沧市| 安庆市| 定结县| 昭苏县| 汉阴县| 英山县| 蕲春县| 庆云县| 公主岭市| 南阳市| 阳谷县| 咸宁市| 淮南市| 盘山县| 凤城市| 葫芦岛市| 盱眙县| 清徐县| 策勒县| 湛江市| 徐州市| 平顺县| 五家渠市| 华蓥市| 济阳县| 台安县| 长阳| 花垣县| 建湖县| 玛多县| 增城市| 宽甸| 高唐县| 庆城县| 英山县| 庄河市| 城口县| 汪清县| 枣庄市|