如果我在浏览器和Node中运行这段代码,我会得到两个不同的结果:
const moneyFormatter = new Intl.NumberFormat('it-IT', {
style: 'currency',
currency: 'EUR',
minimumFractionDigits: 2
});
moneyFormatter.format(1);
浏览器:1,00 €
Node:€1.00
这个问题是由于默认Node构建中缺少ICU数据引起的。
Node.js(及其底层V8引擎)使用ICU在本地C/C++代码中实现这些功能。然而,其中一些功能需要非常大的ICU数据文件才能支持世界上所有语言环境。
同时,它也解释了在默认Node构建中你会遇到的限制:
因为预期大多数Node.js用户只会使用ICU功能的一小部分,所以Node.js默认情况下仅提供了完整ICU数据集的子集。
因此:
提供了几种选项来自定义和扩展ICU数据集,无论是在构建还是运行Node.js时。
安装 full-icu
npm包,问题就解决了:每个语言环境都将被安装并在您的代码中可用。只需使用专用的环境变量启动您的应用程序,指向ICU数据集安装路径:
NODE_ICU_DATA=node_modules/full-icu node YOURAPP.js
或者,使用特定的Node选项:
node --icu-data-dir=node_modules/full-icu YOURAPP.js
Intl.NumberFormat.supportedLocalesOf('it')
[]
。
如果支持该语言环境,则返回带有语言环境id['it']
的数组。