常常咱們會但願經過script方式引入庫,如CDN方式的jquery,咱們在使用的時候依舊用require方式,可是卻不但願webpack將他編譯到文件中。javascript
<script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
由於模塊化開發,杜絕一切全局變量,咱們想這樣去使用他:html
const $ = require("jquery"); $("#content").html("<h1>hello world</h1>");
這時,咱們須要配置externalsjava
module.exports = { output: { libraryTarget: "umd" }, externals: { jquery: "jQuery" }, ... }
看看編譯後什麼變化jquery
({ 0: function(...) { var jQuery = require(1); }, 1: function(...) { module.exports = jQuery; // 這裏是把window.jQuery賦值給了module.exports // 所以能夠使用require來引入 }, /* ... */ })
實際寫個例子,咱們常常會有本身處理業務數據的工具庫tools.js,傳統的方法沒有提供UMD的那些功能,只能從window或者global暴露方法webpack
window.Tools = { add: function (num1, num2) { return num1 + num2 }, }
而後script方式引入web
<script src="http://xxx/tools.min.js"></script>
使用以下瀏覽器
const res = Tools.add(1,2);
配置externals改形成模塊化開發方式模塊化
module.exports = { output: { libraryTarget: "umd" }, externals: { jquery: "jQuery" }, ... }
此時使用方式工具
const tools = require("myTools"); const res = tools.add(1,2);
externals的配置ui
1.首先是libraryTarget的配置,咱們使用umd方式,這樣即可以用任何一種引入方式,即支持cmd,amd,及全局
(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // Node, CommonJS之類的 module.exports = factory(require('jquery')); } else { // 瀏覽器全局變量(root 即 window) root.returnExports = factory(root.jQuery); } }(this, function ($) { // 方法 function myFunc(){}; // 暴露公共方法 return myFunc; }));
2.library和libraryTarget的使用
有時咱們想開發一個庫,如lodash,underscore這些工具庫,這些庫既能夠用commonjs和amd方式使用也能夠用script方式引入。
這時候咱們須要藉助library和libraryTarget,咱們只須要用ES6來編寫代碼,編譯成通用的UMD就交給webpack了。
例如上面的tools
exports default { add: function (num1, num2) { return num1 + num2; } }
接下來配置webpack
module.exports = { entry: { myTools: "./src/tools.js" }, output: { path: path.resolve(_dirname, "build"), filename: [name].js, chunkFilename: [name].min.js, libraryTarget: "umd", library: "tools" } }
library指定的是你require時候的模塊名。