Node:不能替换Intl来使用IntlPolyfill



我正在尝试使用pt-BR区域设置的Intl,我无法让它与Node 0.12一起工作。

代码:

global.Intl = require('intl/Intl');
require('intl/locale-data/jsonp/pt-BR.js');
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new Intl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));

这段代码输出:

May, 2015

我希望是:"Maio, 2015"。

然后,如果我决定创建一个新变量,一切正常:

工作代码:

global.NewIntl = require('intl/Intl');
require('intl/locale-data/jsonp/pt-BR.js');
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new NewIntl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));

打印出期望值。问题:为什么Intl全局变量没有被替换?

因为全局对象的Intl属性是不可写的(在Node 0.12.2上测试):

console.log(Object.getOwnPropertyDescriptor(global, 'Intl'));
/*
{ value: {},
  writable: false,
  enumerable: false,
  configurable: false }
*/

将代码置于严格模式,当尝试分配给不可写属性时,它会抛出更具描述性的错误,而不是无声地失败。

它也是不可配置的,所以没有办法完全替换(重新分配)global.Intl。这是一件好事:其他模块和依赖项可能依赖于内置的Intl实现。

篡改全局作用域通常会导致比它值得的更多的麻烦,最好保持你的包是独立的。你可以在你需要的文件中使用polyfill:

var Intl = require('intl/Intl');
// Note: you only need to require the locale once
require('intl/locale-data/jsonp/pt-BR.js');
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new Intl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));

你可以在需要Intl的地方添加var Intl = require('intl/Intl');

事实证明,只替换DateTimeFormat和NumberFormat解决了这个问题:

require('intl/Intl');
require('intl/locale-data/jsonp/pt-BR.js');
Intl.NumberFormat = IntlPolyfill.NumberFormat;
Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat;
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new Intl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));

请确保在加载react-intl之前加载此脚本,以防您也在使用它。

我是从这里得到这个信息的

相关内容

  • 没有找到相关文章

最新更新