模块
除了前文提到的一些绑定,比如console
和process
,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
,并定义了一个脚本,可以从命令行调用来反转字符串。
const {reverse} = require("./reverse");
// Index 2 holds the first actual command-line argument
let argument = process.argv[2];
console.log(reverse(argument));
文件reverse.js
中定义了一个库,用于截取字符串,这个命令行工具,以及其他需要直接访问字符串反转函数的脚本,都可以调用该库。
exports.reverse = function(string) {
return Array.from(string).reverse().join("");
};
请记住,将属性添加到exports
,会将它们添加到模块的接口。 由于 Node.js 将文件视为 CommonJS 模块,因此main.js
可以从reverse.js
获取导出的reverse
函数。
我们可以看到我们的工具执行结果如下所示。
$ node main.js JavaScript
tpircSavaJ