CommonJs简介
作为第一个出现的js工程化模块,nodejs 率先支持
CommonJS实现原理
假设以下是a模块的代码
var name='node',
exports.name = name
当在另一模块(记做 b 模块)中引入代码 const a = require('a.js'),那么commonJS会执行以下步骤
1: 首先会把判断缓存中是否有a.js的缓存,如果有则直接拿缓存中的module.exports, 而不再进行a.js的执行,如果没有则进行第二步 2: 首先将代码封装成以下展示
(function(module){
module.exports = {}
var exports = module.exports
var name='node',
exports.name = name
return module.exports
})()
接下来是对以上代码的原理解释
CommonJS 会把模块类的所有代码封装成一个立即执行函数,里面传递一个参数module,然后在函数内部进行初始化 module.exports = {},同时为了方便开发者书写,在里面定义了 var exports = module.exports 最终会 return module.exports
那么了解了其原理,我们来看几道面试题
1:commonJS 有几种导出方式?分别是什么
虽然很讨厌这种面试,但是讨厌之后还是要回答,我想这就是生活吧。言归正传,从原理我们知道,应该是有三种的,分别是 module.exports.a = 'a',exports.a ="a",这两种本质上是一种,还有后面的module.exports = {a:"a"},那么其中第三者就要注意了,这里直接给module.exports一个新的对象,这样之前exports上面的对象将不会被导出,我试过,有兴趣的朋友也可以试试。所以这个要特别主意
2:commonjs导出的对象是不是共享的?如果是?那么其原理是什么?
是共享,原理是因为有缓存,如果没有缓存确实就是独立的,至于怎么关掉缓存,同学们可以自行百度
3:commonjs导出的对象是直接导出还是复制导出?
直接导出,也就是require 得到的对象跟原对象相等
以上是本人的一些理解,欢迎大佬指正补充