Node.js接口
package包模块
> 包是由 `package.json` 文件描述的文件夹树。 包由包含 `package.json` 文件的文件夹和所有子文件夹组成,直到包含另一个 `package.json` 文件的下一个文件夹或名为 `node_modules` 的文件夹。 #### 确定模块系统 > 现在 Node.js 同时支持 CommonJS 和 ES 模块。当传递给 `node` 作为初始输入时,或者当被 `import` 语句或 `import()` 表达式引用时,Node.js 会根据一定的规则来确定是ES 模块 或 commonJS模块。 > > 包作者应该包括 `"type"` 字段,即使在所有源都是 CommonJS 的包中也是如此。 如果 Node.js 的默认类型发生变化,显式说明包的 `type` 将使包面向未来,它还将使构建工具和加载器更容易确定应如何解释包中的文件。 | commonJS模块 | ES 模块 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | 扩展名为 `.cjs` 的文件 | 扩展名为 `.mjs` 的文件 | | 当最近的父 `package.json` 文件包含值为 `"commonjs"` 的顶层字段 `"type"` 时,则扩展名为 `.js` 的文件 | 当最近的父 `package.json` 文件包含值为 `"module"` 的顶层 `"type"` 字段时,扩展名为 `.js` 的文件 | | 字符串作为参数传入 `--eval` 或 `--print`,或通过 `STDIN` 管道传输到 `node`,带有标志 `--input-type=commonjs`。 | 字符串作为参数传入 `--eval`,或通过 `STDIN` 管道传输到 `node`,带有标志 `--input-type=module` | #### 模块加载器 > Node.js 有两个系统用于解析说明符和加载模块: CommonJS 模块加载器、 ECMAScript 模块加载器 | CommonJS 模块加载器 | ECMAScript 模块加载器 | | ------------------------------------------------------------ | ----------------------------------------------------------- | | 完全同步的 | 异步的 | | 负责处理 `require()` 调用 | 负责处理 `import` 语句和 `import()` 表达式 | | 可修补的 | 它不是猴子可修补的,可以使用 加载器钩子 进行定制 | | 支持 文件夹作为模块 | 不支持文件夹作为模块,必须完全指定目录索引 | | 尝试添加扩展名搜索 | 不进行扩展名搜索 | | 将 `.json` 视为 JSON 文本文件 | 可以加载 JSON 模块,但需要导入断言 | | 将所有缺少 `.json` 或 `.node` 扩展名的文件视为 JavaScript 文本文件 | 只接受 JavaScript 文本文件的 `.js`、`.mjs` 和 `.cjs` 扩展名 | #### `package.json` 和文件扩展名 在包中,`package.json` `"type"` 字段定义了 Node.js 应该如何解释 `.js` 文件。 如果 `package.json` 文件没有 `"type"` 字段,则 `.js` 文件将被视为 CommonJS。 `"module"` 的 `package.json` `"type"` 值告诉 Node.js 将该包中的 `.js` 文件解释为使用 ES 模块 语法。 `"type"` 字段不仅适用于初始入口点 (`node my-app.js`),还适用于 `import` 语句和 `import()` 表达式引用的文件。 以 `.mjs` 结尾的文件总是加载为 ES 模块,而不管最近的父级 `package.json`。 以 `.cjs` 结尾的文件总是加载为 CommonJS,而不管最近的父级 `package.json`。 `.mjs` 和 `.cjs` 扩展可用于在同一个包中混合类型。 #### 包入口点 在包的 `package.json` 文件中,两个字段可以定义包的入口点: `"main"` 和 `"exports"`。 这两个字段都适用于 ES 模块和 CommonJS 模块入口点。 所有版本的 Node.js 都支持 `"main"` 字段,但其功能有限: 它只定义包的主要入口点。 `"exports"` 提供了 `"main"` 的现代替代方案,允许定义多个入口点、环境之间的条件入口解析支持,以及 **防止除 `"exports"` 中定义的入口点之外的任何其他入口点**。 对于针对当前支持的 Node.js 版本的新包,建议使用 `"exports"` 字段。 ```json { "name": "my-package", "exports": { ".": "./lib/index.js", "./lib": "./lib/index.js", "./lib/*": "./lib/*.js", "./lib/*.js": "./lib/*.js", "./feature": "./feature/index.js", "./feature/*": "./feature/*.js", "./feature/*.js": "./feature/*.js", "./package.json": "./package.json" } } ``` #### `package.json` 字段定义 - `"name"` - 在包中使用命名导入时相关。 也被包管理器用作包的名称。 - `"main"` - 加载包时的默认模块,如果没有指定 exports,在引入 exports 之前的 Node.js 版本中。 - `"packageManager"` - 包管理器在贡献包时推荐。 由 Corepack 垫片利用。 - `"type"` - 决定是否将 `.js` 文件加载为 CommonJS 或 ES 模块的包类型。 - `"exports"` - 包导出和条件导出。 当存在时,限制可以从包中加载哪些子模块。 - `"imports"` - 包导入,供包本身内的模块使用。 - `"version"` `"description"` `"keywords"` `"author"` `"license"` - "scripts" - `"dependencies"` - `"devDependencies"`
顶部
收展
底部
[TOC]
目录
CommonJS 模块
package包模块
全局对象
http超文本传输协议
util实用工具
buff缓冲区
断言测试
EventEmitter事件
child_process子进程
相关推荐
Node.js教程:新手入门
Node.js:ExpressWeb
朴灵《深入浅出 Node.js》