Common.js模块化原理

1、思考

我们都知道在Common.js语法规范中的导出方式有:

js 复制代码
//默认导出:
module.exports = '张三';
exports = '李四'; // 不能赋值为引用数据类型
//具名导出:
exports.name = '王五';

通常通过直接给exports赋值的方式是不常见的,因为这样可能会出现报错(当赋值为引用数据类型时),并且我们知道在模块中我们可以使用一些非内置的变量(例如__filename等),那么出现这些现象的原因是什么呢🤔?

这一切都要从Common.js模块化执行原理说起,一旦我们掌握了原理,理解这些就不在话下😎

2、模块编译原理

先从模块编译开始说起:我们知道在Common.js模块化规范中,一个js文件就是一个模块,当解析器解析js文件时,会通过node中的fs模块同步进行读取,然后进行首尾包装,具体如下:

js 复制代码
(function(exports,require,module,__filename,__dirname){
    //读取的文件内容
})

这样就使得每个模块之间被函数作用域相隔离,从而实现模块化,不会污染全局变量,并且在函数内部可以使用我们传入的一些变量和方法。

现在我们知道了为什么能够在模块中使用__filename等变量和exports等方法了,那么为什么默认导出会有两种呢?如果exports和module.exports是同一个方法的话这样会不会很多余?其实按道理来讲,我们只需要一个export就够了,默认导出exports = '张三',具名导出:exports.name = '李四'。原因就在于:exports对象是通过形参传入的,直接赋值形参会改变形参的引用,所以就用module加以限制,将module的exports属性赋值为exports。

相关推荐
haluhalu.7 小时前
Agent = LLM + 上下文 + 工具(含观察 / 动作空间、ReAct 循环)
前端·javascript·人工智能·python·react.js·机器学习·个人开发
子兮曰13 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
sm_9267870516 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
IMPYLH16 小时前
HTML 的 <video> 元素
前端·html
濮水大叔17 小时前
Cabloy 双引擎架构详解:Vona 与 Zova 是如何协作的
typescript·node.js·全栈
溪语流沙17 小时前
【每天一个CSS | Day19】流光文字与一笔写成的手写签名
前端·javascript·css
逐光者93317 小时前
STM32——SPI 屏 · Flash · 高速
java·前端·stm32
To_OC17 小时前
同样是让 AI 写全栈,为什么别人一句话就够了
前端·前端框架·next.js
CDwenhuohuo17 小时前
electron pc项目打包成桌面端
前端·javascript·electron
前端大斗师17 小时前
「大于 1000」把 1000 元那单也算进去了:我在 Vue3 订单页对了 10 句话
前端·人工智能·typescript·大模型·原力计划