Библиотека Globalize в современных версиях построена поверх стандарта ECMAScript Internationalization API (Intl) и набора данных CLDR (Unicode Common Locale Data Repository). Это означает, что уровень поддержки браузеров напрямую зависит от наличия:
Intl API (ключевой компонент)Date, Number,
String методовСтарые браузеры отличаются отсутствием или неполной реализацией этих возможностей, что требует применения полифиллов и адаптации сборки.
Globalize не рассчитан на выполнение в среде без ES5. Основные требования:
Array.prototype.forEach, map,
filterObject.keysFunction.prototype.bind"use strict"Для старых окружений подключается набор полифиллов, обычно через
core-js:
import "core-js/es/array";
import "core-js/es/object";
import "core-js/es/function";
При сборке через Webpack или Rollup такие зависимости включаются на уровне entry-point, обеспечивая совместимость с устаревшими движками.
Globalize в значительной степени опирается на Intl. В
старых браузерах (например, Internet Explorer до версии 11) поддержка
либо отсутствует, либо частично реализована.
Проблема проявляется в следующих областях:
Для компенсации используется полифилл:
import "intl";
import "intl/locale-data/jsonp/ru";
import "intl/locale-data/jsonp/en";
Важно учитывать, что полифилл Intl может существенно
увеличивать размер бандла, особенно при добавлении множества
локалей.
Globalize не содержит локализационных данных внутри кода. Вместо этого используется CLDR.
Для старых браузеров важна не только загрузка данных, но и корректная работа JSON и XHR/Fetch.
Подключение CLDR обычно выглядит так:
import Globalize from "globalize";
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import plurals from "cldr-data/supplemental/plurals.json";
import numberingSystems from "cldr-data/supplemental/numberingSystems.json";
import ruNumbers from "cldr-data/main/ru/numbers.json";
import ruCurrencies from "cldr-data/main/ru/currencies.json";
import ruCaGregorian from "cldr-data/main/ru/ca-gregorian.json";
Для старых браузеров важно учитывать:
fetch (нужен polyfill или XHR)Для браузеров уровня IE11 и ниже требуется транспиляция через Babel:
{
"presets": [
["@babel/preset-env", {
"targets": {
"ie": "11"
},
"useBuiltIns": "entry",
"corejs": 3
}]
]
}
Это обеспечивает:
const и let на
varПри работе в окружениях без современных стандартов возникают ограничения:
Некоторые сценарии загрузки CLDR данных используют асинхронность. Без Promise требуется полифилл:
import "core-js/es/promise";
Загрузка JSON может требовать XHR-реализации:
function loadJSON(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatecha nge = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
callback(JSON.parse(xhr.responseText));
}
};
xhr.send();
}
Очень старые реализации могут требовать дополнительной проверки входных данных.
Globalize требует явного указания локалей. В старых браузерах это особенно важно из-за отсутствия fallback-механизмов Intl.
Пример инициализации:
Globalize.load(
likelySubtags,
plurals,
numberingSystems,
ruNumbers,
ruCurrencies,
ruCaGregorian
);
Globalize.locale("ru");
Без корректной загрузки supplemental-данных возможны ошибки:
Internet Explorer 9–11 требует отдельного внимания:
Intl polyfillPromise polyfill при асинхронных загрузкахДля обеспечения работы Globalize в старых браузерах используется отдельная конфигурация сборки.
Webpack пример:
module.exports = {
entry: ["core-js/stable", "./src/index.js"],
output: {
filename: "bundle.legacy.js"
},
module: {
rules: [
{
test: /\.js$/,
use: "babel-loader"
}
]
}
};
Дополнительно:
Globalize при полной локализации может включать значительный объём CLDR данных. В старых движках это приводит к:
Оптимизация включает:
Чтобы избежать конфликтов между библиотеками, полифиллы подключаются в изолированном слое:
import "core-js/stable";
import "regenerator-runtime/runtime";
import "intl";
Важно избегать повторного подключения одинаковых полифиллов, так как это может приводить к:
В старых браузерах Globalize может переходить в fallback-режим, где часть логики берётся из полифиллов.
Пример форматирования числа:
const numberFormatter = Globalize.numberFormatter({ maximumFractionDigits: 2 });
numberFormatter(12345.678);
Если Intl.NumberFormat отсутствует, используется
внутренний слой, который зависит от CLDR и может быть медленнее.
Аналогично для дат:
const dateFormatter = Globalize.dateFormatter({ datetime: "medium" });
dateFormatter(new Date());
При поддержке старых браузеров с Globalize проявляются следующие системные ограничения:
Архитектура приложения в таких условиях строится вокруг принципа статической сборки локализационных данных и предсказуемой полифиллированной среды выполнения.