1. CommonJS概述
commonjs 模块是一种非标准的模块化方案,它是由 CommonJS 社区提出的一种用于 JavaScript 的模块规范。commonjs 模块的目的是为了让 JavaScript 可以在浏览器之外的环境中运行,比如服务器端,桌面端,嵌入式设备等。
commonjs 模块的特点是:
- 每个文件就是一个模块,有自己的作用域和变量。
- 模块可以通过 require 函数来导入其他模块,返回一个包含导出内容的对象。
- 模块可以通过 module.exports 或 exports 属性来导出自己的内容,供其他模块使用。
- 模块的加载是同步的,也就是说,只有等到模块加载完成后,才能执行后续的代码。
commonjs 模块的优点是:
- 简单易用,只需要一个函数和一个对象就可以实现模块化。
- 支持动态导入,可以根据运行时的条件来加载不同的模块。
- 兼容旧版本的 Node.js 和浏览器,有很多现成的模块和工具可以使用。
commonjs 模块的缺点是:
- 不符合 ES6 的模块化标准,与 import 和 export 语法不兼容。
- 不支持静态分析和优化,无法实现诸如 tree shaking, dead code elimination 等功能。
- 不利于代码的可读性和可维护性,容易造成命名冲突和循环依赖等问题。
2. module.exports 和 exports
module.exports 和 exports 都是 Node.js 中用于导出 CommonJS 模块的属性,它们可以让开发者将模块中的内容暴露给外部使用,事实上后者只是前者的一个别名,它们开始时指向了同一个对象。 由于在每个CommonJS文件中隐式执行了如下代码
return module.exports
因此CommonJS最终导出的是module.exports指向的对象。
所以如果module.exports指向了新的对象,那么exports指向的对象就会和前者不同,故exports导出的数据将被无视。
module.exports具体使用如下所示(exports与其类似):
math.js
module.exports =
{
add: function (a, b) { return a + b; },
subtract: function (a, b) { return a - b; }
};
app.js
const math = require(“./math.js”);
console.log(math.add(1, 2));
console.log(math.subtract(3, 2))
在这个例子中,math.js 模块使用 module.exports 导出了一个包含两个函数的对象,app.js 模块使用 require 导入了 math.js 模块,并调用了它的函数。