- AMD/CMD/ES6 MODULE都是模块设计思想
- NODE本身是基于CommonJS模块规范设计的
commonJS思想介绍
- CommonJS规定,每一个JS都是一个单独的模块(模块是私有的:里面涉及的值和变量以及函数等都是私有的,和其它JS文件中的内容是不冲突的)
- CommonJS中可以允许模块中的方法互相的调用。
B模块中想要调取A模块中的方法
=>A导出
=>B导入
导入导出
[导出]
- CommonJS给每一个模块(每个JS)中都设置了内置的变量/属性/方法
- module:代表当前这个模块[object]
- module.exports:模块的这个“属性”是用来导出当前模块的属性和方法的 [object]
- exports:是内置的一个“变量”,也是用来导出当前模块属性方法的,虽然和module.exports不就是一个东西,但是对应的值是同一个(module.exports=exports 值都是对象)
// exports.fn = fn;//=>把当前模块私有的函数放到EXPORTS导出对象中
(赋值给他的某一个属性),
这样在其它模块中,可以基于REQUIRE导入进来使用 <=> module.exports.fn=fn;
// exports={};//=>是无法导出内容的:默认和module.exports是同一个堆内存,
但是这种操作让exports指向新的堆内存,
而module.exports不受影响(require导入的是module.exports对应的堆内存,而不是exports的)
[导入]
- require:CommonJS提供的内置变量,用来导入模块的(其实导入的就是module.exports暴露出来的东西);导入的值也是[object]类型的;
require导入规则
require('./xxx') 或者 ../xxx 再或者 /xxx,
这种自己制定路径的模式,都是为了导入自定义的模块,
换句话说,想要导入自定义的模块,必须加路径
require('xxx') 首先到当前项目的node_modules中查找是否存在这个模块,
不存在找node提供的内置模块(导入第三方或者内置的)
CommonJS特点(私有,缓存运行结果,按序加载,同步加载)
-
所有代码都运行在模块作用域,不会污染全局作用域(每一个模块都是私有的,包括里面所有的东西也都是私有的,不会和其它模块产生干扰)
-
模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。(为了保证性能,减少模块代码重复执行的次数)
-
模块加载的顺序,按照其在代码中出现的顺序。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
node中的commonJS
node 天生自带模块化:如果是一个js文件,那么会在当前js文件代码的最外层套一个自执行函数
(function (exports,module,require,__dirname,__filename) {//
console.log(this);
// exports : 导出(对象)
// module : 模块(对象)
// require : 导入(函数)
// __dirname(当前文件父级文件的绝对路径)
// __filename(当前文件的绝对路径)
return module.exports;
/* let fs = require("fs");
console.log(fs);*/
})();
网友评论