Модули в JavaScript: зачем нужны и как с ними работать
Модули в JavaScript: зачем нужны и как с ними работать
Современные проекты в JavaScript невозможно представить без модулей. Они делают код чище и удобнее. Рассказываем, в чём суть модулей и как их применяют в IT-проектах.
В JavaScript модуль представляет собой отдельный файл с кодом, который можно использовать в других частях приложения. Он может содержать функции, переменные, классы или константы.
Каждый модуль JS решает свою задачу: например, работа с данными, взаимодействие с API, отрисовка интерфейса. Получается, проект делится на логические блоки, который из которых изолирован и отвечает за одну задачу. Вот зачем ещё нужны модули:
Освоить фронтенд-разработку с нуля за 10 месяцев можно на курсе «Фронтенд-разработчик». В программе — много практики на реальных проектах, а также модуль по алгоритмам, который помогает повысить шансы устроиться в Яндекс.
Исторически в JavaScript существовало несколько способов организации кода. Но на практике современные разработчики чаще всего используют CommonJS и ES Modules.
ES6 Modules (или ESM) — это современный способ организации кода в JavaScript. Он стал единым решением для работы с модулями как в браузере, так и в Node.js.
Принцип работы простой: каждый JavaScript-файл может выступать в роли модуля. Для этого используются ключевые слова import и export.
В ESM поддерживаются два типа экспорта: именованный и экспорт по умолчанию. Именованный экспорт позволяет передавать несколько функций, классов или переменных из одного файла.
Экспорт по умолчанию позволяет экспортировать только один элемент из файла. Чаще всего используется для главной функции или класса.
Импортировать данные тоже можно по-разному. Вот, например, именованный импорт:
А вот импорт по умолчанию:
Чтобы модули заработали в браузере, в HTML нужно указывать атрибут type="module». Если этого не сделать, браузер не поймёт синтаксис import и export.
В Node.js до версии 12 модули по умолчанию работали только через CommonJS (require). Чтобы включить поддержку ESM, приходилось указывать расширение .mjs или добавлять «type»: «module» в package.json. Теперь можно писать:
Существуют две основные системы модулей в JavaScript: CommonJS (CJS) и ES Modules (ESM). Главное различие: CommonJS загружает модули синхронно, а ES Modules поддерживают асинхронную загрузку.
Модули помогают структурировать код и переиспользовать части программы. Рассмотрим несколько реальных ситуаций.
Обычно модули в JavaScript подключаются статически с помощью import. То есть все зависимости известны заранее, и они подгружаются при старте приложения.
Но бывают ситуации, когда заранее неизвестно, какой модуль нужен. В таких случаях используется динамическая загрузка с помощью функции import (). Вот как это выглядит:
Работа с модулями в JavaScript может вызвать трудности, особенно у начинающих разработчиков. Рассмотрим ошибки и рекомендации, которые помогут их избежать.
● Отсутствие type="module» в HTML. При подключении модулей в браузере нужно явно указывать тип. Например, неправильно писать так: <script src="app.js"></script>. Правильно: <script type="module" src="app.js"></script>.
● Смешивание CommonJS и ES Modules. Если использовать require вместе с import без настройки окружения, это тоже приводит к ошибкам. В Node.js рекомендуют выбрать один стандарт: либо CJS, либо ESM.
● Неправильные пути к модулям. В ESM нужно обязательно указывать относительный путь (./ или ../). Например, неверно писать: import { add } from 'math.js'. Правильно: import { add } from './math.js'.
● Циклические зависимости. Если модуль A импортирует модуль B, а модуль B — снова A, то возможны ошибки и неполные данные. Например, один из модулей может оказаться пустым:
● Слишком много логики в одном модуле. Иногда разработчики складывают в один файл всё подряд: и работу с API, и бизнес-логику, и утилиты. Такой монолитный модуль потом сложно поддерживать и тестировать. Лучше разбивать код на более мелкие и понятные части.
● Жёсткие зависимости между модулями. Если модуль напрямую зависит от деталей реализации другого модуля, это усложняет изменения. Например, разработчик меняет внутреннюю функцию одного модуля — и внезапно ломается весь проект. Чтобы этого избежать, лучше экспортировать только публичный API, а внутренние детали можно скрыть.
Лучшие практики
Совет эксперта
Читать также: