<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Webpack的dll功能使用

        來源:懂視網 責編:小采 時間:2020-11-27 22:12:15
        文檔

        Webpack的dll功能使用

        Webpack的dll功能使用:最近使用Webpack遇到了一個坑。 我們構建前端項目的時候,往往希望第三方庫(vendors)和自己寫的代碼可以分開打包,因為第三方庫往往不需要經常打包更新。對此Webpack的文檔建議用CommonsChunkPlugin來單獨打包第三方庫。 entry: { vendor
        推薦度:
        導讀Webpack的dll功能使用:最近使用Webpack遇到了一個坑。 我們構建前端項目的時候,往往希望第三方庫(vendors)和自己寫的代碼可以分開打包,因為第三方庫往往不需要經常打包更新。對此Webpack的文檔建議用CommonsChunkPlugin來單獨打包第三方庫。 entry: { vendor

        最近使用Webpack遇到了一個坑。

        我們構建前端項目的時候,往往希望第三方庫(vendors)和自己寫的代碼可以分開打包,因為第三方庫往往不需要經常打包更新。對此Webpack的文檔建議用CommonsChunkPlugin來單獨打包第三方庫。

        entry: {
         vendor: ["jquery", "other-lib"],
         app: "./entry"
        }
        new CommonsChunkPlugin({
         name: "vendor",
        
         // filename: "vendor.js"
         // (Give the chunk a different name)
        
         minChunks: Infinity,
         // (with more entries, this ensures that no other module
         // goes into the vendor chunk)
        })

        通常為了對抗緩存,我們會給售出文件的文件名中加入hash的后綴——但是——我們編輯了app部分的代碼后,重新打包,發現vendor的hash也變化了!

        這么一來,意味著每次發布版本的時候,vendor代碼都要刷新,即使我并沒有修改其中的代碼。這樣并不符合我們分開打包的初衷。

        帶著問題我瀏覽了Github上的討論,發現了一個神器:dll。

        Dll是Webpack最近新加的功能,我在網上并沒有找到什么中文的介紹,所以在這里我就簡單介紹一下。

        Dll這個概念應該是借鑒了Windows系統的dll。一個dll包,就是一個純純的依賴庫,它本身不能運行,是用來給你的app引用的。

        打包dll的時候,Webpack會將所有包含的庫做一個索引,寫在一個manifest文件中,而引用dll的代碼(dll user)在打包的時候,只需要讀取這個manifest文件,就可以了。

        這么一來有幾個好處:

        1. Dll打包以后是獨立存在的,只要其包含的庫沒有增減、升級,hash也不會變化,因此線上的dll代碼不需要隨著版本發布頻繁更新。
        2. App部分代碼修改后,只需要編譯app部分的代碼,dll部分,只要包含的庫沒有增減、升級,就不需要重新打包。這樣也大大提高了每次編譯的速度。
        3. 假設你有多個項目,使用了相同的一些依賴庫,它們就可以共用一個dll。

        如何使用呢?

        首先要先建立一個dll的配置文件,entry只包含第三方庫:

        const webpack = require('webpack');
        
        const vendors = [
         'antd',
         'isomorphic-fetch',
         'react',
         'react-dom',
         'react-redux',
         'react-router',
         'redux',
         'redux-promise-middleware',
         'redux-thunk',
         'superagent',
        ];
        
        module.exports = {
         output: {
         path: 'build',
         filename: '[name].[chunkhash].js',
         library: '[name]_[chunkhash]',
         },
         entry: {
         vendor: vendors,
         },
         plugins: [
         new webpack.DllPlugin({
         path: 'manifest.json',
         name: '[name]_[chunkhash]',
         context: __dirname,
         }),
         ],
        };

        webpack.DllPlugin的選項中,path是manifest文件的輸出路徑;name是dll暴露的對象名,要跟output.library保持一致;context是解析包路徑的上下文,這個要跟接下來配置的dll user一致。

        運行Webpack,會輸出兩個文件一個是打包好的vendor.js,一個就是manifest.json,長這樣:

        {
         "name": "vendor_ac51ba426d4f259b8b18",
         "content": {
         "./node_modules/antd/dist/antd.js": 1,
         "./node_modules/react/react.js": 2,
         "./node_modules/react/lib/React.js": 3,
         "./node_modules/react/node_modules/object-assign/index.js": 4,
         "./node_modules/react/lib/ReactChildren.js": 5,
         "./node_modules/react/lib/PooledClass.js": 6,
         "./node_modules/react/lib/reactProdInvariant.js": 7,
         "./node_modules/fbjs/lib/invariant.js": 8,
         "./node_modules/react/lib/ReactElement.js": 9,
         
         ............

        Webpack將每個庫都進行了編號索引,之后的dll user可以讀取這個文件,直接用id來引用。

        Dll user的配置:

        const webpack = require('webpack');
        
        module.exports = {
         output: {
         path: 'build',
         filename: '[name].[chunkhash].js',
         },
         entry: {
         app: './src/index.js',
         },
         plugins: [
         new webpack.DllReferencePlugin({
         context: __dirname,
         manifest: require('./manifest.json'),
         }),
         ],
        };

        DllReferencePlugin的選項中,context需要跟之前保持一致,這個用來指導Webpack匹配manifest中庫的路徑;manifest用來引入剛才輸出的manifest文件。

        運行Webpack之后,結果如下:

        對比一下不做分離的情況下打包的結果:

        速度快了,文件也小了。

        平時開發的時候,修改代碼后重新編譯的速度會大大減少,節省時間。

        如果有多個項目,使用相同的一套庫,你可以在打包的時候引用相同的manifest文件,這樣就可以在項目之間共享了。

        參考:

        https://webpack.github.io/docs/list-of-plugins.html#dllplugin

        https://github.com/webpack/webpack/tree/master/examples/dll

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Webpack的dll功能使用

        Webpack的dll功能使用:最近使用Webpack遇到了一個坑。 我們構建前端項目的時候,往往希望第三方庫(vendors)和自己寫的代碼可以分開打包,因為第三方庫往往不需要經常打包更新。對此Webpack的文檔建議用CommonsChunkPlugin來單獨打包第三方庫。 entry: { vendor
        推薦度:
        標簽: 功能 使用 作用
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精品无码久久久秋霞1| 亚洲va精品中文字幕| 亚洲人成色77777在线观看大| 亚洲一区二区女搞男| 亚洲中文无码线在线观看| 美女隐私免费视频看| 一区二区三区观看免费中文视频在线播放 | 亚洲人成在线播放网站| xvideos永久免费入口| 男女免费观看在线爽爽爽视频 | 美丽姑娘免费观看在线观看中文版 | 亚洲第一黄片大全| 亚洲精品美女在线观看播放| 麻豆亚洲AV成人无码久久精品 | 最近2019中文字幕免费直播| 亚洲无码高清在线观看| 亚洲欧美日韩国产成人| 久久久久久国产精品免费免费男同 | 222www免费视频| 亚洲人成人一区二区三区| 国产精成人品日日拍夜夜免费| 免费国产a国产片高清| 亚洲首页国产精品丝袜| 日韩少妇内射免费播放| 拔擦拔擦8x华人免费久久| 国产色在线|亚洲| 国产精品色午夜视频免费看| 亚洲人成人伊人成综合网无码| 国产成人免费全部网站| 91视频精品全国免费观看| 亚洲综合伊人久久大杳蕉| 免费看内射乌克兰女| 免费精品国产自产拍观看| 亚洲精品国产第一综合99久久| 又粗又大又猛又爽免费视频| 亚洲精品视频免费观看| 中文字幕精品亚洲无线码一区| 24小时日本电影免费看| 午夜亚洲国产精品福利| 国产精品亚洲精品日韩已方| 精品无码AV无码免费专区|