В JavaScript не было встроенной системы модулей. Вот почему у нас так много разных способов импорта и экспорта модулей.

Давным-давно

Первоначально, когда мы думаем о разделении функциональности, согласно логике, мы имеем разные файлы JS.

например -

теперь предположим, что пользовательские файлы имеют это содержимое

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

вы можете проверить в объекте окна инструментов разработчика, что все свойства доступны в глобальном пространстве имен

что приводит к конфликту функций и имя переменной и логики, а также множественным обращениям к серверу для каждого файла.

Обертки

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

например -

./App.js

переменная Приложение = {}

теперь в user.js вы можете создать оболочку и выполнить ее, присвоив значение приложению, как показано ниже:

Теперь, если вы запустите это и снова проверите объект окна, то объект пользователя не присутствует глобально, но доступен в приложении.

также вы можете видеть, что userWrapper также доступен в объекте окна,

плюсы — мы могли абстрагироваться от глобального пространства имен,

минусы — но существует высокая вероятность конфликта имени функции, если мы импортируем любую библиотеку, которая может иметь то же имя функции, что и userWrapper

ИИФЭ

Чтобы противодействовать тому, что мы можем использовать IIFE (немедленно вызывает выражение функции) для создания анонимных функций, как вы можете видеть в предыдущем примере, мы используем объявление именованной функции только для ее вызова, чтобы обойти это мы можем немедленно вызвать, и теперь мы можем избежать коллизий именованных функций

eg-

Однако мы должны поддерживать порядок тегов скриптов в HTML, так как один файл JS может зависеть от другого, поэтому порядок важен.

Общие J

Теперь, чтобы избежать IIFE, на сцену вышли модули CommonJs.

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

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

Компоновщик модулей –

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

Он проверяет кодовую базу и файлы экспорта и интеллектуально объединяет ваше приложение в один файл bundle.js.

Возьмем, к примеру, сборщик Webpack

do

npm установить веб-пакет

настроить конфигурацию веб-пакета, как показано ниже

см., что наша точка входа в приложение — App.js, а имя выходного файла — bundle.js.

Теперь мы можем включить один файл в наш HTML, удалив все остальные теги скрипта файла, как показано ниже.

обновить начальную конфигурацию в package.json до webpack

и запустите npm run start

Теперь мы можем увидеть файл bundle.js с нашим кодом, проанализированным и приведенным в порядок.

это дает свободу от структуры IIFE, а также теперь нам не нужно заботиться о порядке также включены теги script. Также избегается обертывание глобальных объектов в APP.js.

МОДУЛИ ES -

Изначально в js не было модульной структуры, но многие вещи в js значительно улучшились.

Модули ES появились в последней версии

теперь в отличие от commonJs он дает асинхронный импорт модулей

Модули ES предоставляют ключевые слова import и export для совместного использования логики между файлами.

вместо require и module.export в commonJS

Использование модулей -

Модули ES предоставляют ключевые слова import и export для совместного использования логики между файлами.

Вы можете экспортировать более одной вещи из любого файла js

чтобы использовать эти функции в любом другом приложении, просто импортируйте его, используя ключевое слово import -

например, для использования пользовательских функций в App js мы можем импортировать эти функции, как показано ниже:

Либо вы можете использовать * функциональность для импорта всего

or

// используем деструктуризацию объекта

импортировать {firstuser , sort} из «./user»

есть и другой жаргон, например импорт по умолчанию

например -

./user.js

теперь, чтобы импортировать его, вы можете увидеть ниже синтаксис -

импортировать сортировку, {users} из «./user»

тег скрипта

вы можете просто добавить type = module для вашего основного файла

‹script type="module" src="./user.js" async defer›‹/script›

теперь, чтобы запустить это, вам нужно запустить http-сервер для папки вашего проекта, и все запустится, как и раньше.

Здесь jsPrac - папка моего проекта