2014-07-03 3 views
5

Я был readingaboutes6 module loaders, и я просто не совсем понимаю, как это работает, и я надеюсь, что кто-то сможет просветить меня.Как работает загрузочный модуль модуля ES

В практических рабочих процессах ссылка выше они есть пример, как этот

System.import('app/app').then(function(app) { 
    // app is now the Module object with exports as getters 
}); 

Нет проблемы с этим - я понимаю. Но тогда я вижу такие вещи, как это

var $ = require('jquery'); 

и получить действительно смущен. Что произойдет, если во время этого вызова jquery еще не был перенесен в браузер? Ли спина просто вращается? Разве браузер анализирует ваш сценарий за кадром и преобразовывает его в обратный вызов, например RequireJs? Это то, что он настраивает? Существуют ли конкретные ограничения?

Может кто-нибудь дать мне краткое изложение?

+1

Вторая вещь, которую вы видите, это загрузка модуля CommonJS, а не ES6 afaik. Это действительно [не работает (ну) внутри require.js] (http://requirejs.org/docs/api.html#cjsmodule) – Bergi

+0

@Bergi работает отлично в require.js, в то время как я не предпочитаю его в моем текущем проекте есть определенные страницы, которые используют requirejs в стиле commonjs. Requirejs сканирует ваш скрипт для выражений commonjs и переписывает его в формат amd, поэтому он все еще использует обратные вызовы. Однако, если я не ошибаюсь, предложение es6 НЕ использует обратные вызовы - отсюда и моя путаница. –

+0

Да, и сканирование сценария не работает хорошо для всех, кроме самых простых случаев. Можете ли вы связать часть предложения ES6, что вы имеете в виду? 'System.import' явно использует обратные вызовы. – Bergi

ответ

4

Загрузчик модуля ES6 будет извлекать источник, определять зависимости и дожидаться загрузки этих зависимостей перед выполнением модуля. Таким образом, к моменту выполнения требования, зависимость уже сидит там, ожидая исполнения.

При загрузке CommonJS через загрузчик модуля ES6 мы полагаемся на статический анализ операторов запроса из источника и выполняем только исходный код, как только они требуют загрузки.

Таким образом, мы можем поддерживать CommonJS в браузере, загружаемом динамически. Циркулярные ссылки обрабатываются одинаково с тем, как они обрабатываются в узле.

Регулярные выражения, анализирующие требование, на самом деле довольно надежные и быстрые, принимая во внимание комментарии и окружающие токены. См. https://github.com/systemjs/systemjs/blob/master/lib/extension-cjs.js#L10 для той, которая используется SystemJS.

Существует одно ограничение, связанное с этим подходом, и которое является динамическим и условным. Для этого необходимо, чтобы if (condition) require('some' + 'name') не были обнаружены должным образом. Это необходимая стоимость, но для того, чтобы заставить CommonJS вести себя как полностью асинхронный формат модуля в браузере.

+1

Спустя некоторое время после того, как я написал этот вопрос, мы получили [эту удивительную статью о модулях es6] (http://www.2ality.com/2014/09/es6-modules-final.html). Это прямо противоречит некоторым из того, что вы сказали (например, синтаксический анализ регулярных выражений, способ работы круговых зависимостей и наличие динамических потребностей). Также кажется, что некоторые из моих путаниц, по крайней мере, в том, что модули и модульные загрузчики являются отдельными спецификациями, из которых только первый закончен. –

+2

Модуль загрузчика модуля ES6 имеет два способа интерпретации модулей: 1. Модули ES6 2. Форматы устаревших модулей Мы можем построить в устаревшем модуле формат в загрузчик модуля ES6 через крючок под названием «экземпляр». Вы правы - загрузка модуля ES6 также имеет свой собственный круговой стиль ссылки, который отличается от CommonJS. При написании поддержки CommonJS в загрузчике это может обеспечить круглую справочную поддержку в стиле CommonJS. С точки зрения спецификаций поведение класса загрузчика модуля в спецификации ES6, то, что является отдельной спецификацией, является точной привязкой к среде. – guybedford

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