Node.js v26.0.0 文档
- Node.js v26.0.0
- 目录
- 索引
- 关于本文档
- 用法与示例
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 环境变量
- 错误
- 事件
- 文件系统
- 全局对象
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:moduleAPI - 模块:包
- 模块:TypeScript
- 网络
- 可迭代流 API
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 逐行读取
- REPL
- 报告
- 单一可执行文件应用
- SQLite
- 流
- 字符串解码器
- 测试运行器
- 定时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- 虚拟机
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- Zlib 可迭代压缩
- 其他版本
- 选项
国际化支持#
Node.js 具有许多功能,可以更轻松地编写国际化的程序。其中一些包括:
- ECMAScript 语言规范中对区域设置敏感或感知 Unicode 的函数
- ECMAScript 国际化 API 规范(又称 ECMA-402)中描述的所有功能
Intl对象- 区域设置敏感的方法,例如
String.prototype.localeCompare()和Date.prototype.toLocaleString()
- WHATWG URL 解析器的国际化域名 (IDN) 支持
require('node:buffer').transcode()- 更精确的 REPL 行编辑
require('node:util').TextDecoderRegExpUnicode 属性转义
Node.js 和底层的 V8 引擎使用 国际化组件 (ICU) 在原生 C/C++ 代码中实现这些功能。Node.js 默认提供完整的 ICU 数据集。然而,由于 ICU 数据文件的大小,在构建或运行 Node.js 时,提供了几种自定义 ICU 数据集的选项。
Node.js 构建选项#
为了控制 Node.js 中如何使用 ICU,编译期间可以使用四个 configure 选项。有关如何编译 Node.js 的更多详细信息,请参阅 BUILDING.md。
--with-intl=none/--without-intl--with-intl=system-icu--with-intl=small-icu--with-intl=full-icu(默认)
每个 configure 选项对应的 Node.js 和 JavaScript 功能概述
| 功能 | none |
system-icu |
small-icu |
full-icu |
|---|---|---|---|---|
String.prototype.normalize() |
none (函数为空操作) | full | full | full |
String.prototype.to*Case() |
full | full | full | full |
Intl |
none (对象不存在) | 部分/全部 (取决于操作系统) | 部分 (仅限英语) | full |
String.prototype.localeCompare() |
部分 (非区域感知) | full | full | full |
String.prototype.toLocale*Case() |
部分 (非区域感知) | full | full | full |
Number.prototype.toLocaleString() |
部分 (非区域感知) | 部分/全部 (取决于操作系统) | 部分 (仅限英语) | full |
Date.prototype.toLocale*String() |
部分 (非区域感知) | 部分/全部 (取决于操作系统) | 部分 (仅限英语) | full |
| 旧版 URL 解析器 | 部分 (不支持 IDN) | full | full | full |
| WHATWG URL 解析器 | 部分 (不支持 IDN) | full | full | full |
require('node:buffer').transcode() |
none (函数不存在) | full | full | full |
| REPL | 部分 (行编辑不准确) | full | full | full |
require('node:util').TextDecoder |
部分 (支持基础编码) | 部分/全部 (取决于操作系统) | 部分 (仅限 Unicode) | full |
RegExp Unicode 属性转义 |
none (无效的 RegExp 错误) |
full | full | full |
“(非区域感知)”的标记表示该函数执行的操作与该函数的非 Locale 版本(如果存在)相同。例如,在 none 模式下,Date.prototype.toLocaleString() 的操作与 Date.prototype.toString() 相同。
禁用所有国际化功能 (none)#
如果选择此选项,ICU 将被禁用,并且上述提到的大多数国际化功能在生成的 node 二进制文件中将不可用。
使用预安装的 ICU 构建 (system-icu)#
Node.js 可以链接到系统中已安装的 ICU 构建。事实上,大多数 Linux 发行版都预装了 ICU,此选项可以重用操作系统中其他组件所使用的数据集。
仅需要 ICU 库本身的功能(例如 String.prototype.normalize() 和 WHATWG URL 解析器)在 system-icu 下得到完全支持。需要额外 ICU 区域设置数据的功能(例如 Intl.DateTimeFormat)可能会根据系统上安装的 ICU 数据的完整性而得到完全或部分支持。
嵌入有限的 ICU 数据集 (small-icu)#
此选项使生成的二进制文件静态链接到 ICU 库,并在 node 可执行文件中包含 ICU 数据的一个子集(通常仅包含英语区域设置)。
仅需要 ICU 库本身的功能(例如 String.prototype.normalize() 和 WHATWG URL 解析器)在 small-icu 下得到完全支持。需要额外 ICU 区域设置数据的功能(例如 Intl.DateTimeFormat)通常仅适用于英语区域设置。
const january = new Date(9e8);
const english = new Intl.DateTimeFormat('en', { month: 'long' });
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
console.log(english.format(january));
// Prints "January"
console.log(spanish.format(january));
// Prints either "M01" or "January" on small-icu, depending on the user’s default locale
// Should print "enero"
此模式在功能和二进制文件大小之间取得了平衡。
在运行时提供 ICU 数据#
如果使用 small-icu 选项,仍然可以在运行时提供额外的区域设置数据,以便 JS 方法适用于所有 ICU 区域设置。假设数据文件存储在 /runtime/directory/with/dat/file,可以通过以下任一方式使其对 ICU 可用:
-
--with-icu-default-data-dir配置选项./configure --with-icu-default-data-dir=/runtime/directory/with/dat/file --with-intl=small-icu这仅将默认数据目录路径嵌入到二进制文件中。实际的数据文件将在运行时从此目录路径加载。
-
NODE_ICU_DATA环境变量env NODE_ICU_DATA=/runtime/directory/with/dat/file node -
--icu-data-dirCLI 参数node --icu-data-dir=/runtime/directory/with/dat/file
当指定了其中多个选项时,--icu-data-dir CLI 参数的优先级最高,其次是 NODE_ICU_DATA 环境变量,最后是 --with-icu-default-data-dir 配置选项。
ICU 能够自动查找并加载多种数据格式,但数据必须适用于 ICU 版本,且文件名必须正确。数据文件最常见的名称是 icudtX[bl].dat,其中 X 表示预期的 ICU 版本,b 或 l 表示系统的字节序。如果无法从指定目录读取预期的数据文件,Node.js 将加载失败。与当前 Node.js 版本对应的数据文件名可以通过以下方式计算:
`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`;
有关其他受支持的格式和 ICU 数据的一般详细信息,请参阅 ICU 用户指南中的 “ICU 数据” 文章。
full-icu npm 模块可以通过检测运行的 node 可执行文件的 ICU 版本并下载适当的数据文件,极大地简化 ICU 数据的安装。通过 npm i full-icu 安装该模块后,数据文件将位于 ./node_modules/full-icu。然后,可以将此路径传递给 NODE_ICU_DATA 或 --icu-data-dir(如上所示),以启用完整的 Intl 支持。
嵌入完整的 ICU (full-icu)#
此选项使生成的二进制文件静态链接到 ICU 并包含完整的 ICU 数据集。以这种方式创建的二进制文件没有其他外部依赖项,支持所有区域设置,但体积可能较大。如果不传递 --with-intl 标志,这是默认行为。官方二进制文件也是以此模式构建的。
检测国际化支持#
要验证 ICU 是否已启用(system-icu、small-icu 或 full-icu),只需检查 Intl 是否存在即可:
const hasICU = typeof Intl === 'object';
或者,检查 process.versions.icu(仅在启用 ICU 时定义的属性)也可以:
const hasICU = typeof process.versions.icu === 'string';
要检查对非英语区域设置的支持(即 full-icu 或 system-icu),Intl.DateTimeFormat 是一个很好的区分因素:
const hasFullICU = (() => {
try {
const january = new Date(9e8);
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
return spanish.format(january) === 'enero';
} catch (err) {
return false;
}
})();
对于更详细的 Intl 支持测试,以下资源可能会有所帮助: