Импорт атрибутов
Ранее
V8 реализовал функцию утверждений импорта в версии 9.1. Эта функция позволяет инструкциям импорта модулей включать дополнительную информацию, используя ключевое слово assert
. В настоящее время эта дополнительная информация используется для импорта JSON- и CSS-модулей внутри JavaScript-модулей.
Атрибуты импорта
С тех пор утверждения импорта эволюционировали в атрибуты импорта. Суть функции остается та же: позволить инструкциям импорта модулей включать дополнительную информацию.
Самое важное отличие заключается в том, что утверждения импорта имели семантику только утверждений, тогда как атрибуты импорта имеют более расслабленную семантику. Семантика только утверждений означает, что дополнительная информация не влияет на то, как загружается модуль, а только на то, будет ли он загружен. Например, JSON-модуль всегда загружается как JSON-модуль благодаря своему MIME-типу, а конструкция assert { type: 'json' }
может лишь вызвать сбой загрузки, если MIME-тип запрашиваемого модуля не является application/json
.
Однако у семантики только утверждений был фатальный недостаток. В вебе форма HTTP-запросов различается в зависимости от типа запрашиваемого ресурса. Например, заголовок Accept
влияет на MIME-тип ответа, а метаданный заголовок Sec-Fetch-Dest
влияет на то, примет ли веб-сервер запрос или отклонит его. Поскольку утверждение импорта не могло повлиять на то, как загружать модуль, оно не могло изменить форму HTTP-запроса. Тип запрашиваемого ресурса также влияет на то, какие Политики безопасности содержимого используются: утверждения импорта не могли корректно работать с моделью безопасности веба.
Атрибуты импорта смягчают семантику только утверждений, позволяя атрибутам влиять на то, как загружается модуль. Другими словами, атрибуты импорта могут генерировать HTTP-запросы, содержащие соответствующие заголовки Accept
и Sec-Fetch-Dest
. Чтобы синтаксис соответствовал новой семантике, старое ключевое слово assert
обновляется на with
:
// main.mjs
//
// Новый синтаксис 'with'.
import json from './foo.json' with { type: 'json' };
console.log(json.answer); // 42
Динамический import()
Аналогично, динамический import()
также обновляется, чтобы принимать опцию with
.
// main.mjs
//
// Новая опция 'with'.
const jsonModule = await import('./foo.json', {
with: { type: 'json' }
});
console.log(jsonModule.default.answer); // 42
Доступность with
Атрибуты импорта включены по умолчанию в V8 версии 12.3.
Устаревание и последующее удаление assert
Ключевое слово assert
устарело начиная с версии V8 12.3 и планируется быть удаленным к версии 12.6. Пожалуйста, используйте with
вместо assert
! Использование конструкции assert
будет выводить предупреждение в консоль с просьбой использовать with
вместо этого.