Node.js---CommonJS 相关

83 阅读2分钟

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 模块,并调用了它的函数。