模块

除了前文提到的一些绑定,比如consoleprocess,Node 在全局作用域中添加了很少绑定。如果你需要访问其他的内建功能,可以通过system模块获取。

第十章中描述了基于require函数的 CommonJS 模块系统。该系统是 Node 的内建模块,用于在程序中装载任何东西,从内建模块,到下载的包,再到普通文件都可以。

调用require时,Node 会将给定的字符串解析为可加载的实际文件。路径名若以"/""./""../"开头,则解析为相对于当前模块的路径,其中"./"表示当前路径,"../"表示当前路径的上一级路径,而"/"则表示文件系统根路径。因此若你访问从文件/tmp/robot/robot.js访问"./graph",Node 会尝试加载文件/tmp/robot/graph.js

.js扩展名可能会被忽略,如果这样的文件存在,Node 会添加它。 如果所需的路径指向一个目录,则 Node 将尝试加载该目录中名为index.js的文件。

当一个看起来不像是相对路径或绝对路径的字符串被赋给require时,按照假设,它引用了内置模块,或者安装在node_modules目录中模块。 例如,require("fs")会向你提供 Node 内置的文件系统模块。 而require("robot")可能会尝试加载node_modules/robot/中的库。 安装这种库的一种常见方法是使用 NPM,我们稍后讲讲它。

我们来建立由两个文件组成的小项目。 第一个称为main.js,并定义了一个脚本,可以从命令行调用来反转字符串。

  1. const {reverse} = require("./reverse");
  2. // Index 2 holds the first actual command-line argument
  3. let argument = process.argv[2];
  4. console.log(reverse(argument));

文件reverse.js中定义了一个库,用于截取字符串,这个命令行工具,以及其他需要直接访问字符串反转函数的脚本,都可以调用该库。

  1. exports.reverse = function(string) {
  2. return Array.from(string).reverse().join("");
  3. };

请记住,将属性添加到exports,会将它们添加到模块的接口。 由于 Node.js 将文件视为 CommonJS 模块,因此main.js可以从reverse.js获取导出的reverse函数。

我们可以看到我们的工具执行结果如下所示。

  1. $ node main.js JavaScript
  2. tpircSavaJ