本篇文章给大家分享的是有关如何在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中使用外部模块