<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關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        詳解如何webpack使用DllPlugin

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:06:48
        文檔

        詳解如何webpack使用DllPlugin

        詳解如何webpack使用DllPlugin:前言 (時(shí)光飛逝,轉(zhuǎn)眼又偷懶了一個(gè)多月) 什么是DLL DLL(Dynamic Link Library)文件為動(dòng)態(tài)鏈接庫文件,在Windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對獨(dú)立的動(dòng)態(tài)鏈接庫,即DLL文件,放置于系統(tǒng)中。當(dāng)我們執(zhí)行某一個(gè)程序時(shí),相應(yīng)
        推薦度:
        導(dǎo)讀詳解如何webpack使用DllPlugin:前言 (時(shí)光飛逝,轉(zhuǎn)眼又偷懶了一個(gè)多月) 什么是DLL DLL(Dynamic Link Library)文件為動(dòng)態(tài)鏈接庫文件,在Windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對獨(dú)立的動(dòng)態(tài)鏈接庫,即DLL文件,放置于系統(tǒng)中。當(dāng)我們執(zhí)行某一個(gè)程序時(shí),相應(yīng)

        舉個(gè)例子:很多產(chǎn)品都用到螺絲,但是工廠在生產(chǎn)不同產(chǎn)品時(shí),不需要每次連帶著把螺絲也生產(chǎn)出來,因?yàn)槁萁z可以單獨(dú)生產(chǎn),并給多種產(chǎn)品使用。在這里螺絲的作用就可以理解為是dll。

        為什么要使用Dll

        通常來說,我們的代碼都可以至少簡單區(qū)分成業(yè)務(wù)代碼和第三方庫。如果不做處理,每次構(gòu)建時(shí)都需要把所有的代碼重新構(gòu)建一次,耗費(fèi)大量的時(shí)間。然后大部分情況下,很多第三方庫的代碼并不會(huì)發(fā)生變更(除非是版本升級),這時(shí)就可以用到dll:把復(fù)用性較高的第三方模塊打包到動(dòng)態(tài)鏈接庫中,在不升級這些庫的情況下,動(dòng)態(tài)庫不需要重新打包,每次構(gòu)建只重新打包業(yè)務(wù)代碼。

        還是上面的例子:把每次構(gòu)建,當(dāng)做是生產(chǎn)產(chǎn)品的過程,我們把生產(chǎn)螺絲的過程先提取出來,之后我們不管調(diào)整產(chǎn)品的功能或者設(shè)計(jì)(對應(yīng)于業(yè)務(wù)代碼變更),都不必重復(fù)生產(chǎn)螺絲(第三方模塊不需要重復(fù)打包);除非是產(chǎn)品要使用新型號的螺絲(第三方模塊需要升級),才需要去重新生產(chǎn)新的螺絲,然后接下來又可以專注于調(diào)整產(chǎn)品本身。

        基本用法

        使用dll時(shí),可以把構(gòu)建過程分成dll構(gòu)建過程和主構(gòu)建過程(實(shí)質(zhì)也就是如此),所以需要兩個(gè)構(gòu)建配置文件,例如叫做webpack.config.jswebpack.dll.config.js

        1. 使用DLLPlugin打包需要分離到動(dòng)態(tài)庫的模塊

        DllPluginwebpack內(nèi)置的插件,不需要額外安裝,直接配置webpack.dll.config.js文件:

        module.exports = {=
         entry: {
         // 第三方庫
         react: ['react', 'react-dom', 'react-redux']
         },
         output: {
         // 
        輸出的動(dòng)態(tài)鏈接庫的文件名稱,[name] 代表當(dāng)前動(dòng)態(tài)鏈接庫的名稱, filename: '[name].dll.js', path: resolve('dist/dll'), // library必須和后面dllplugin中的name一致 后面會(huì)說明 library: '[name]_dll_[hash]' }, plugins: [ // 接入 DllPlugin new webpack.DllPlugin({ // 動(dòng)態(tài)鏈接庫的全局變量名稱,需要和 output.library 中保持一致 // 該字段的值也就是輸出的 manifest.json 文件 中 name 字段的值 name: '[name]_dll_[hash]', // 描述動(dòng)態(tài)鏈接庫的 manifest.json 文件輸出時(shí)的文件名稱 path: path.join(__dirname, 'dist/dll', '[name].manifest.json') }), ] }

        我們先來看看,這一步到底做了什么。執(zhí)行:webpack --config webpack.dll.config,然后到指定的輸出文件夾查看輸出:

      1. react.dll文件里是使用數(shù)組保存的模塊,索引值就作為id;
      2. react.manifest.json文件里,是用來描述對應(yīng)的dll文件里保存的模塊
      3. 里暴露出剛剛構(gòu)建的所有模塊,如下:

        {
         "name":"react_dll_553e24e2c44987d2578f",
         "content":{
         "./node_modules/webpack/node_modules/process/browser.js":{"id":0,"meta":{}},"./node_modules/react/node_modules/fbjs/lib/invariant.js":{"id":1,"meta":{}},"./node_modules/react/lib/Object.assign.js":{"id":2,"meta":{}},"./node_modules/react/node_modules/fbjs/lib/warning.js":{"id":3,"meta":{}}
         //省略相似代碼
         }
        }

        2. 在主構(gòu)建配置文件使用動(dòng)態(tài)庫文件

        webpack.config中使用dll要用到DllReferencePlugin,這個(gè)插件通過引用 dll 的 manifest 文件來把依賴的名稱映射到模塊的 id 上,之后再在需要的時(shí)候通過內(nèi)置的 webpack_require 函數(shù)來 require 他們.

         new webpack.DllReferencePlugin({
         context: __dirname,
         manifest: require('./dist/dll/react.manifest.json')
         }),

        第一步產(chǎn)出的manifest文件就用在這里,給主構(gòu)建流程作為查找dll的依據(jù):DllReferencePlugin去 manifest.json 文件讀取 name 字段的值,把值的內(nèi)容作為在從全局變量中獲取動(dòng)態(tài)鏈接庫中內(nèi)容時(shí)的全局變量名,因此:在 webpack_dll.config.js 文件中,DllPlugin 中的 name 參數(shù)必須和 output.library 中保持一致。

        3. 在入口文件引入dll文件。

        生成的dll暴露出的是全局函數(shù),因此還需要在入口文件里面引入對應(yīng)的dll文件。

        <body>
         <div id="app"></div>
         <!--引用dll文件-->
         <script src="../../dist/dll/react.dll.js" ></script>
        </body>

        作用

        首先從前面的介紹,至少可以看出dll的兩個(gè)作用

        分離代碼,業(yè)務(wù)代碼和第三方模塊可以被打包到不同的文件里,這個(gè)有幾個(gè)好處:

        1. 避免打包出單個(gè)文件的大小太大,不利于調(diào)試
        2. 將單個(gè)大文件拆成多個(gè)小文件之后,一定情況下有利于加載(不超出瀏覽器一次性請求的文件數(shù)情況下,并行下載肯定比串行快)

        提升構(gòu)建速度。第三方庫沒有變更時(shí),由于我們只構(gòu)建業(yè)務(wù)相關(guān)代碼,相比全部重新構(gòu)建自然要快的多。

        注意事項(xiàng)

        從前面可以看到dll帶來的優(yōu)點(diǎn),但并不意味著我們就應(yīng)該把除業(yè)務(wù)代碼外的所有代碼全部都丟到dll中,舉一個(gè)例子:
        1.對于lodash這種第三方庫,正確的用法是只去import所需的函數(shù)(用什么引什么),例如:

        // 正確用法
        import isPlainObject from 'lodash/isPlainObject'
        
        //錯(cuò)誤用法
        import { isPlainObject } from 'lodash'

        這兩種寫法的差別在于,打包時(shí)webpack會(huì)根據(jù)引用去打包依賴的內(nèi)容,所以第一種寫法,webpack只會(huì)打包lodash的isPlainObject庫,第二種寫法卻會(huì)打包整個(gè)lodash。現(xiàn)在假設(shè)在項(xiàng)目中只是用到不同模塊對lodash里的某幾個(gè)函數(shù)并且沒有對于某個(gè)函數(shù)重復(fù)使用非常多次,那么這時(shí)候把lodash添加到dll中,帶來的收益就并不明顯,反而導(dǎo)致2個(gè)問題:

        1. 由于打包了整個(gè)lodash,而導(dǎo)致打包后的文件總大小(注意是總大小)比原先還要大
        2. 在dll打包太多內(nèi)容也需要耗費(fèi)時(shí)間,雖然我們一般只在第三方模塊更新之后才進(jìn)行重新預(yù)編譯(就是dll打包的過程),但是如果這個(gè)時(shí)間太長的話體驗(yàn)也不好、

        實(shí)踐與反思

        放一張自己在一個(gè)比較大的項(xiàng)目中單純使用dll之后的收益,提取的內(nèi)容是 react相關(guān)的第三方庫,和fish組件,構(gòu)建時(shí)間從120s降低到80s左右(當(dāng)然這個(gè)時(shí)間還是有點(diǎn)恐怖),構(gòu)建前appjs的大小是680kb,拆分業(yè)務(wù)代碼和第三方代碼分別是400kb和380kb(這就是拆分后大小大于拆分前大小的例子),從這一點(diǎn)來看,對于常見第三方庫是否要放進(jìn)dll可能比較明確(比如react系列打包一般肯定不虧),但是還有一些就要結(jié)合具體的項(xiàng)目內(nèi)容來進(jìn)行判斷和取舍。(強(qiáng)烈推薦使用webpack-bundle-analyzer插件進(jìn)行性能分析)



        總結(jié)

        本文介紹了Dllplugin的思想,基本用法和應(yīng)用場景(關(guān)于使用的部分更詳細(xì)的內(nèi)容可以看官方文檔),結(jié)合個(gè)人的一些實(shí)踐經(jīng)驗(yàn),對于常見第三方庫是否要放進(jìn)dll可能比較明確(比如react系列打包一般肯定不虧),但是還有一些就要結(jié)合具體的項(xiàng)目內(nèi)容來判斷,例如我上面的實(shí)踐的例子就說明目前的拆分還不夠好。這一塊也歡迎大家一起探討。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        詳解如何webpack使用DllPlugin

        詳解如何webpack使用DllPlugin:前言 (時(shí)光飛逝,轉(zhuǎn)眼又偷懶了一個(gè)多月) 什么是DLL DLL(Dynamic Link Library)文件為動(dòng)態(tài)鏈接庫文件,在Windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對獨(dú)立的動(dòng)態(tài)鏈接庫,即DLL文件,放置于系統(tǒng)中。當(dāng)我們執(zhí)行某一個(gè)程序時(shí),相應(yīng)
        推薦度:
        標(biāo)簽: 使用 詳解 怎樣
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲AV无码一区二区三区性色 | 叮咚影视在线观看免费完整版| 国产在线观看xxxx免费| 久久久久免费看成人影片| 99精品热线在线观看免费视频| 亚洲一级片免费看| 国产AV旡码专区亚洲AV苍井空| 韩国免费a级作爱片无码| 亚洲一区二区三区无码影院| 国产亚洲精品免费| 国产免费AV片在线播放唯爱网| 亚洲午夜无码久久久久| 亚洲国产午夜精品理论片在线播放 | 亚洲免费二区三区| 永久亚洲成a人片777777| 久久精品国产99国产精品亚洲| 中出五十路免费视频| 亚洲国产精品va在线播放| 精品国产亚洲AV麻豆| 丁香花免费高清视频完整版| 亚洲卡一卡2卡三卡4麻豆| 久久狠狠躁免费观看| 亚洲午夜久久久久久噜噜噜| 国产一级淫片a免费播放口| 亚洲午夜爱爱香蕉片| 免费毛片a线观看| 亚洲激情黄色小说| 最近中文字幕免费完整| 99亚偷拍自图区亚洲| 四虎永久成人免费| 欧美亚洲精品一区二区| 无码不卡亚洲成?人片| 亚洲码欧美码一区二区三区| 免免费国产AAAAA片| 亚洲图片中文字幕| 国产电影午夜成年免费视频 | 亚洲日本乱码在线观看| 69视频在线是免费观看| 小说区亚洲自拍另类| 亚洲国产精品无码av| 好爽…又高潮了免费毛片|