1. 什么是 CommonJS 规范?
CommonJS 规范是一个用于 JavaScript 模块系统的规范,它为模块的定义、加载和执行提供了一套标准。CommonJS 规范在 Node.js 中广泛使用,因此理解 CommonJS 规范对于 Node.js 开发人员来说非常重要。
2. CommonJS 规范中的模块是什么?
模块是 JavaScript 代码的一个独立单元,它可以被其他模块加载和重用。模块通常包含一些函数、类或其他类型的代码,这些代码可以被其他模块调用。
3. 如何定义一个 CommonJS 模块?
可以通过使用 module.exports
语法来定义一个 CommonJS 模块。module.exports
语法允许模块将变量、函数和其他类型的代码导出到其他模块。
// 定义一个名为 "myModule" 的 CommonJS 模块
var myModule = {
// 导出一个名为 "add" 的函数
add: function(a, b) {
return a + b;
}
};
// 将 "myModule" 模块导出
module.exports = myModule;
4. 如何加载一个 CommonJS 模块?
可以通过使用 require()
函数来加载一个 CommonJS 模块。require()
函数将加载一个指定路径的模块,并将该模块的导出值返回。
// 加载 "myModule" 模块
var myModule = require("./myModule");
// 调用 "myModule" 模块中的 "add" 函数
var result = myModule.add(1, 2);
// 打印结果
console.log(result); // 3
5. CommonJS 规范中如何处理循环依赖?
CommonJS 规范中使用一种称为 "即时执行函数" 的技术来处理循环依赖。即时执行函数可以确保模块在被加载时立即执行,从而避免循环依赖的问题。
// 定义一个名为 "myModule" 的 CommonJS 模块
(function() {
// 定义一个名为 "add" 的函数
var add = function(a, b) {
return a + b;
};
// 将 "add" 函数导出到其他模块
module.exports = add;
})();
6. CommonJS 规范中的 require.cache 对象是什么?
require.cache
对象是一个缓存对象,它存储了所有已加载的 CommonJS 模块。require.cache
对象可以用来检查一个模块是否已经加载,也可以用来获取一个模块的导出值。
// 检查 "myModule" 模块是否已经加载
if (require.cache["./myModule"]) {
// "myModule" 模块已经加载
}
// 获取 "myModule" 模块的导出值
var myModule = require.cache["./myModule"].exports;
7. CommonJS 规范中的 module.id 属性是什么?
module.id
属性是一个字符串,它表示模块的绝对路径。module.id
属性可以用来获取模块的绝对路径,也可以用来检查一个模块是否已经加载。
// 获取 "myModule" 模块的绝对路径
var moduleId = module.id;
// 检查 "myModule" 模块是否已经加载
if (require.cache[moduleId]) {
// "myModule" 模块已经加载
}
8. CommonJS 规范中的 module.parent 属性是什么?
module.parent
属性是一个对象,它表示加载当前模块的模块。module.parent
属性可以用来获取加载当前模块的模块,也可以用来检查当前模块是否是被其他模块加载的。
// 获取加载 "myModule" 模块的模块
var parentModule = module.parent;
// 检查 "myModule" 模块是否是被其他模块加载的
if (module.parent) {
// "myModule" 模块是被其他模块加载的
}
9. CommonJS 规范中的 module.children 属性是什么?
module.children
属性是一个数组,它包含了所有被当前模块加载的模块。module.children
属性可以用来获取所有被当前模块加载的模块,也可以用来检查当前模块是否加载了其他模块。
// 获取所有被 "myModule" 模块加载的模块
var childModules = module.children;
// 检查 "myModule" 模块是否加载了其他模块
if (module.children.length > 0) {
// "myModule" 模块加载了其他模块
}
10. CommonJS 规范中的 module.filename 属性是什么?
module.filename
属性是一个字符串,它表示模块的文件名。module.filename
属性可以用来获取模块的文件名,也可以用来检查一个模块是否已经加载。
// 获取 "myModule" 模块的文件名
var fileName = module.filename;
// 检查 "myModule" 模块是否已经加载
if (require.cache[fileName]) {
// "myModule" 模块已经加载
}