问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

es6 的 import、export 和 commonjs 的 require、exports模块化分析...

发布网友 发布时间:2024-10-02 11:19

我来回答

1个回答

热心网友 时间:2024-11-01 11:43

在使用antd组件的过程中,发现其库在编译后的代码中包含了一个_函数,该函数的逻辑简单,判断obj参数是否具有__esModule属性,以此来返回相应的对象或包装过的对象。这一过程与babel编译器有关。本文将解析babel在解析模块化语句时所执行的操作。

目前,前端的模块化主要使用的是commonjs中的require、exports实现的模块化,以及es6中的import、export实现的方式。同时,webpack和babel分别对这两种实现方式有自己的处理方法,接下来我们将分别探讨它们各自如何实现。

babel模块实现

babel可以看作是javascript语法的编译器,其主要功能是将es6的语法转换为es5的语法,包括模块化语法的转换。在看babel的实现前,先思考几个问题,帮助理解babel所做的工作。通过一个简单的项目来解析这些疑问,项目地址可在此查看。

首先创建项目并安装babel编译环境。在a.js文件中,使用es6语法导出三个变量及一个默认导出,使用babel编译后,可以看到es6的导入导出语句转换成了commonjs的写法。注意,export default被挂载到exports.default变量上,并定义了__esModule属性,表明此文件导出的是es6的模块。

require导入

commonjs的导入使用require方式,有时需要加上default,有时不需要,这是为什么?通常,在使用require导入es6模块时需要加上.require(xxx).default,这是因为es6的export default会被编译为exports.default = xxx。而使用es6的import导入不需要加上default,这是因为在babel编译es6导入时会加入_interopRequireDefault辅助方法,对于引入的es6或commonjs模块都添加了default属性。这种情况在编写webpack代码分割逻辑时常见。

webpack模块化的原理

webpack在打包过程中实现了自己的模块化解析方式,以下以webpack3为例。首先安装webpack并添加配置文件。在index.js和a.js文件中,使用webpack打包后得到的结果是一个自执行函数,函数体和参数部分分别解析。在函数体内,定义了__webpack_require__函数,用于导入模块。在自执行函数参数部分,可以看到参数包含打包结果。函数体和参数部分的解析过程展示了webpack模块化实现的细节。

webpack和babel模块化的配合

在使用webpack和babel的配置后,模块化编译结果会发生变化。主要差异体现在自执行函数参数上,引入了babel的辅助方法_interopRequireDefault,这可能是babel处理模块化结果或webpack处理的结果。这些变化的目的是兼容babel对模块化处理的方式。

tree-shaking优化

webpack2引入了tree-shaking技术,静态分析es6语法以删除未使用的模块。需要注意的是,这项功能仅对es6的模块化语法有效,一旦引入babel对模块化的处理,tree-shaking功能将失效。

按需加载

另一种模块依赖优化方法是按需加载。通常,我们通过require或import引入第三方库,导入的是库的全量内容,但实际上我们只使用其中的几个方法或组件,导致导入的无用内容增加了文件体积。通过按需加载,引入第三方库的部分组件,而非整体引入,实现引入量最小化。

webpack编译后再导出供三方使用

一些第三方库通常遵循commonjs的模块规范,可能是由babel编译的结果。webpack提供了编译后导出库的能力,但默认导出结果无法供第三方引用。为了解决这个问题,可以利用output.libraryTarget和output.library配置属性调整导出方式,实现库的再利用。

综上所述,babel和webpack在模块化实现上各有特点,它们通过不同的方式处理es6和commonjs的模块化,同时也提供了优化模块依赖的策略。希望本文能为理解这些实现方式提供帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 【浏览器工作原理】7.v8是如何执行JavaScript代码的 2013年河北威县个人承担最低档社保交费基数是多少钱 淘宝显示我的账户未实名,怎么回事啊? 努力做事才是现实吗,没白天没黑夜的做事,这人生怎么整? window7,游戏听歌都可以,但QQ语音别人听不清,是哪里没调好,怎么调啊 电脑下了字体后怎么上QQ的时候QQ字体显示不是宋体了啊 ? 怎么修改,有... 笔记本装完windows7系统耳麦QQ时语聊不能用怎么办 ...电脑Macbookpro装了双系统可是window7系统里字体很小和 Window7系统QQ语音无法解决怎么办? win7的字体模糊.比如360 QQ 浏览器 ... ...汉字就显示不全,有点想缺行,qq的头像也变的模糊了,显卡驱动都更新了... 昨天QQ更新到最新版本之后字体就变大了,删除了一次也不行。求解_百度知... 秦始皇他爸爸是谁 秦始皇的身世之谜!他是吕不韦的儿子还是异人的儿子???谢谢了,大神帮忙... 始皇帝到底是秦庄襄王子楚(异人)之子,还是秦文信侯吕不韦之子? 问:汽车总动员和玩具总动员 1、2、3部的国语版 高清 给小孩子看的 感恩... 求玩具总动员1、2中英字幕版电影下载地址。。谢谢~~~ 玩具总动员1、2、3大陆国语版 玩具总动员1,2,3电影国语版迅雷下载.哪位好心人有? 手机上网速度比上个月慢。用日语怎么说,不要谷歌问道的翻译 南红玛瑙108颗珠子有什么特殊意义?-和田玉资讯 玩欢乐斗地主注册真实姓名花钱吗? 男的前两年长得比实际年龄小很多现在突然老了很多为什么 其实我一直深爱着你.但是你的言行举止.让我心无归属.这句话用英语怎么... 英语翻译 用英文翻译下列文字,Q_Q: 妈妈,我永远爱着你.希望你永远快乐... 电脑开机显示器无信号是什么问题啊? 田径与校园极限运动目录 美少女战士哪集小卫与小兔的感情戏份较多?麻烦说清楚第几部第几集谢谢... 收不回来的预付款怎么做账 铁路企业年金几倍返还 必须戒掉的20个生活坏习惯目录 杨丞琳的《暗涌》空间背景音乐歌曲链接MP3,不卡的!非常感谢! 求杨丞琳的暗涌 mp3链接 可以放到空间背景音乐里的 谢谢! 求《奋斗》大结局,夏琳自诉从巴黎到回国的情感那段的背景音乐 打印预览时一页一页的,怎么解决? 早上打开电脑,发现电脑好像回复到刚买电脑时的几个图标,后来下载的都... 研究生报到带什么证件 ...有一头小牛小牛他有鼻子发红流鼻涕而且还咳嗽哦拉屎汐有㴰雪_百... 我家的小奶牛拉肚子 请高人开店药方 小牛5个多月大 最近有吃野草 我家的奶牛生过小牛有一个星期了,这几天小便大便都很频繁,还少,而且大 ...