欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

webpack external模塊的具體使用

 更新時(shí)間:2018年03月10日 15:28:53   作者:hyuan  
本篇文章主要介紹了webpack external模塊的具體使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

這篇文章討論Webpack打包library時(shí)經(jīng)常需要用到的一個(gè)選項(xiàng)external,它用于避免將一些很通用的模塊打包進(jìn)你發(fā)布的library里,而是選擇把它們聲明成external的模塊,在你的library被上層使用后,在最后階段由Webpack統(tǒng)一把這個(gè)external的依賴模塊打包進(jìn)來(lái)。

external選項(xiàng)一般都是用在打包library上面,如果不是library而是一個(gè)最終的app的發(fā)布JS文件,那external也沒有什么意義。關(guān)于Webpack打包library的分析和一些選項(xiàng)的作用,我在前一篇文章做了討論。

external選項(xiàng)

我們?nèi)匀皇褂们耙黄恼碌睦樱x一個(gè)庫(kù)util.js:

import $ from 'jquery'

function hideImages() {
 $('img').hide();
}

export default {
 "hideImages": hideImages
}

我們使用Webpack打包發(fā)布這個(gè)庫(kù):

// 入口文件
entry: {
 util: './util.js',
}

// 輸出文件
output: {
 path: './dist',
 filename: '[name].dist.js'

 library: 'util',
 libraryTarget: commonjs2,
 targetExport: 'default'
}

這樣打包出來(lái)的util.dist.js文件會(huì)把jquery的代碼完整地注入進(jìn)去,因?yàn)槟愕脑创a使用到了它。但是這往往并不是我們希望的,因?yàn)閖query是很通用的模塊,在一個(gè)app中,很可能其它的庫(kù)也會(huì)用到它,最頂層的入口文件app也可能用到它,如果每一個(gè)庫(kù)模塊的發(fā)布版本都將jquery原封不動(dòng)地打包進(jìn)了自己的bundle,最后拼到一起,在最終的app發(fā)布代碼里就會(huì)有很多份jquery的復(fù)制,當(dāng)然這可能并不會(huì)影響它的正常功能,但是會(huì)占據(jù)很大的代碼體積。

所以通常情況下當(dāng)你的庫(kù)需要依賴到例如jquery,bootstrap這樣的通用JS模塊時(shí),我們可以不將它打包進(jìn)bundle,而是在Webpack的配置中聲明external:

externals: {
 jquery: {
  root: 'jquery',
  commonjs: 'jquery',
  commonjs2: 'jquery',
  amd: 'jquery',
 },
},

這就是在告訴Webpack:請(qǐng)不要將這個(gè)模塊注入編譯后的JS文件里,對(duì)于我源代碼里出現(xiàn)的任何import/require這個(gè)模塊的語(yǔ)句,請(qǐng)將它保留。

我們可以看一下編譯后的bundle文件的結(jié)構(gòu):

module.exports = (function(modules) {
 var installedModules = {};
 function webpack_require(moduleId) {
   // ...
 }
 return webpack_require('./util.js');
}) ({
 './util.js': generated_util,
 // '/path/to/jquery.js': generated_jquery 原本有這一行,現(xiàn)在被刪去。
});

可以看到j(luò)query模塊沒有被打包進(jìn)bundle文件,而對(duì)于util,它的生成代碼即generated_util函數(shù)中關(guān)于import jquery相關(guān)的語(yǔ)句也被保留了原意:

function generated_util(module, exports, webpack_require) {
 var $ = require('jquery');
 // util的其它源代碼
 // ...
}

當(dāng)然也并非完全沒有修改,例如將import的改回了傳統(tǒng)的require關(guān)鍵詞,因?yàn)槲覀冞@里用的是CommonJS風(fēng)格的打包方式。不過(guò)這些都是次要的,關(guān)鍵是它保留了require這個(gè)關(guān)鍵詞,而沒有使用webpack_require將jquery真的引入進(jìn)來(lái)。這就是說(shuō),當(dāng)前的這個(gè)JS文件的模塊管理系統(tǒng)中是沒有jquery的,它是一個(gè)external的模塊,需要在這個(gè)JS文件被其它人引用并且在上層編譯時(shí),jquery才可能被真的引入進(jìn)來(lái),到那個(gè)時(shí)候這里的require關(guān)鍵詞才會(huì)被替換為webpack_require。

對(duì)于external的依賴模塊,通常你可以這樣做,例如你使用npm發(fā)布你的庫(kù),你可以將jquery在package.json文件中添加到dependencies,這樣別人npm install你發(fā)布的庫(kù)時(shí),jquery也會(huì)被自動(dòng)下載到node_modules供別人打包使用。

umd格式下的打包

如果我們使用umd格式打包,我們可以看到在不同環(huán)境中,external模塊是如何發(fā)揮作用的:

(function webpackUniversalModuleDefinition(root, factory) {
 if(typeof exports === 'object' && typeof module === 'object') // commonjs2
  module.exports = factory(require('jquery'));
 else if(typeof define === 'function' && define.amd)
  define("util", ['jquery'], factory); // amd
 else if(typeof exports === 'object')
  exports["util"] = factory(require('jquery')); // commonjs
 else
  root["util"] = factory(root['jquery']); // var
}) (window, function(__webpack_external_module_jquery__) {
 return (function(modules) {
  var installedModules = {};
  function webpack_require(moduleId) {
    // ...
  }
  return webpack_require('./util.js');
 }) ({
  './util.js': generated_util,
 });
}

而generated_util也相應(yīng)地增加一個(gè)參數(shù)__webpack_external_module_jquery__:

function generated_util(module, exports, webpack_require,
            __webpack_external_module_jquery__) {
 var $ = __webpack_external_module_jquery__;
 // util的其它源代碼
 // ...
}

這樣的寫法似乎結(jié)構(gòu)和上面的CommonJS的編譯版本不太一樣,但實(shí)際上本質(zhì)是一樣的。因?yàn)楝F(xiàn)在umd要照顧到不同的運(yùn)行環(huán)境,所以它把require('jquery')提前了,作為factory的參數(shù)傳入。對(duì)于每種運(yùn)行環(huán)境,各有各的做法:

  1. CommonJS:保留require('jquery')語(yǔ)句。
  2. AMD:在define中將jquery定義為依賴模塊。
  3. Var:從全局域中取出jquery變量,這需要jquery在該模塊之前就已經(jīng)被加載。

然后不管是哪種情況,它們都將載入后的jquery模塊作為參數(shù)傳入factory函數(shù),這樣就能正確加載util模塊了。

以上涉及到Webpack生成代碼的部分可能有點(diǎn)繞,需要你比較了解Webpack打包模塊的機(jī)制和原理,關(guān)于這部分我在這篇文章里做了詳細(xì)討論。

總結(jié)

以上就是關(guān)于Webpack的external選項(xiàng)的使用,并且從編譯后的JS代碼分析了它到底是如何起作用的。我想閱讀Webpack相關(guān)的生成代碼還是很重要的,這樣才算是真正地理解了external的機(jī)制,在碰到一些坑時(shí)才能知道怎么去debug。

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

您可能感興趣的文章:

相關(guān)文章

  • 最短的IE判斷代碼

    最短的IE判斷代碼

    以前最短的IE判定借助于IE不支持垂直制表符的特性搞出來(lái)的。
    2011-03-03
  • JS實(shí)現(xiàn)即點(diǎn)即編輯功能代碼

    JS實(shí)現(xiàn)即點(diǎn)即編輯功能代碼

    以前在網(wǎng)上都看到過(guò)類似的功能,不過(guò)沒自己想要實(shí)現(xiàn)過(guò),這次剛好做靜態(tài)頁(yè)面中有這樣的一個(gè)需求,就試著自己做做看,做完發(fā)現(xiàn)也不是什么很難的事情。
    2008-10-10
  • 使用JavaScript開發(fā)跨平臺(tái)的桌面應(yīng)用詳解

    使用JavaScript開發(fā)跨平臺(tái)的桌面應(yīng)用詳解

    下面小編就為大家?guī)?lái)一篇使用JavaScript開發(fā)跨平臺(tái)的桌面應(yīng)用詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • JavaScript HTML DOM 元素 (節(jié)點(diǎn))新增,編輯,刪除操作實(shí)例分析

    JavaScript HTML DOM 元素 (節(jié)點(diǎn))新增,編輯,刪除操作實(shí)例分析

    這篇文章主要介紹了JavaScript HTML DOM 元素 (節(jié)點(diǎn))新增,編輯,刪除操作,結(jié)合實(shí)例形式分析了JavaScript針對(duì)HTML DOM 元素 (節(jié)點(diǎn))的新增,編輯,刪除相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • JS實(shí)現(xiàn)彈性漂浮效果的廣告代碼

    JS實(shí)現(xiàn)彈性漂浮效果的廣告代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)彈性漂浮效果的廣告代碼,涉及javascript動(dòng)態(tài)操作圖片彈性運(yùn)動(dòng)效果的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • ES6新特性之Object的變化分析

    ES6新特性之Object的變化分析

    這篇文章主要介紹了ES6新特性之Object的變化,結(jié)合具體實(shí)例形式分析了ES6中Object對(duì)象定義與使用方法的變化,需要的朋友可以參考下
    2017-03-03
  • 原生JS實(shí)現(xiàn)美圖瀑布流布局賞析

    原生JS實(shí)現(xiàn)美圖瀑布流布局賞析

    瀑布流布局很受廣大網(wǎng)民的青睞,本篇文章給大家介紹原生JS實(shí)現(xiàn)美圖瀑布流布局,非常漂亮,需要的朋友可以參考下
    2015-09-09
  • 微信小程序JS加載esmap地圖的實(shí)例詳解

    微信小程序JS加載esmap地圖的實(shí)例詳解

    這篇文章主要介紹了微信小程序JS加載esmap地圖的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解微信小程序 頁(yè)面跳轉(zhuǎn) 傳遞參數(shù)

    詳解微信小程序 頁(yè)面跳轉(zhuǎn) 傳遞參數(shù)

    這篇文章主要介紹了詳解微信小程序 頁(yè)面跳轉(zhuǎn) 傳遞參數(shù),現(xiàn)在分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • JavaScript中的null和undefined解析

    JavaScript中的null和undefined解析

    在JavaScript開發(fā)中,被人問(wèn)到:null與undefined到底有啥區(qū)別? 一時(shí)間不好回答,特別是undefined,因?yàn)檫@涉及到undefined的實(shí)現(xiàn)原理
    2012-04-04

最新評(píng)論