Node.js接口
CommonJS 模块
#### 启用 Node.js 有两个模块系统: CommonJS 模块和 ECMAScript 模块。 在 Node.js 中,每个文件都被视为一个单独的模块。 默认情况下,Node.js 会将以下内容视为 CommonJS 模块: - > 扩展名为 `.cjs` 的文件; > > 当最近的父 `package.json` 文件包含值为 `"commonjs"` 的顶层字段 `"type"` 时,则扩展名为 `.js` 的文件。 > > 当最近的父 `package.json` 文件不包含顶层字段 `"type"` 时,则扩展名为 `.js` 的文件。 > > 扩展名不是 `.mjs`、`.cjs`、`.json`、`.node` 或 `.js` 的文件 #### 访问主模块 当文件直接从 Node.js 运行时,则 `require.main` 被设置为其 `module`。 这意味着可以通过测试 `require.main === module` 来确定文件是否被直接运行。对于文件 `foo.js`,如果通过 `node foo.js` 运行,则为 `true`,如果通过 `require('./foo')` 运行,则为 `false`。当入口点不是 CommonJS 模块时,则 `require.main` 为 `undefined`,且主模块不可达。 #### 全部一起 要获取调用 require() 时将加载的确切文件名,则使用 require.resolve() 函数。 #### 缓存 模块在第一次加载后被缓存。 这意味着(类似其他缓存)每次调用 `require('foo')` 都会返回完全相同的对象(如果解析为相同的文件)。 如果 `require.cache` 没有被修改,则多次调用 `require('foo')` 不会导致模块代码被多次执行。 这是重要的特性。 有了它,可以返回 "部分完成" 对象,从而允许加载传递依赖,即使它们会导致循环。 要让模块多次执行代码,则导出函数,然后调用该函数。 #### 模块缓存注意事项 模块根据其解析的文件名进行缓存。 由于模块可能会根据调用模块的位置(从 `node_modules` 文件夹加载)解析为不同的文件名,因此如果 `require('foo')` 解析为不同的文件,则不能保证它始终返回完全相同的对象。 此外,在不区分大小写的文件系统或操作系统上,不同的解析文件名可以指向同一个文件,但缓存仍会将它们视为不同的模块,并将多次重新加载文件。 例如,`require('./foo')` 和 `require('./FOO')` 返回两个不同的对象,而不管 `./foo` 和 `./FOO` 是否是同一个文件。 #### 循环 当有循环 require() 调用时,模块在返回时可能尚未完成执行。需要仔细规划以允许循环模块依赖在应用中正常工作。 #### 文件模块 如果找不到确切的文件名,那么 Node.js 将尝试加载具有添加的扩展名的所需文件名: `.js`、`.json`,最后是 `.node`。 `.json` 文件被解析为 JSON 文本文件,`.node` 文件被解释为加载了 `process.dlopen()` 的已编译插件模块。 使用任何其他扩展名(或根本没有扩展名)的文件被解析为 JavaScript 文本文件。 以 `'/'` 为前缀的必需模块是文件的绝对路径。 例如,`require('/home/marco/foo.js')` 将在 `/home/marco/foo.js` 加载文件。 以 `'./'` 为前缀的必需模块与调用 `require()` 的文件相关。 也就是说,`circle.js` 必须和 `foo.js` 在同一个目录下,`require('./circle')` 才能找到它。 如果没有前导 `'/'`、`'./'` 或 `'../'` 来指示文件,则该模块必须是核心模块或从 `node_modules` 文件夹加载。 如果给定路径不存在,则 `require()` 将抛出 `MODULE_NOT_FOUND` 错误。 #### 文件夹作为模块 首先是在文件夹的根目录创建 `package.json` 文件,指定 `main` 模块。示例: ```json { "name" : "some-library", "main" : "./lib/some-library.js" } ``` #### 从 `node_modules` 文件夹加载 如果传递给 `require()` 的模块标识符不是 [core](https://nodejs.cn/api/modules.html#) 模块,并且不是以 `'/'`、`'../'` 或 `'./'` 开头,则 Node.js 从当前模块的目录开始,并添加 `/node_modules`,并尝试从中加载模块 地点。 Node.js 不会将 `node_modules` 附加到已经以 `node_modules` 结尾的路径。 如果在那里找不到它,则它移动到父目录,依此类推,直到到达文件系统的根目录。 #### 从全局文件夹加载 如果 `NODE_PATH` 环境变量设置为以冒号分隔的绝对路径列表,则 Node.js 将在这些路径中搜索模块(如果它们在其他地方找不到)。 强烈建议将依赖放在本地 `node_modules` 文件夹中。 这些将加载得更快,更可靠。 #### 模块作用域 - `__dirname`:当前模块的目录名。 这与 `__filename` 的 `path.dirname()` 相同。 - `__filename`:当前模块的文件名。 这是当前模块文件的已解析符号链接的绝对路径。 - `exports`:对 `module.exports` 的引用,其输入更短。 - `module`:对当前模块的引用 - `require(id)`:用于导入模块、`JSON` 和本地文件。 模块可以从 `node_modules` 导入。 可以使用相对路径导入本地模块和 JSON 文件 #### `module` 对象 > 在每个模块中,`module` 自由变量是对代表当前模块的对象的引用。 为方便起见,`module.exports` 也可通过 `exports` 模块全局访问。 `module` 实际上不是全局的,而是每个模块本地的。 - **module.children:**这个模块首次需要的对象。 - **module.exports** - exports 快捷方式:exports 变量在模块的文件级作用域内可用,并在评估模块之前被分配 module.exports 的值。 - **module.filename:**模块的完全解析文件名。 - **module.id:**模块的标识符。 通常这是完全解析的文件名。 - **module.isPreloading:**如果模块在 Node.js 预加载阶段运行,则为 true。 - **module.loaded:**模块是否已完成加载,或正在加载。 - **module.path:**模块的目录名称。 这通常与 module.id 的 path.dirname() 相同。 - **module.paths:**模块的搜索路径。 - **module.require(id):**该方法提供了一种加载模块的方法,就像从原始模块调用 require() 一样。
顶部
收展
底部
[TOC]
目录
CommonJS 模块
package包模块
全局对象
http超文本传输协议
util实用工具
buff缓冲区
断言测试
EventEmitter事件
child_process子进程
相关推荐
Node.js教程:新手入门
Node.js:ExpressWeb
朴灵《深入浅出 Node.js》