2016-10-29 1 views

ответ

2

Как работает функция RequireJS?

Каждый модуль содержится внутри вызова define, который определяет зависимости модуля. При этом RequireJS создает своеобразное дерево для упорядочивания каждого модуля из одного без зависимостей, с тем, который имеет большинство зависимостей.

Модуль с одной зависимостью может быть тем, который зависит от всего, если его зависимость зависит от другого модуля, который зависит от 2-3 других модулей, а затем он продолжается так.

define(['some/dep'], function(someDep){ /* ..snip.. */ }); 

В таком порядке, RequireJS создает <script> тег с URL к файлу модуля и вставляет этот сценарий тег в конце <head>. Браузер загружает файлы JavaScript, а запускает их в том порядке, в котором они присутствуют в HTML.

Затем, когда каждая зависимость определяется для запуска модуля, функция этого модуля вызывается с каждой зависимостью (ранее определенной), введенной в заводскую функцию модуля, и ее результат сохраняется.

Как это может быть асинхронный без потоков?

Это асинхронный, но необязательно параллельный. Скрипты загрузки могут быть параллельными, поскольку браузер (по крайней мере, хром наверняка) делает несколько подключений к серверу для получения большего количества файлов одновременно, но это не имеет ничего общего с JS.

Асинхронный характер JavaScript возникает в цикле событий.

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

Это легче понять, когда вы его видите, и вы можете в инструментах разработчика chrome Timeline tab.

Async callstacks in chrome's dev tools

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