• Webpack中library,libraryTarget,externals的区别及作用


    经常我们会希望通过script方式引入库,如CDN方式的jquery,我们在使用的时候依旧用require方式,但是却不希望webpack将他编译到文件中。

    1
    <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>

      因为模块化开发,杜绝一切全局变量,我们想这样去使用他:

    1
    2
    const $ = require("jquery");
    $("#content").html("<h1>hello world</h1>");

      这时,我们需要配置externals

    1
    2
    3
    4
    5
    6
    7
    8
    9
    module.exports = {
         output: {
               libraryTarget: "umd"
         },
         externals: {
               jquery: "jQuery" 
        },
        ...  
    }

      看看编译后什么变化

    1
    2
    3
    4
    5
    6
    7
    ({   0: function(...) { var jQuery = require(1);
         }, 1: function(...) {
           module.exports = jQuery; // 这里是把window.jQuery赋值给了module.exports
                                                 // 因此可以使用require来引入
        },
        /* ... */
    })           

      实际写个例子,我们经常会有自己处理业务数据的工具库tools.js,传统的方法没有提供UMD的那些功能,只能从window或者global暴露方法

    1
    2
    3
    window.Tools = {
      add: function (num1, num2) { return num1 + num2 },
    }

      然后script方式引入

    1
    <script src="http://xxx/tools.min.js"></script>

      使用如下

    1
    const res = Tools.add(1,2);

      配置externals改造成模块化开发方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    module.exports = {
         output: {
               libraryTarget: "umd"
         },
         externals: {
               jquery: "jQuery" 
        },
        ...  
    }

      此时使用方式

    1
    2
    const tools = require("myTools");
    const res = tools.add(1,2);

      externals的配置

    1.首先是libraryTarget的配置,我们使用umd方式,这样便可以用任何一种引入方式,即支持cmd,amd,及全局

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    (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);
        }
    }(thisfunction ($) {
        //    方法
        function myFunc(){};
      
        //    暴露公共方法
        return myFunc;
    }));

    2.library和libraryTarget的使用

    有时我们想开发一个库,如lodash,underscore这些工具库,这些库既可以用commonjs和amd方式使用也可以用script方式引入。

    这时候我们需要借助library和libraryTarget,我们只需要用ES6来编写代码,编译成通用的UMD就交给webpack了。

    例如上面的tools

    1
    2
    3
    4
    5
    exports default {
        add: function (num1, num2) {
             return num1 + num2; 
        }         
    }

      接下来配置webpack

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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时候的模块名。

  • 相关阅读:
    laravel路由导出和参数加密
    laravel groupby 报错
    Laravel/Lumen 分组求和问题 where groupBy sum
    php swoft redis 发布和订阅
    Linq to Sql学习总结7
    Linq to Sql学习总结6
    Linq to Sql学习总结5
    Linq to Sql学习总结4
    Linq to Sql学习总结3
    Linq to Sql学习总结2
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/12986162.html
Copyright © 2020-2023  润新知