浅谈对CommonJS 的理解

114 阅读2分钟

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 得到的对象跟原对象相等

以上是本人的一些理解,欢迎大佬指正补充