如何在webpack中使用外部模块

  介绍

本篇文章给大家分享的是有关如何在webpack中使用外部模块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>外部选项

import 美元,得到& # 39;jquery # 39;      function  hideImages (), {   ,美元(& # 39;img # 39;) hide ();   }      export  default  {   ,“hideImages": hideImages   }

我们使用Webpack打包发布这个库:

//,入口文件   条目:{   util:大敌;& # 39;。/util.js& # 39;   }//,输出文件   输出:{   ,路径:& # 39;。/dist # 39;   ,文件名:& # 39;[名字].dist.js& # 39;      ,库:& # 39;util # 39;   ,libraryTarget: commonjs2,   ,targetExport: & # 39;默认# 39;   }

这样打包出来的util.dist。js文件会把jquery的代码完整地注入进的去,因为你的源代码使用到了它。但是这往往并不是我们希望的,因为jquery是很通用的模块,在一个应用中,很可能其它的库也会用到它,最顶层的入口文件应用程序也可能用到它,如果每一个库模块的发布版本都将jquery原封不动地打包进了自己的包,最后拼到一起,在最终的程序发布代码里就会有很多份jquery的复制,当然这可能并不会影响它的正常功能,但是会占据很大的代码体积。

所以通常情况下当你的库需要依赖到例如jquery,引导这样的通用js模块时,我们可以不将它打包进包,而是在Webpack的配置中声明外部:

:外部,{   ,jquery: {   根才能:& # 39;jquery # 39;   commonjs才能:& # 39;jquery # 39;   ,,commonjs2: & # 39; jquery # 39;   amd才能:& # 39;jquery # 39;   },   },

这就是在告诉Webpack:请不要将这个模块注入编译后的JS文件里,对于我源代码里出现的任何导入/需要这个模块的语句,请将它保留。

我们可以看一下编译后的包文件的结构:

module.exports =,(函数(模块),{   ,var  installedModules =, {};   ,function  webpack_require (moduleId), {//,,,…   ,}   ,return  webpack_require (& # 39;。/util.js& # 39;);   ({}),   & # 39;。/util.js& # 39;:, generated_util,   ,//& # 39;/路径//jquery.js& # 39;:, generated_jquery 原本有这一行,现在被删去。   });

可以看到jquery模块没有被打包进包文件,而对于实效,它的生成代码即generated_util函数中关于进口jquery相关的语句也被保留了原意:

function  generated_util(模块,,出口,webpack_require), {   ,var  $,=,要求(& # 39;jquery # 39;);   ,//util的其它源代码   ,//?   }

当然也并非完全没有修改,例如将进口的改回了传统的需要关键词,因为我们这里用的是CommonJS风格的打包方式。不过这些都是次要的,关键是它保留了需要这个关键词,而没有使用webpack_require将jquery真的引入进来。这就是说,当前的这个JS文件的模块管理系统中是没有jquery的,它是一个外部的模块,需要在这个JS文件被其它人引用并且在上层编译时,jquery才可能被真的引入进来,到那个时候这里的需要关键词才会被替换为webpack_require。

对于外部的依赖模块,通常你可以这样做,例如你使用npm发布你的库,你可以将jquery在包中。json文件中添加到依赖,这样别人npm安装你发布的库时,jquery也会被自动下载到node_modules供别人打包使用。

umd格式下的打包

如果我们使用格umd格式式打包,我们可以看到在不同环境中,外部模块是如何发挥作用的:

(function  webpackUniversalModuleDefinition(根,,工厂),{   ,如果(typeof  exports ===, & # 39;对象,,,,,typeof  module ===, & # 39;对象# 39;),//commonjs2   时间=module.exports 才能;工厂(要求(& # 39;jquery # 39;));   ,else 如果(typeof  define ===, & # 39;函数# 39;,,,,define.amd)   定义才能(“util",, (& # 39; jquery # 39;],,工厂);//,amd   ,else 如果(typeof  exports ===, & # 39;对象# 39;)   出口才能[“util"],=,工厂(要求(& # 39;jquery # 39;));//, commonjs   其他的,   根才能[“util"],=,工厂(根(& # 39;jquery # 39;]);//, var   }),(窗口,函数(__webpack_external_module_jquery__), {   ,return (功能模块),{   var 才能;installedModules =, {};   function 才能webpack_require (moduleId), {   ,,,//,…   ,,}   return 才能;webpack_require (& # 39;。/util.js& # 39;);   ({})大敌;   & # 39;才能。/util.js& # 39;:, generated_util,   ,});   }

如何在webpack中使用外部模块