Webpack DllPlugin 讓構(gòu)建速度柔順絲滑

概念

DLLPlugin 和 DLLReferencePlugin 用某種方法實(shí)現(xiàn)了拆分 bundles,同時(shí)還大大提升了構(gòu)建的速度,將包含大量復(fù)用模塊且不會(huì)頻繁更新的庫進(jìn)行編譯襟锐,只需要編譯一次疫赎,編譯完成后存在指定的文件中祈惶。在之后的構(gòu)建過程中不會(huì)再對(duì)這些模塊進(jìn)行編譯米苹,而是直接使用 DllReferencePlugin 來引用動(dòng)態(tài)鏈接庫的代碼稚字。一般會(huì)對(duì)常用的第三方模塊使用這種方式雕崩,例如 react鳖谈、react-dom、lodash 等缆娃。只要這些模塊不升級(jí)更新捷绒,這些動(dòng)態(tài)鏈接庫就不需要重新編譯。

摘要

本文介紹了 Webpack 中 DllPlugin 插件的使用贯要,以及配合使用 AddAssetHtmlPlugin 或者 HtmlWebpackIncludeAssetsPlugin 將構(gòu)建好的 JS 文件插入到 html頁面中

代碼地址

github: 源碼

歡迎交流暖侨,Star!

項(xiàng)目目錄

常規(guī)webpack項(xiàng)目崇渗,搭建過程本文章不在描述

myreact
|- /build
  |- webpack.config.js
  |- webpack.dll.conf.js
|- /dist
  |- dll
  |- js
|- /src
  |- index.js
|- package.json
|- index.html

具體項(xiàng)目結(jié)構(gòu)字逗,請(qǐng)看下圖

image

下面開始DLL之旅

一.build目錄下創(chuàng)建webpack.dll.conf.js(DLLPlugin)

const webpack = require("webpack")
const path = require('path')
const CleanWebpaclPlugin = require('clean-webpack-plugin');
const resolve = (dir) => path.join(__dirname, '..', dir);

module.exports = {
  entry: {
    # 將 react、lodash等模塊作為入口編譯成動(dòng)態(tài)鏈接庫
    vendor: ['react', 'react-dom', 'react-router-dom', 'lodash']
  },
  output: {
    # 指定生成文件所在目錄文件夾宅广,
    # 將它們存放在了 src 文件夾下
    path: resolve('public'),
    # 指定文件名
    library: '_dll_[name]',
    # 存放動(dòng)態(tài)鏈接庫的全局變量名稱葫掉,例如對(duì)應(yīng) lodash 來說就是 lodash_dll_lib
    # 這個(gè)名稱需要與 DllPlugin 插件中的 name 屬性值對(duì)應(yīng)起來
    filename: 'dll/_dll_[name].[hash].js'
  },
  plugins: [
    new CleanWebpaclPlugin(['dll'], {
        root: resolve('public')
    }),
    new webpack.DllPlugin({
      name: '_dll_[name]',
    # 和output.library中一致,值就是輸出的manifest.json中的 name值
      path: path.join(__dirname, '../public/dll', '[name].manifest.json')
    })
  ]
}

二. 創(chuàng)建webpack.base.conf.js 使用 DllReferencePlugin

const path = require('path');
const webpack = require('webpack');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const CleanWebpaclPlugin = require('clean-webpack-plugin');
const resolve = (dir) => path.join(__dirname, '..', dir);

module.exports = {
    entry: './src/index.js',
    output: {
        path: resolve('dist'),
        filename: 'js/[name].[hash].js',
        library: '_dll_[name]'
    },
    plugins: [
        # 需添加root 否則無法刪除跟狱,exclude未生效
        new CleanWebpackPlugin(['dist'], {
          root: path.join(__dirname, '..')
        }),
        new HTMLWebpackPlugin({
            title: 'Webpak DllPlugin 的使用',
            template: resolve('index.html'),
            filename: 'index.html'
        }),
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': JSON.stringify('production')
        }),
        # 告訴 Webpack 使用動(dòng)態(tài)鏈接庫
        new webpack.DllReferencePlugin({
            // 描述 lodash 動(dòng)態(tài)鏈接庫的文件內(nèi)容
            manifest: require(../public/dll/vendor.manifest')
        })
    ]
}

三俭厚、在 index.html 文件中引入動(dòng)態(tài)鏈接庫

由于動(dòng)態(tài)鏈接庫我們一般只編譯一次,除非依賴的三方庫更新驶臊,之后就不用編譯挪挤,因此入口的 index.js 文件中不包含這些模塊叼丑,所以要在 index.html 中單獨(dú)引入。

兩種方案

  1. 手動(dòng)添加script扛门,手動(dòng)copy打包好的dll文件夾到dist鸠信,麻煩反復(fù),很不爽
  2. 使用add-asset-html-webpack-plugin或者h(yuǎn)tml-webpack-include-assets-plugin插入到html中论寨,簡單自動(dòng)化星立,美滋滋

所以我們肯定會(huì)采用第二種方式,下面著重講下add-asset-html-webpack-plugin與html-webpack-include-assets-plugin插件的使用葬凳,項(xiàng)目中使用add-asset-html-webpack-plugin

安裝大同小異

npm install add-asset-html-webpack-plugin -D
npm install html-webpack-include-assets-plugin -D

使用也有相似的地方

webpack.base.conf.js 文件中進(jìn)行使用

# add-asset-html-webpack-plugin
...;
const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');

module.exports = {
    ...,
    plugins: [
        ...,
        # 給定的 JS 或 CSS 文件添加到 webpack 配置的文件中贞铣,并將其放入資源列表 html webpack插件注入到生成的 html 中。
        new AddAssetHtmlPlugin([
            {
                # 要添加到編譯中的文件的絕對(duì)路徑
                filepath: path.resolve(__dirname,'../public/dll/_dll_vendor.js'),
                outputPath: 'dll',
                publicPath: 'dll',
                includeSourcemap: false
            }
        ])
    ]
}

# html-webpack-include-assets-plugin
...;
const HtmlWebpackIncludeAssetsPlugin = require('html-webpack-include-assets-plugin');

module.exports = {
    ...,
    plugins: [
        ...,
        # 給定的 JS 或 CSS 文件添加到 webpack 配置的文件中沮明,并將其放入資源列表 html webpack插件注入到生成的 html 中。
        new HtmlWebpackIncludeAssetsPlugin([
            {
                assets: ['dll/_dll_vendor.js'],
                append: false
            }
        ])
    ]
}

兩者區(qū)別

image

index.html

<!DOCTYPE html>
<html>
    
    <head>
        <meta charset="UTF-8">
        <title>愛你的一只貓哈哈哈1111</title>
    </head>
    
    <body>
        <div id='root'></div>

</html>
<script type="text/javascript" src="dll/_dll_vendor.js"></script>
<script type="text/javascript" src="/js/runtime.830efec54753fd6ed91b.js"></script>
<script type="text/javascript" src="/js/vendors.830efec54753fd6ed91b.js"></script>
<script type="text/javascript" src="/js/app.830efec54753fd6ed91b.js"></script>

運(yùn)行項(xiàng)目

 npm run build

查看dist文件下的文件

相關(guān)文檔

webpack 中文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窍奋,一起剝皮案震驚了整個(gè)濱河市荐健,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琳袄,老刑警劉巖江场,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窖逗,居然都是意外死亡址否,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門碎紊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佑附,“玉大人,你說我怎么就攤上這事仗考∫敉” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵秃嗜,是天一觀的道長权均。 經(jīng)常有香客問我,道長锅锨,這世上最難降的妖魔是什么叽赊? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮必搞,結(jié)果婚禮上必指,老公的妹妹穿的比我還像新娘。我一直安慰自己顾画,他們只是感情好取劫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布匆笤。 她就那樣靜靜地躺著,像睡著了一般谱邪。 火紅的嫁衣襯著肌膚如雪炮捧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天惦银,我揣著相機(jī)與錄音咆课,去河邊找鬼。 笑死扯俱,一個(gè)胖子當(dāng)著我的面吹牛书蚪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迅栅,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼殊校,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了读存?” 一聲冷哼從身側(cè)響起为流,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎让簿,沒想到半個(gè)月后敬察,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尔当,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年莲祸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭迎。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐帜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畜号,到底是詐尸還是另有隱情抹估,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布弄兜,位于F島的核電站药蜻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏替饿。R本人自食惡果不足惜语泽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望视卢。 院中可真熱鬧踱卵,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至西饵,卻和暖如春酝掩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眷柔。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工期虾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驯嘱。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓镶苞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞠评。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茂蚓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 態(tài)度其實(shí)是動(dòng)態(tài)的煌贴,會(huì)隨著時(shí)間、空間的轉(zhuǎn)移而變換锥忿。最近有一種強(qiáng)烈的感慨,那就是“活著真TM的好”怠肋!這種感慨來源于前天...
    zjjtudou閱讀 465評(píng)論 0 1
  • 下午順利回來敬鬓,明天要接著上班啊。 一天的會(huì)議笙各,半天的游玩钉答,住宿兩晚,來回兩個(gè)三小時(shí)的汽車行程杈抢。算是圓滿結(jié)束啦数尿。 吃...
    小王子的前世今生閱讀 193評(píng)論 0 0
  • 1,2惶楼,3右蹦,4,5歼捐, 胎教興起就開始讀書何陆。 念過了少年, 青春的考卷有點(diǎn)兒突兀豹储。 愛情的朦朧贷盲, 羞澀了夜的玫瑰。 ...
    咪咪139318閱讀 412評(píng)論 4 18