通過DllPlugin DllReferencePlugin 實現依賴包分開打包并注入到代碼中

前言:

最近在優(yōu)化項目的時候,發(fā)現隨著前端項目變得越來越大华嘹,導致vendor.js也隨之變得很大反浓,雖然用了代碼分離和依賴文件按需加載任内,解決了vendor.js單個文件比較大的問題。 但是每次運行打包都需要很久牌里,這個讓人也很痛苦含衔。于是開始研究怎么優(yōu)化這些結構。首先二庵,項目中有很多依賴文件贪染,webpack每次在打包這些文件是很耗時的,但是這些文件在項目開發(fā)過程中是基本上不會變的催享。 這樣每次都打包就顯得很浪費杭隙。
基礎技術框架: vue2.0生成的項目文件結構。webpack@^1.13.2

探索過程:

webpack打包優(yōu)化因妙。于是就找到了webpack 優(yōu)化 體積篇痰憎, 這篇文章,優(yōu)質好文攀涵。 里面提供了兩種方案铣耘, 一種是webpack的external配置依賴; 一種就是本文介紹的 DllPlugin&DllReferencePlugin以故。 前者比較簡單蜗细,使用起來也很方便。但是不夠靈活怒详。 于是作者采用了第二種方案炉媒。
第二種方案的好處就是可以按需將多個依賴打包成一個js文件。 在js中還是可以正常引用昆烁,同時逼格也稍微高一點吊骤, 我承認是因為這一點選擇的這個方案。 但是看了文章中的第二個方案后發(fā)現静尼。我只能把文件打包成js白粉,并不能很完美的在index.html中引入這個js文件传泊。 這個真的很苦惱, 這么明顯掉逼格的方式博主肯定是不會用的鸭巴。于是開始研究解決方案眷细,首先想到的是html-webpack-plugin, 這個插件是webpack中用作將webpack打包后輸出的文件chunks,插入到HTML中的奕扣。 但是有兩個限制條件:

  1. 我們這里的dll.js 是提前打包好了的薪鹦,而不是在每次build的時候去打包輸出的;這樣才能做到依賴包一次構建惯豆,無限次使用
  2. vue中webpack輸出的文件名都帶有hash值池磁; 而用dll構建后輸出的文件名是固定的。

博主就想到了一個歪招楷兽, 就是在html-webpack-plugin中添加自定義參數地熄,然后再HTML中使用 ejs語法 htmlWebpackPlugin.options.xx來獲取參數值,來向HTML中注入script標簽芯杀。 后來發(fā)現在本地開發(fā)環(huán)境每次啟動都會編譯失敗端考, 導致script標簽插入不進去。本來就已經絕望了揭厚,要放棄了却特。 但是這個時候其實距離最后的成功已經很近了。html-webpack-plugin中HTML 是支持ejs語法的筛圆,只是沒有從html-webpack-plugin中正確的獲取到參數裂明。 只要能夠將參數通過webpack的配置傳到HTML頁面,就大功告成了太援。
html-webpack-plugin中有句話:webpackConfig: the webpack configuration that was used for this compilation. This can be used, for example, to get the publicPath (webpackConfig.output.publicPath) 就是HTML中可以通過webpackConfig獲取到webpack的配置闽晦。 哈哈, 這就可以了提岔。[注: 此功能在webpack2.0以上不能使用]

=====================================
一個月后
當博主想要自己做一個插件的時候仙蛉,發(fā)現了這個好用的小工具 add-asset-html-webpack-plugin, 正是博主要實現的功能碱蒙, 果斷使用荠瘪。 有個小坑, 在附錄代碼中會說明振亮。
=====================================

下面是主要文件的配置巧还。 有問題歡迎反饋。

操作:

  1. config/index.js 中配置依賴包
modules.exports = {
…. 原始配置
library: {
    'lib_v1_0': ["babel-polyfill", "mqtt"],
    'vueBucket_v1_2': [
      "vue/dist/vue.esm.js",
      "vue-lazyload",
      "vue-resource",
      "vue-router",
      "vuex",
      "vuex-router-sync",
    ]
  }
}
  1. 新建 build/webpack.dll.conf.js
    • 這個文件讀取config/index.js 的library 中配置了那些module需要打包
    • dll build 導出manifest.json 文件坊秸, 留給 DllReferencePlugin在打包時候識別dll都打包了那些node_module
// webpack.dll.conf.js
const webpack = require('webpack');
const path = require('path')
const CleanWebpackPlugin = require('clean-webpack-plugin');
const {build, dev, library} = require('../config')
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? build.assetsSubDirectory : dev.assetsSubDirectory

module.exports = {
  // 讀取library.entry 里配置的node_module
  entry: library,
  // 輸出到static文件夾下面, 補充知識[vue項目目錄之static]
  output: {
    path: path.resolve(__dirname, '..', assetsSubDirectory),
    filename: `[name].dll.js`,
    library: '[name]_library'
  },
  plugins: [
    new CleanWebpackPlugin(['static'], { root: path.resolve(__dirname, '..')}),
    // 文件輸出到 ./build/manifest.json 中
    new webpack.DllPlugin({
        path: path.resolve(__dirname, '..', assetsSubDirectory, '[name].manifest.json'),
        name: '[name]_library',
    }),
    // 壓縮打包的文件
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: false
      }
    })
  ]
};
  1. 解析dll打包的node_module
// webpack.base.conf.js
var path = require('path')
var config = require('../config')
var webpack = require('webpack')
var AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');
...

module.exports = {
  ...
  plugins: [
    ...,
    ...Object.keys(config.library).map(name => {
      return new webpack.DllReferencePlugin({
        context: '.',
        manifest: require(`../static/${name}.manifest.json`),
      })
    }),
    new AddAssetHtmlPlugin(Object.keys(config.library).map(name => {
      return {
        filepath: require.resolve(path.resolve(`./static/${name}.dll.js`)),
        includeSourcemap: false
      }
    })),
  ]
}
  1. package.json中配置打包命令
  • 運行命令 npm run build:dll
{
  "scripts": {
    "dev": "node build/dev-server.js",
    "build:dll": "webpack --config build/webpack.dll.conf.js"
  }
}
  1. 項目目錄如下


    目錄.png

參考知識:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末阶牍,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子星瘾,更是在濱河造成了極大的恐慌走孽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琳状,死亡現場離奇詭異磕瓷,居然都是意外死亡,警方通過查閱死者的電腦和手機念逞,發(fā)現死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門困食,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翎承,你說我怎么就攤上這事硕盹。” “怎么了叨咖?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵瘩例,是天一觀的道長。 經常有香客問我甸各,道長垛贤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任趣倾,我火速辦了婚禮聘惦,結果婚禮上,老公的妹妹穿的比我還像新娘誊酌。我一直安慰自己部凑,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布碧浊。 她就那樣靜靜地躺著涂邀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箱锐。 梳的紋絲不亂的頭發(fā)上比勉,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音驹止,去河邊找鬼浩聋。 笑死,一個胖子當著我的面吹牛臊恋,可吹牛的內容都是我干的衣洁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼抖仅,長吁一口氣:“原來是場噩夢啊……” “哼坊夫!你這毒婦竟也來了砖第?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤环凿,失蹤者是張志新(化名)和其女友劉穎梧兼,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體智听,經...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡羽杰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了到推。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考赛。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖环肘,靈堂內的尸體忽然破棺而出欲虚,到底是詐尸還是另有隱情,我是刑警寧澤悔雹,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布复哆,位于F島的核電站,受9級特大地震影響腌零,放射性物質發(fā)生泄漏梯找。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一益涧、第九天 我趴在偏房一處隱蔽的房頂上張望锈锤。 院中可真熱鬧,春花似錦闲询、人聲如沸久免。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阎姥。三九已至,卻和暖如春鸽捻,著一層夾襖步出監(jiān)牢的瞬間呼巴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工御蒲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衣赶,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓厚满,卻偏偏與公主長得像府瞄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碘箍,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容

  • GitChat技術雜談 前言 本文較長摘能,為了節(jié)省你的閱讀時間续崖,在文前列寫作思路如下: 什么是 webpack敲街,它要...
    蕭玄辭閱讀 12,699評論 7 110
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺团搞,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,180評論 7 35
  • 寫在開頭 先說說為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,298評論 4 31
  • 前言 WebPack 是什么多艇? WebPack 是什么逻恐,WebPack 可以看做是模塊打包機:它做的事情是,分析你...
    Promise__閱讀 1,130評論 3 12
  • 概念 當某個對象觸發(fā)了某種事件時峻黍,所發(fā)生的一切詳細信息保存在一個臨時的地方复隆,這個地方叫做事件對象(黑匣子) 獲取事...
    哪樹繁花閱讀 322評論 0 0