2017-02-12 3 views
11

В webpack 1 docs is statement, что в WebPack 2 будет использовать System.import() для динамического требуется:Разница между System.import() и import()?

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

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


Before releasing webpack 2, авторы решили изменить System.import() к import():

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

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


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

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

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

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

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

+0

Если я читаю ссылки, которые вы предоставили право, очень важным отличием является то, что 'import()' знает о скрипте или модуле, которые его вызывали, а 'System.import()' is not. Если я прав, это означает, что возможен импорт («../foo»), то есть разрешение относительно текущего модуля. Опять же, я могу ошибаться, пожалуйста, поправьте меня. –

+0

Похоже, что разница возникла из [этой проблемы github] (https://github.com/webpack/webpack/issues/2163) – Marlon

ответ

3

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

спецификация записывается

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

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

+3

Это не объясняет, в чем практическая разница между этими двумя, если они есть. – estus

0

Вот то, что вы ищете: tc39 Proposal for Import

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

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

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

Смежные вопросы