最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Webpack的dll功能使用

 更新時(shí)間:2018年06月28日 09:47:17   作者:王成  
這篇文章主要介紹了Webpack的dll功能使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近使用Webpack遇到了一個(gè)坑。

我們構(gòu)建前端項(xiàng)目的時(shí)候,往往希望第三方庫(kù)(vendors)和自己寫的代碼可以分開(kāi)打包,因?yàn)榈谌綆?kù)往往不需要經(jīng)常打包更新。對(duì)此Webpack的文檔建議用CommonsChunkPlugin來(lái)單獨(dú)打包第三方庫(kù)。

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)
})

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

這么一來(lái),意味著每次發(fā)布版本的時(shí)候,vendor代碼都要刷新,即使我并沒(méi)有修改其中的代碼。這樣并不符合我們分開(kāi)打包的初衷。

帶著問(wèn)題我瀏覽了Github上的討論,發(fā)現(xiàn)了一個(gè)神器:dll。

Dll是Webpack最近新加的功能,我在網(wǎng)上并沒(méi)有找到什么中文的介紹,所以在這里我就簡(jiǎn)單介紹一下。

Dll這個(gè)概念應(yīng)該是借鑒了Windows系統(tǒng)的dll。一個(gè)dll包,就是一個(gè)純純的依賴庫(kù),它本身不能運(yùn)行,是用來(lái)給你的app引用的。

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

這么一來(lái)有幾個(gè)好處:

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

如何使用呢?

首先要先建立一個(gè)dll的配置文件,entry只包含第三方庫(kù):

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的選項(xiàng)中,path是manifest文件的輸出路徑;name是dll暴露的對(duì)象名,要跟output.library保持一致;context是解析包路徑的上下文,這個(gè)要跟接下來(lái)配置的dll user一致。

運(yùn)行Webpack,會(huì)輸出兩個(gè)文件一個(gè)是打包好的vendor.js,一個(gè)就是manifest.json,長(zhǎng)這樣:

{
 "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將每個(gè)庫(kù)都進(jìn)行了編號(hào)索引,之后的dll user可以讀取這個(gè)文件,直接用id來(lái)引用。

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的選項(xiàng)中,context需要跟之前保持一致,這個(gè)用來(lái)指導(dǎo)Webpack匹配manifest中庫(kù)的路徑;manifest用來(lái)引入剛才輸出的manifest文件。

運(yùn)行Webpack之后,結(jié)果如下:

對(duì)比一下不做分離的情況下打包的結(jié)果:

速度快了,文件也小了。

平時(shí)開(kāi)發(fā)的時(shí)候,修改代碼后重新編譯的速度會(huì)大大減少,節(jié)省時(shí)間。

如果有多個(gè)項(xiàng)目,使用相同的一套庫(kù),你可以在打包的時(shí)候引用相同的manifest文件,這樣就可以在項(xiàng)目之間共享了。

參考:

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 模擬彈出菜單的代碼

    模擬彈出菜單的代碼

    模擬彈出菜單的代碼...
    2007-08-08
  • 微信小程序使用map組件實(shí)現(xiàn)檢索(定位位置)周邊的POI功能示例

    微信小程序使用map組件實(shí)現(xiàn)檢索(定位位置)周邊的POI功能示例

    這篇文章主要介紹了微信小程序使用map組件實(shí)現(xiàn)檢索(定位位置)周邊的POI功能,涉及微信小程序基于map組件與高德地圖PAI接口的定位操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • js輪播圖的插件化封裝詳解

    js輪播圖的插件化封裝詳解

    這篇文章主要為大家詳細(xì)介紹了js輪播圖的插件化封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • webpack幾種手動(dòng)實(shí)現(xiàn)HMR的方式

    webpack幾種手動(dòng)實(shí)現(xiàn)HMR的方式

    眾所周知,在webpack中使用模塊熱替換(HMR),能夠使得應(yīng)用在運(yùn)行時(shí),本文就介紹一下如何實(shí)現(xiàn)HMR,感興趣的可以了解一下
    2021-07-07
  • webpack-loader的使用詳解

    webpack-loader的使用詳解

    webpack默認(rèn)只能處理js其他的像css,圖片都需要借助loader來(lái)處理,這篇文章主要介紹了webpack-loader的使用詳解,需要的朋友可以參考下
    2024-04-04
  • JS值當(dāng)前DIV的ID值的代碼

    JS值當(dāng)前DIV的ID值的代碼

    JS值當(dāng)前DIV的ID值的代碼...
    2007-05-05
  • 微信小程序使用navigator實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    微信小程序使用navigator實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    本周學(xué)習(xí)了navigtor到導(dǎo)航組件,目前我想使用navigtor組件實(shí)現(xiàn)跳轉(zhuǎn)以及返回功能,下面這篇文章主要給大家介紹了關(guān)于微信小程序使用navigator實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • javascript 方法覆寫實(shí)例代碼

    javascript 方法覆寫實(shí)例代碼

    以下頁(yè)面在運(yùn)行中,調(diào)試輸出的永遠(yuǎn)是alter('1'),原因是按照頁(yè)面加載從上至下的順序,同名的方法以最后一個(gè)為準(zhǔn).
    2009-01-01
  • JS實(shí)現(xiàn)向iframe中表單傳值的方法

    JS實(shí)現(xiàn)向iframe中表單傳值的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)向iframe中表單傳值的方法,涉及js針對(duì)頁(yè)面元素及表單屬性操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • 詳解webpack2異步加載套路

    詳解webpack2異步加載套路

    這篇文章主要介紹了詳解webpack2異步加載套路,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

许昌市| 綦江县| 新和县| 苍山县| 洛南县| 丹巴县| 广州市| 泊头市| 忻州市| 莲花县| 石首市| 潮安县| 华坪县| 广南县| 潼南县| 桦南县| 普兰县| 麟游县| 舒城县| 海原县| 大冶市| 营山县| 宜良县| 芦山县| 涟水县| 新津县| 泗洪县| 纳雍县| 江都市| 西华县| 涡阳县| 利津县| 西藏| 阿巴嘎旗| 炎陵县| 道孚县| 宣恩县| 巴东县| 芷江| 辛集市| 额济纳旗|