Разница между System.import() и import()?

В webpack 1 docs - это утверждение, которое в webpack 2 будет использовать System.import() для динамического require:

К счастью, существует спецификация JavaScript-загрузчика JavaScript API, являющаяся для обработки динамического варианта использования: System.load (или System.import). Этот API будет родным, эквивалентным приведенному выше require.

И за это время по всему миру было примеры использования этого System.import().


Перед выпуском webpack 2 авторы решили изменить System.import() на import():

добавить import() как конструкцию разделения кода. Он должен использоваться вместо System.import, когда это возможно. System.import будет устаревать в webpack 2 release (удалено в webpack 3) , так как поведение неверно согласно спецификации.

Этот import() основан на tc39/proposal-dynamic-import спецификации, и вы можете узнать больше, почему они сделали это изменение здесь.


Может ли кто-нибудь объяснить разницу между System.import() и import()?

Несмотря на другое имя, использование выглядит одинаково:

import(modulePath)
  .then(module => module.default())
  .catch(/* ... */);

System.import(modulePath)
  .then(module => module.default())
  .catch(/* ... */);

Но в weback 2 doc есть: "System.import() поведение неверно в соответствии со спецификацией" - поэтому он предполагает, что существует разница между System.import() и import().

Ответ 1

Важная часть вашей первой цитаты

спецификация написана

Когда Webpack 1 реализовал System.import, спецификация все еще развивалась. Если факт это все еще есть. Webpack 1 реализовал System.import, потому что это то, что было брошено вокруг как потенциальный API в то время.

Webpack 2 реализует import(), потому что это новое предложение стандартизировать синтаксический подход, а не на основе библиотеки.

Ответ 2

Здесь вы ищете: tc39 Предложение для импорта

Фактическая функция

Проекты коллекции идей Loader в разное время имели фактические функции (а не только синтаксические формы, подобные функциям) с именем System.import() или System.loader.import() или аналогичные, которые выполняют одни и те же варианты использования.

Самая большая проблема здесь, как ранее отмечалось редакторами спецификаций, заключается в том, как интерпретировать аргумент спецификатора для этих функций. Так как это просто функции, которые одинаковы во всем Царстве и не изменяются в каждом script или модуле, функция должна интерпретировать свой аргумент одинаково независимо от того, где он вызывается. (Если не реализовано что-то действительно странное, как проверка стека). Вероятно, это сталкивается с такими же проблемами, как проблема с базовым URL-адресом документа для функции importModule выше, где относительные спецификаторы модулей становятся фермой ошибок и не соответствуют никаким соседним объявлениям импорта.