Узел: невозможно заменить Intl для использования IntlPolyfill
Я пытаюсь использовать Intl с языковым стандартом pt-BR и не могу заставить его работать с 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 не заменяется?
2 ответа
Оказывается, замена только 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
в случае, если вы также используете его.
Я получил эту информацию отсюда.
Поскольку Intl
свойство глобального объекта недоступно для записи (тестирование на узле 0.12.2):
console.log(Object.getOwnPropertyDescriptor(global, 'Intl'));
/*
{ value: {},
writable: false,
enumerable: false,
configurable: false }
*/
Переведите ваш код в строгий режим, и он будет выдавать более описательную ошибку при попытке назначить не доступным для записи свойствам вместо тихого сбоя.
Он также не настраивается, поэтому нет возможности полностью заменить (переназначить) global.Intl
, И это хорошо: другие модули и зависимости могут зависеть от встроенного Intl
реализация.
Вмешательство в глобальную сферу чаще всего приводит к большей головной боли, чем стоит, лучше держать ваши пакеты автономными. Вы можете просто потребовать полифилла в файлах, где вам это нужно:
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()));
Вы можете просто добавить var Intl = require('intl/Intl');
в файлах, где вам нужно Intl
,