node采用的是CommonJS模块化,使用require导入,exports或module.exports导出
- require
导入。在没有任何内容导出去的情况下导入某个文件的内容,会得到一个空对象。
// index.js
const a = require('./index1.js');
// node index.js --> {}
// index1.js
const a = 123;
// 这里没有导出
仅在模块第一次被使用时执行一次
// index.js
const a = require('./index1.js');
const b = require('./index1.js');
console.log(a === b); // --> true
// node index.js --> 123 true 只输出一次
// index1.js
const a = 123;
console.log(a);
- exports
node为每个模块提供一个exports变量,指向module.exports。exports = module.exports;
默认导出的是个对象。{}
// index.js
const a = require('./index1.js');
console.log(a);
// node index.js --> { a: 123 }
// index1.js
const a = 123;
exports.a = a;
- module.exports
node默认是通过module.exports导出的
// index.js
const a = require('./index1.js');
console.log(a);
// node index.js --> { a: 123, b: 456 }
// index1.js
const a = 123;
const b = 456;
exports.a = a;
module.exports.b = b;
修改index1.js文件
// index1.js
const a = 123;
const b = 456;
const s1 = {username: "Tstrive"}
exports.a = a; // 因为exports指向module.exports, 此时已经赋值给module.exports, { a: 123 }
module.exports.b = b;
// node index.js --> { a: 123, b: 456 } --> 因为node通过module.exports导出的
再次修改index.js文件
// index1.js
const a = 123;
const b = 456;
const s1 = {username: "学生"};
exports = s1; // 此操作eports指向s1, 与module.exports断开
exports.a = a;
module.exports.b = b;
// node index.js --> { b: 456 } -->
/*
因为node通过module.exports导出的,eports已经和module.exports断开,
所以exports.a = a并没有赋值给module.exports,所以最后导出的只有b。
*/
总结
- require在没有任何内容导出去的情况下获取某个文件的内容,会得到一个空对象
- require仅在模块第一次被使用时执行一次
- node为每个模块提供一个exports变量,指向module.exports。exports = module.exports;
- node默认导出的是个对象。{}
- node默认是通过module.exports导出的
- 使用exports时,只能单个设置属性exports.a = a;
- 使用module.exports可以单个设置属性,也可以整个赋值
- 优先使用module.exports