中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在webpack中使用external模塊

發布時間:2021-03-17 16:18:54 來源:億速云 閱讀:342 作者:Leah 欄目:web開發

本篇文章給大家分享的是有關如何在webpack中使用external模塊,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

external選項

import $ from 'jquery'

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

export default {
 "hideImages": hideImages
}

我們使用Webpack打包發布這個庫:

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

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

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

這樣打包出來的util.dist.js文件會把jquery的代碼完整地注入進去,因為你的源代碼使用到了它。但是這往往并不是我們希望的,因為jquery是很通用的模塊,在一個app中,很可能其它的庫也會用到它,最頂層的入口文件app也可能用到它,如果每一個庫模塊的發布版本都將jquery原封不動地打包進了自己的bundle,最后拼到一起,在最終的app發布代碼里就會有很多份jquery的復制,當然這可能并不會影響它的正常功能,但是會占據很大的代碼體積。

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

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

這就是在告訴Webpack:請不要將這個模塊注入編譯后的JS文件里,對于我源代碼里出現的任何import/require這個模塊的語句,請將它保留。

我們可以看一下編譯后的bundle文件的結構:

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 原本有這一行,現在被刪去。
});

可以看到jquery模塊沒有被打包進bundle文件,而對于util,它的生成代碼即generated_util函數中關于import jquery相關的語句也被保留了原意:

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

當然也并非完全沒有修改,例如將import的改回了傳統的require關鍵詞,因為我們這里用的是CommonJS風格的打包方式。不過這些都是次要的,關鍵是它保留了require這個關鍵詞,而沒有使用webpack_require將jquery真的引入進來。這就是說,當前的這個JS文件的模塊管理系統中是沒有jquery的,它是一個external的模塊,需要在這個JS文件被其它人引用并且在上層編譯時,jquery才可能被真的引入進來,到那個時候這里的require關鍵詞才會被替換為webpack_require。

對于external的依賴模塊,通常你可以這樣做,例如你使用npm發布你的庫,你可以將jquery在package.json文件中添加到dependencies,這樣別人npm install你發布的庫時,jquery也會被自動下載到node_modules供別人打包使用。

umd格式下的打包

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

(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也相應地增加一個參數__webpack_external_module_jquery__:

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

這樣的寫法似乎結構和上面的CommonJS的編譯版本不太一樣,但實際上本質是一樣的。因為現在umd要照顧到不同的運行環境,所以它把require('jquery')提前了,作為factory的參數傳入。對于每種運行環境,各有各的做法:

  1. CommonJS:保留require('jquery')語句。

  2. AMD:在define中將jquery定義為依賴模塊。

  3. Var:從全局域中取出jquery變量,這需要jquery在該模塊之前就已經被加載。

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

以上就是如何在webpack中使用external模塊,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北流市| 昭通市| 施甸县| 建水县| 二手房| 房产| 宜丰县| 木兰县| 安新县| 桑日县| 新干县| 奉节县| 忻州市| 虞城县| 内丘县| 宁都县| 聂荣县| 伊吾县| 苗栗市| 庄河市| 凉城县| 沈阳市| 富锦市| 东海县| 启东市| 文成县| 阳原县| 称多县| 宜城市| 德清县| 巴中市| 邹城市| 玉山县| 海兴县| 南澳县| 兴和县| 南召县| 门头沟区| 鲁甸县| 武强县| 五河县|