require
和 module.exports
实现模块的导入和导出。
Common.js 是一种JavaScript模块规范,它允许开发者在一个文件中定义模块,然后在其他文件中重用这些模块,这种模块化方式在Node.js环境中非常流行,因为它提供了一种简单而有效的方式来组织和管理代码。
在Common.js规范中,每个文件都是一个模块,并且可以通过require
函数来引入其他模块,当一个模块被加载时,它会执行所有的顶层代码(即不在函数或块级作用域中的代码),并且可以通过module.exports
对象来导出公开的接口。
模块可以通过以下几种方式导出:
1、默认导出:使用module.exports
直接赋值。
2、多个导出:可以为module.exports
添加多个属性,每个属性都是一个公开的接口。
3、命名导出:使用exports
对象来添加属性,但这种方式不能用于默认导出。
示例:
// 默认导出 module.exports = function sayHello(name) { returnHello, ${name}!
; }; // 多个导出 module.exports.sayGoodbye = function(name) { returnGoodbye, ${name}!
; }; // 命名导出(不推荐用于默认导出) exports.sayWelcome = function(name) { returnWelcome, ${name}!
; };
在其他文件中,可以使用require
函数来导入模块。require
会返回module.exports
对象,或者在没有设置module.exports
的情况下返回exports
对象。
示例:
const greetings = require('./greetings.js'); console.log(greetings.sayHello('Alice')); // 输出 "Hello, Alice!" console.log(greetings.sayGoodbye('Bob')); // 输出 "Goodbye, Bob!" console.log(greetings.sayWelcome('Charlie')); // 输出 "Welcome, Charlie!"
同步加载:require
调用是同步的,这意味着在继续执行后续代码之前,模块会被完全加载和执行,这可以简化错误处理和依赖管理,但在处理大量或复杂的模块时可能会导致性能问题。
缓存机制:一旦一个模块被加载,Node.js会缓存这个模块,再次require
同一个模块时,不会重新加载或执行模块的代码,而是直接从缓存中获取。
循环依赖:Common.js不支持循环依赖,如果两个模块相互依赖对方,那么在加载时会导致错误。
与ES6的import/export
语法相比,Common.js有以下不同点:
语法:Common.js使用require
和module.exports
,而ES6模块使用import
和export
。
作用域:Common.js模块的顶层代码在第一次加载时就会执行,而ES6模块的顶层代码在被导入时才会执行。
默认导出:Common.js只能有一个默认导出,而ES6模块可以有多个命名导出和一个默认导出。
Q1: Common.js 是否支持异步加载模块?
A1: 不支持,Common.js的require
调用是同步的,这意味着在继续执行后续代码之前,模块会被完全加载和执行,如果需要异步加载模块,可以考虑使用动态import()
语句(在支持ESM的环境中)。
Q2: 如何在Common.js中处理循环依赖?
A2: Common.js不支持循环依赖,如果遇到循环依赖的情况,通常需要重构代码以消除这种依赖关系,可以将相互依赖的功能提取到第三个模块中,或者使用事件发射器、观察者模式等设计模式来解耦模块之间的直接依赖。