node —— exports和module.exports

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

\color{pink}{欢迎交流讨论}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容