亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

1.1 優(yōu)化babel-loader

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

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

1.2 IgnorePlugin,避免引入無用模塊

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

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

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

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

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

1.4 happyPack 多進(jìn)程打包

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

rules: [
    {
        test: /\.js$/,
        //把對.js文件的處理轉(zhuǎn)交給id為babel的HappyPack實(shí)例
        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多進(jìn)程壓縮js

在生產(chǎn)環(huán)境中使用,因?yàn)樵陂_發(fā)環(huán)境下沒有必要壓縮js代碼

plugins: [
    new ParallelUglifyPlugin({
        //還是使用的UglifyJs壓縮,只不過幫助開啟了多進(jìn)程
        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文件修改后,才會進(jìn)行熱更新
    })
}

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

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

//webpack.dll.js文件中的配置
mode: 'development', 
entry: {
    //把react相關(guān)模塊放到一個(gè)單獨(dú)的動態(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文件,需要在項(xiàng)目中使用到打包后的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)存使用更少這幾方面去進(jìn)行優(yōu)化

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

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

  • 2.6 使用production

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

mode: "production"
  • 2.7 Scope Hosting

將多個(gè)函數(shù)合并到一個(gè)函數(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)文章

  • javascript this指向相關(guān)問題及改變方法

    javascript this指向相關(guān)問題及改變方法

    這篇文章主要介紹了javascript this指向相關(guān)問題及改變方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • js打開windows上的可執(zhí)行文件示例

    js打開windows上的可執(zhí)行文件示例

    這篇文章主要介紹了js如何打開windows上的可執(zhí)行文件,需要的朋友可以參考下
    2014-05-05
  • Echarts基本用法_動力節(jié)點(diǎn)Java學(xué)院整理

    Echarts基本用法_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Echarts基本用法,詳解的介紹了Echarts的基本用法和實(shí)例,有興趣的可以了解一下
    2017-08-08
  • 原生javascript自定義input[type=radio]效果示例

    原生javascript自定義input[type=radio]效果示例

    這篇文章主要介紹了原生javascript自定義input[type=radio]效果,結(jié)合實(shí)例形式分析了javascript模擬form表單中radio效果的相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • IE autocomplete internet explorer''s autocomplete

    IE autocomplete internet explorer''s autocomplete

    IE autocomplete internet explorer''s autocomplete...
    2007-06-06
  • 詳解JavaScript常用的Hook腳本

    詳解JavaScript常用的Hook腳本

    這篇文章主要介紹了JavaScript常用的Hook腳本,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • js淡入淡出的圖片輪播效果代碼分享

    js淡入淡出的圖片輪播效果代碼分享

    這篇文章主要介紹了js淡入淡出的圖片輪播切換特效,圖片可以隨意替換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,推薦給大家,感興趣的小伙伴們可以參考一下
    2015-08-08
  • 判斷JavaScript對象是否可用的最正確方法分析

    判斷JavaScript對象是否可用的最正確方法分析

    在調(diào)試JavaScript的過程中,你是不是經(jīng)常會遇到object undefined的問題呢?你平時(shí)是怎樣來測試對象是否存在呢?判斷瀏覽器版本?判斷JavaScript版本?本文來告訴你正確的方法。這篇文章涉及的瀏覽器可能古老一些,但是闡述的道理確實(shí)適合現(xiàn)在使用的。
    2008-10-10
  • JavaScript程序員應(yīng)該知道的45個(gè)實(shí)用技巧

    JavaScript程序員應(yīng)該知道的45個(gè)實(shí)用技巧

    在這篇文章中,我將分享一組JavaScript的技巧、竅門和最佳實(shí)踐,這些都是JavaScript程序員應(yīng)該知曉的,不管他們是使用在瀏覽器/引擎上,還是服務(wù)器端(SSJS——Service Side JavaScript)JavaScript解釋器上
    2014-03-03
  • javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例

    javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例

    這篇文章主要介紹了javascript實(shí)現(xiàn)頁面的實(shí)時(shí)時(shí)鐘顯示示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論