Почему есть спецификация для синхронизации и асинхронных модулей?

Я только что закончил читать эту статью о модулях Javascript. Я могу понять, что модули CommonJS загружаются синхронно, а модули AMD - асинхронно.

Чего я не понимаю, так это как я могу стать магически синхронным, если я пишу его в формате CommonJS, или как он становится магически асинхронным, если я пишу его в формате AMD. Я имею в виду, что JavaScript не имеет define или же require даже ключевое слово. Все они - спецификации, а не библиотеки.

Я имею в виду, что поведение загрузки модуля зависит от загрузчика модуля, а не от его структуры. И если это так, зачем следовать шаблону кодирования для разных типов модулей?

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

Если мое предположение верное, то почему даже есть спецификация для UMD? Я имею в виду, что если скрипт загружается в зависимости от среды, в которой он присутствует, зачем создавать спецификацию для универсальной загрузки модуля?

Может ли кто-нибудь помочь мне с этим замешательством?

2 ответа

Это хороший вопрос. Это тема, которая вызвала много горячих дискуссий в сообществе Node. Чтобы иметь хорошее представление о том, что это все о вас, следует прочитать:

Теперь, отвечая на ваш вопрос - Почему существует спецификация для модулей синхронизации и асинхронности? Потому что некоторые сценарии использования предпочитают синхронную загрузку модулей, например серверные модули в Node.js, куда вы хотите загрузить все необходимое перед началом обработки запросов, а некоторые сценарии предпочитают асинхронную загрузку модулей, как в браузере, когда вы не используете не хочу блокировать поток рендеринга во время загрузки зависимостей.

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

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

Другая проблема связана с кэшированием и мутацией уже загруженных модулей. С синхронной загрузкой модуля с использованием require Вы загружаете модуль только один раз и любые другие вызовы require для одного и того же модуля во всей кодовой базе (для этого процесса) вернуть кэшированный ответ, который каждый раз является одним и тем же объектом. Любая часть кода может изменить этот объект, и он доступен для любой другой части кода. Некоторые варианты использования, использующие эту функцию, будут гораздо сложнее реализовать. Кроме того, порядок загрузки и выполнения кода будет сложнее предсказать.

Чтобы подвести итог ответа на ваш вопрос, есть аргументы для обоих способов загрузки модулей, и ни один из этих способов не является явным победителем для каждого сценария. Оба необходимы, и у обоих есть некоторые спецификации, чтобы стандартизировать их поведение.

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

Я имею в виду, что поведение загрузки модуля зависит от загрузчика модуля, а не от его структуры. И если это так, зачем следовать шаблону кодирования для разных типов модулей?

То, загружен ли модуль синхронно или асинхронно, зависит от загрузчика модуля, но ваш модуль должен иметь возможность использовать загрузчик модуля, поэтому должен иметь интерфейс для связи с загрузчиком. Вы не можете загружать модули в node.js, используя amd define функция. Вы должны использовать require,

Если мое предположение верное, то почему даже есть спецификация для UMD? Я имею в виду, что если скрипт загружается в зависимости от среды, в которой он присутствует, зачем создавать спецификацию для универсальной загрузки модуля?

Скрипт не загружается в зависимости от среды, он загружается через интерфейс загрузчика. UMD предназначен для библиотек, которые люди используют как в браузере, так и на сервере. Автору библиотеки не нужно создавать две версии библиотеки, одну для браузера и одну для узла, потому что UMD знает, как справиться с обоими.

Другие вопросы по тегам