- assert断言
- async_hooks异步钩子
- async_hooks/context异步上下文
- buffer缓冲区
- C++插件
- C/C++插件(使用Node-API)
- C++嵌入器
- child_process子进程
- cluster集群
- CLI命令行
- console控制台
- Corepack核心包
- crypto加密
- crypto/webcrypto网络加密
- debugger调试器
- deprecation弃用
- dgram数据报
- diagnostics_channel诊断通道
- dns域名服务器
- domain域
- Error错误
- events事件触发器
- fs文件系统
- global全局变量
- http超文本传输协议
- http2超文本传输协议2.0
- https安全超文本传输协议
- inspector检查器
- Intl国际化
- module模块
- module/cjsCommonJS模块
- module/esmECMAScript模块
- module/package包模块
- net网络
- os操作系统
- path路径
- perf_hooks性能钩子
- policy安全策略
- process进程
- punycode域名代码
- querystring查询字符串
- readline逐行读取
- repl交互式解释器
- report诊断报告
- stream流
- stream/web网络流
- string_decoder字符串解码器
- test测试
- timers定时器
- tls安全传输层
- trace_events跟踪事件
- tty终端
- url网址
- util实用工具
- v8引擎
- vm虚拟机
- wasi网络汇编系统接口
- worker_threads工作线程
- zlib压缩
Node.js v18.7.0 文档
- Node.js 18.7.0
- ► 目录
-
►
索引
- assert 断言
- async_hooks 异步钩子
- async_hooks/context 异步上下文
- buffer 缓冲区
- C++插件
- C/C++插件(使用Node-API)
- C++嵌入器
- child_process 子进程
- cluster 集群
- CLI 命令行
- console 控制台
- Corepack 核心包
- crypto 加密
- crypto/webcrypto 网络加密
- debugger 调试器
- deprecation 弃用
- dgram 数据报
- diagnostics_channel 诊断通道
- dns 域名服务器
- domain 域
- Error 错误
- events 事件触发器
- fs 文件系统
- global 全局变量
- http 超文本传输协议
- http2 超文本传输协议2.0
- https 安全超文本传输协议
- inspector 检查器
- Intl 国际化
- module 模块
- module/cjs CommonJS模块
- module/esm ECMAScript模块
- module/package 包模块
- net 网络
- os 操作系统
- path 路径
- perf_hooks 性能钩子
- policy 安全策略
- process 进程
- punycode 域名代码
- querystring 查询字符串
- readline 逐行读取
- repl 交互式解释器
- report 诊断报告
- stream 流
- stream/web 网络流
- string_decoder 字符串解码器
- test 测试
- timers 定时器
- tls 安全传输层
- trace_events 跟踪事件
- tty 终端
- url 网址
- util 实用工具
- v8 引擎
- vm 虚拟机
- wasi 网络汇编系统接口
- worker_threads 工作线程
- zlib 压缩
- ► 其他版本
- 文档搜索
- 会员登录
目录
CommonJS 模块#
CommonJS 模块是为 Node.js 打包 JavaScript 代码的原始方式。 Node.js 还支持浏览器和其他 JavaScript 运行时使用的 ECMAScript 模块标准。
启用#
Node.js 有两个模块系统:CommonJS 模块和 ECMAScript 模块。
访问主模块#
当文件直接从 Node.js 运行时,则 require.main
被设置为其 module
。
这意味着可以通过测试 require.main === module
来确定文件是否被直接运行。
包管理器的提示#
Node.js require()
函数的语义被设计为足够通用以支持合理的目录结构。
诸如 dpkg
、rpm
和 npm
之类的包管理器程序有望发现无需修改即可从 Node.js 模块构建本机包。
.mjs 扩展名#
由于 require()
的同步特性,无法使用它来加载 ECMAScript 模块文件。
尝试这样做会抛出 ERR_REQUIRE_ESM
错误。
改用 import()
。
总结#
要获取调用 require()
时将加载的确切文件名,则使用 require.resolve()
函数。
缓存#
模块在第一次加载后被缓存。
这意味着(类似其他缓存)每次调用 require('foo')
都会返回完全相同的对象(如果解析为相同的文件)。
模块缓存的注意事项#
模块根据其解析的文件名进行缓存。
由于模块可能会根据调用模块的位置(从 node_modules
文件夹加载)解析为不同的文件名,因此如果 require('foo')
解析为不同的文件,则不能保证 require('foo')
将始终返回完全相同的对象。
核心模块#
Node.js 有些模块编译成二进制文件。 这些模块在本文档的其他地方有更详细的描述。
循环#
当有循环 require()
调用时,模块在返回时可能尚未完成执行。
文件模块#
如果找不到确切的文件名,Node.js 将尝试加载所需的文件名,并添加扩展名:.js
、.json
,最后是 .node
。
当加载具有不同扩展名的文件(例如 .cjs
)时,则必须将其全名传给 require()
,包括其文件扩展名(例如 require('./file.cjs')
)。
目录作为模块#
可以通过三种方式将文件夹作为参数传给 require()
。
从 node_modules 目录加载#
如果传给 require()
的模块标识符不是核心模块,并且不以 '/'
、'../'
或 './'
开头,则 Node.js 从当前模块的目录开始,并添加 /node_modules
,并尝试从该位置加载模块。
Node.js 不会将 node_modules
附加到已经以 node_modules
结尾的路径。
从全局目录加载#
如果 NODE_PATH
环境变量设置为以冒号分隔的绝对路径列表,则 Node.js 将在这些路径中搜索模块(如果它们在其他地方找不到)。
模块封装器#
在执行模块代码之前,Node.js 将使用如下所示的函数封装器对其进行封装:
模块作用域#
__dirname
#
当前模块的目录名。
这与 __filename
的 path.dirname()
相同。
__filename
#
当前模块的文件名。 这是当前模块文件的已解析符号链接的绝对路径。
exports
#
对 module.exports
的引用,其输入更短。
有关何时使用 exports
和何时使用 module.exports
的详细信息,请参阅有关导出的快捷方式的章节。
module
#
对当前模块的引用,请参阅有关 module
对象的部分。
特别是,module.exports
用于定义模块通过 require()
导出和提供的内容。
require(id)
#
用于导入模块、JSON
和本地文件。
模块可以从 node_modules
导入。
可以使用相对路径(例如 ./
、./foo
、./bar/baz
、../foo
)导入本地模块和 JSON 文件,该路径将根据 __dirname
(如果有定义)命名的目录或当前工作目录进行解析。
POSIX 风格的相对路径以独立于操作系统的方式解析,这意味着上面的示例将在 Windows 上以与在 Unix 系统上相同的方式工作。
require.cache
#
模块在需要时缓存在此对象中。
通过从此对象中删除键值,下一次 require
将重新加载模块。
这不适用于原生插件,因为重新加载会导致错误。
require.extensions
#
指导 require
如何处理某些文件扩展名。
require.main
#
Module
对象代表 Node.js 进程启动时加载的入口脚本,如果程序的入口点不是 CommonJS 模块,则为 undefined
。
请参阅“访问主模块”。
require.resolve(request[, options])
#
使用内部的 require()
工具查找模块的位置,但不加载模块,只返回解析的文件名。
require.resolve.paths(request)
#
如果 request
字符串引用核心模块,例如 http
或 fs
,则返回包含在解析 request
或 null
期间搜索的路径的数组。
module 对象#
在每个模块中,module
自由变量是对代表当前模块的对象的引用。
为方便起见,module.exports
也可通过 exports
模块全局访问。
module
实际上不是全局的,而是每个模块本地的。
module.children
#
这个模块首次需要的对象。
module.exports
#
module.exports
对象由 Module
系统创建。
有时这是不可接受的;许多人希望他们的模块成为某个类的实例。
为此,则将所需的导出对象赋值给 module.exports
。
将所需的对象赋值给 exports
只会重新绑定本地的 exports
变量,这可能不是想要的。
导出的快捷方式#
exports
变量在模块的文件级作用域内可用,并在评估模块之前被分配 module.exports
的值。
module.filename
#
模块的完全解析文件名。
module.id
#
模块的标识符。 通常这是完全解析的文件名。
module.isPreloading
#
module.loaded
#
模块是否已完成加载,或正在加载。
module.parent
#
首先需要这个模块的模块,如果当前模块是当前进程的入口点,则为 null
,如果模块是由不是 CommonJS 模块的东西(例如:REPL 或 import
)加载的,则为 undefined
。
module.path
#
模块的目录名称。
这通常与 module.id
的 path.dirname()
相同。
module.paths
#
模块的搜索路径。
module.require(id)
#
module.require()
方法提供了一种加载模块的方法,就像从原始模块调用 require()
一样。
Module 对象#
本章节移至模块:module
核心模块。
Source Map V3 的支持#
本章节移至模块:module
核心模块。