AMD规范和CommonJS规范

AMD规范这个词好久之前一直有看到,可是一直没有去了解是什么,今天突然想起CommonJS,于是一起做一下了解

1、由来:

node应用由模块组成,采用的就是commonjs模块规范。每个文件就是一个模块,有自己独立的作用于、变量、方法等。commonjs规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,他的exports属性(module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。require方法用于加载模块。

2、commonjs模块的特点:

①:所有代码都运行在模块作用域,不会污染全局作用域

②:模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就缓存起来,以后再加载,直接读取缓存结果。想要让模块再次运行,必须清除缓存

      模块的缓存存在require.cache中,可以操作该属性进行删除

delete require.cache[moduleName];

      也可以删除所有模块的缓存

Object.keys(require.cache).forEach(key=>{
    delete require.cache[key];
})

③:模块加载的顺序,按照其在代码中出现的顺序

3、module对象:

①:module.exports属性标识当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量

②:node为每一个模块提供了一个exports变量,指向module.exports。这相当于每个模块中都有这样一句命令:

var exports = module.exports;

      这样,在对外输出时,可以在这个变量上添加方法。例如:

exports.add=function(r){
    return Math.PI*r*r;
}

      注意:不能把exports直接指向一个值。

      一个模块的对外接口,就是一个单一的值,不能使用exports输出,必须使用module.exports输出。

module.exports=function(x){
    console.log(x);
}

4、对比AMD规范和commonjs规范:

相同点:都是为了模块化

不同点:AMD规范是非同步加载模块,允许指定回调函数。

            commonjs规范加载模块是同步的。

5、require命令:

require命令用于加载模块文件,相当于读入并执行一个js文件,然后返回该模块的exports对象,没有发现指定模块,则会报错

6、模块的加载机制:

commonjs的加载机制,输入的是被输出值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值了

//  lib.js
var counter = 3;
function incCounter(){
    counter++;
}
module.exports={
    counter: counter,
    incCounter: incCounter,
};

//  main.js
var counter = require('./lib').counter;
var incCounter = require('./lib').incCounter;
console.log(counter);  //3
incCounter();
console.log(counter);  //3
//上面代码说明,counter输出以后,lib.js模块内部的变化就影响不到counter了

 

具体内容可以参考:http://www.ruanyifeng.com/blog/2015/05/commonjs-in-browser.html

或者:https://javascript.ruanyifeng.com/nodejs/module.html#toc2

 

 

 

 

 

 

ps:年后除了工作之外,就在学习uni-app,没来得及总结,之后再找个时间总结一下自己学习uni-app的一些想法。

上一篇:【牛客网-名企高频面试题】NC28 最小覆盖子串


下一篇:终于把vue官方的bug找到了,有两个bug,一个是main.js里定义的变量名称与html里div块里的id不符,一个是缺少挂载