Node.js v21.7.2 文档
- Node.js v21.7.2
- ► 目录
-
► 索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 附加模块
- 使用 Node-API 的 C/C++ 附加模块
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- Corepack
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 错误
- 事件
- 文件系统
- 全局变量
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:包
- 网络
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 读取行
- REPL
- 报告
- 单一可执行应用程序
- 流
- 字符串解码器
- 测试运行器
- 计时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用程序
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- 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').TextDecoder
RegExp
Unicode 属性转义
Node.js 和底层的 V8 引擎使用 国际化组件 Unicode (ICU) 在本地 C/C++ 代码中实现这些特性。默认情况下,Node.js 提供完整的 ICU 数据集。但是,由于 ICU 数据文件的大小,在构建或运行 Node.js 时提供了几个选项来自定义 ICU 数据集。
构建 Node.js 的选项#
为了控制 ICU 在 Node.js 中的使用方式,编译期间提供了四个 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 (对象不存在) | partial/full (取决于操作系统) | partial (仅限英语) | full |
String.prototype.localeCompare() | partial (不区分区域设置) | full | full | full |
String.prototype.toLocale*Case() | partial (不区分区域设置) | full | full | full |
Number.prototype.toLocaleString() | partial (不区分区域设置) | partial/full (取决于操作系统) | partial (仅限英语) | full |
Date.prototype.toLocale*String() | partial (不区分区域设置) | partial/full (取决于操作系统) | partial (仅限英语) | full |
传统 URL 解析器 | 部分(不支持 IDN) | full | full | full |
WHATWG URL 解析器 | 部分(不支持 IDN) | full | full | full |
require('node:buffer').transcode() | 无(函数不存在) | full | full | full |
REPL | 部分(行编辑不准确) | full | full | full |
require('node:util').TextDecoder | 部分(支持基本编码) | partial/full (取决于操作系统) | 部分(仅限 Unicode) | full |
RegExp Unicode 属性转义 | 无(无效的 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-dir
CLI 参数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
支持测试,以下资源可能会有所帮助