一、commonjs
a、commonjs是值的一个浅拷贝,对于基本数据类型而言 引用的文件修改源文件里面的基本数据类型值是不改变源文件里面的数据,但是对于复杂类型来说就会改变
b、commonjs是在代码运行是进行导入导出的
c、commonjs是运行时加载时同步的
d、commonjs同一个文件只要被引用一次 后面在被其他文件引用时就不会在执行该模块而是从缓存里面取
e、循环加载时,属于加载时执行。即脚本代码在require的时候,就会全部执行。一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出。
f、require导出一个对象(module.exports)
// a.js
var count = 1;
function addCount() {
count++;
}
module.exports = {
count,
addCount,
};
// b.js
console.log(mod.count); // 1
mod.addCount();
console.log(mod.count); // 1
如果想要实时的就需要一个getter了
// a.js
var count = 1;
function addCount() {
count++;
}
module.exports = {
get count() {
return count
},
addCount,
};
// b.js
console.log(mod.count); // 1
mod.addCount();
console.log(mod.count); // 2
对于复杂类型而言
// a.js
var count = {
name: "zhangsan",
};
function addCount() {
count.name = "wanger";
}
module.exports = {
count,
addCount,
};
// b.js
let mod = require("./c.js");
console.log(mod.count.name); // zhangsan
mod.count.name = "lisi";
console.log(mod.count.name); // lisi
mod.addCount();
console.log(mod.count.name); // wanger
在被循环引用时
// 1.js
exports.a = 1;
let aa = require("./2.js");
console.log("a");
// 2.js
exports.b = 1;
let bb = require("./1.js");
console.log("b");
// 3.js
require("./1.js");
require("./2.js");
node 3.js
b
a
二、es6模块
a、es6的是指针的指向引用,当模块遇到import命令时,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值
b、es6是只读不改的
c、es6模块在编译时加载时异步
d、对于动态来说,原始值发生变化,import加载的值也会发生变化。不论是基本数据类型还是复杂数据类型。
e、es6只加载使用导的部分代码而不是全部文件