Webpack中library,libraryTarget,externals的區別及做用

常常咱們會但願經過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時候的模塊名。

相關文章
相關標籤/搜索