2016-10-28 2 views
3

К сожалению, мои знания о загрузчиках модулей JavaScript все еще растут, и я пытаюсь понять их отношение к новому ES6 Modules. Насколько я могу судить по использованию загрузчика модуля, например CommonJS или RequireJS с использованием ES5JavaScript, действительно необходимо использовать асинхронный загрузчик модулей для повышения производительности и загрузки только по мере необходимости с использованием синтаксиса соответствующего модуля.Нужен ли мне модуль-загрузчик, если я использую модули ES6?

Однако, глядя на ES6module documentation и читать другую информацию, то мне кажется, что модуль загрузки изначально поддерживается через import и export ключевых слов. Если это так, я исправлю, что ES6 JS modules изначально поддерживает загрузку асинхронного модуля, и поэтому мне не нужно использовать дополнительный инструмент, например CommonJS или RequireJS?

+0

Осторожно, используя слово _native_ - родной в каком контексте? Операции 'import' /' export' официально не поддерживаются в браузерах/узлах и т. д., но поддерживаются такими транспилерами, как Babel (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Заявления/импорт) –

+0

@Supersharp За флагом, конечно? Спецификация загрузки модуля браузера не завершена, поэтому я был бы удивлен, если бы это было mainline. – CodingIntrigue

ответ

1

ES6 Файлы JavaScript по сути рассматриваются как модуль. если вы определяете что-либо в файле .js, оно будет отображаться только внутри этого файла (локальная область). что делает экспорт, он предоставляет классы/переменные, определенные как экспорт, видимые снаружи. то вы можете импортировать его в другой модуль. Существуют и другие способы определения таких модулей, как использование Commonjs или AMD и т. Д. Модульные загрузчики необходимы, если вы хотите динамически загружать модули. ех. Systemjs - это такой загрузчик динамического модуля. он будет извлекать физический файл модуля с сервера динамически, когда он запрашивается, и предотвратит наличие нескольких загрузок одного и того же файла. в приложении SPA в прошлом пришлось загружать все в начале, чтобы оно работало. с динамическими загрузчиками модулей теперь мы можем иметь только файлы, необходимые для выполнения намеченной работы. Надеюсь, что это поможет вам.

https://github.com/systemjs/systemjs

+0

Нет, ES6 все еще определяет семантику сценария. – Bergi

-1

Я правильно, что модули ES6 JS изначально поддерживают асинхронный модуль загрузки, и поэтому мне не нужно использовать дополнительный инструмент, как CommonJS или RequireJS?

Я бы сказал: Да ... Э-э ... Нет! как объяснено в комментариях г-на КЛИНГА.

CommonJS, RequireJS, require() заменяют и обходные пути на отсутствие загрузчика модулей в последних JS-двигателях.

Конечно, каждая библиотека будет сохранять свои собственные преимущества и философию, и вы можете продолжать использовать их еще долгое время.

Теперь (как только предусмотрен внутренний погрузчик), you'll get more choice!

Вы уже можете проверить, что на Edge 14 (активировать функцию с помощью о: флаги), или использовать polyfill from Guy Bedford.


Update Вот фрагмент, который работает в Крае без модуля загрузчика третьей стороной:

B2.onclick = function() //outside use 
 
{ 
 
    console.info(e1()) 
 
    output.innerHTML = "e1()=" + e1() 
 
}
<base href="https://noopole.github.io"> 
 
<h3>Test ES6 Module Loader in Edge 14</h3> 
 

 
<button id=B1 >default export form inside</button> 
 
<button id=B2 >name export from outside</button> 
 
<span id="output"></span> 
 

 
<script type="module"> 
 
    //default export 
 
    import x from './mymodule.js' 
 

 
    //named export 
 
    import {e1} from './mymodule.js' 
 

 
    //made global for extrnal use 
 
    window.e1 = e1 
 

 
    //inside use 
 
    B1.onclick = function() 
 
    { 
 
    console.info(x.func(1)) 
 
    output.innerHTML = "x.func(1) =" + x.func(1) 
 
    } 
 
</script>

код модуля и субмодуля here.

+0

Почему нисходящий? – Supersharp

+1

Возможно, потому что вы не совсем правы. Модули ES6 просто определяют синтаксис ** для объявления зависимостей, ничего больше. Либо среда предоставляет загрузчик модуля (в этом случае вам не нужно ничего делать), либо вы должны предоставить свой собственный. –

+0

Я проиллюстрировал свой ответ на примере – Supersharp

2

Насколько я понимаю, ES6 поддерживает синтаксис для определения и импорта модулей. Фактический акт импорта требуемых модулей - это работа инфраструктуры.

В современных браузерах (начиная с 2016 года) нет встроенных функций для поддержки загрузки модулей, и для этого вам все равно потребуется что-то вроде SystemJS для фактической загрузки.

+0

Является ли это на картах для браузеров для поддержки загрузки модулей? –

6

Мне кажется, что загрузка модулей поддерживается с помощью ключевых слов импорта и экспорта.

Не совсем. В объявлениях import и export определяются только зависимости и интерфейс каждого модуля. Они позволяют статически извлекать строки, которые называют требуемые модули, и ничего больше.

Если это так, не нужно ли использовать дополнительный инструмент, такой как CommonJS или RequireJS?

Нет, вы по-прежнему необходимо использовать загрузчик модулей ES6, который разрешает имена или пути или независимо от import с реальным модулем файлов и загружает их с помощью метода зависит от реализации.

Есть много инструментов или компилированные инструментов доступны, примеров для различных решений являются

  • WebPack: пучки все в один большой скрипт
  • System.js: грузы одиночных модулей динамически и асинхронно (по аналогии с тем, что требуется .js)
  • native: node.js и веб-браузеры все еще выясняют, как поддерживать загрузку модуля без дополнительных библиотек
  • babel transpilation: вы можете конвертировать модули ES6 в формат AMD или CommonJS и использовать kno wn таких инструментов, как require.js для этих
+0

Как раз для того, чтобы закончить цикл в моем понимании, если я не буду использовать динамический модуль-загрузчик, такой как выше, это означало бы, что я буду подчинен старому школьному способу ссылки на каждого человека ».Файл модуля js', необходимый в файле 'index.html' (или, может быть, один файл, если я в комплекте и проиндексирован)? – atconway

+0

@atconway На самом деле, в старой школе '

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