Модули в JS

В этой статье вы узнаете, что такое модули и зачем они нужны в JavaScript.

Любая программа постепенно растет и включет в себя больше и больше строк кода. Если хранить весь код в одном большом файле, менять программу или найти там что-то будет неудобно.

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

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

Пример

Допустим, у нас в файле greet.js находится следующий код:

// экспортируем функцию
export function greetPerson(name) {
    return `Привет, ${name}`;
}

Чтобы использовать код из greet.js в другом файле (модуле), нужно импортировать greet.js.

// импортируем greetPerson из greet.js
import { greetPerson } from './greet.js';

// используем greetPerson() из greet.js
let displayName = greetPerson('Андрей');

console.log(displayName); // Вывод: Привет, Андрей

Как это работает

В модуле greet.js мы экспортировали функцию greetPerson() с помощью ключевого слова export.

export function greetPerson(name) {
    ... 
}

• В другом модуле мы импортировали функцию greetPerson() с помощью ключевого слова import. Для импортирования функцию, переменных, объектов и т.д., нужно обернуть их фигурными скобками {}.

import { greetPerson } from './greet.js';

Примечание. Использовать в основном файле можно только те функции, переменные, объекты и т.д, которые экспортированы из модуля и импортированы в основной файле. 

Экспортирование нескольких объектов

В JavaScript из модуля можно экспортировать сразу несколько функцию, переменных, объектов и т.д. 

Допустим, в некотором модуле module.js у нас есть такой код: 

// экспортируем переменную
export const name = 'Программа на JavaScript';

// экспортируем функцию
export function sum(x, y) {
    return x + y;
}

Тогда в основном файле можно импортировать переменную name и функцию sum одновременно — следующим образом:

import { name, sum } from './module.js';

console.log(name);
let add = sum(4, 9);
console.log(add); // Вывод: 13

Переименование импортов и экспортов

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

Чтобы избежать конфликта имен, можно переименовать переменные, функции, объекты и т.д. при импортировании или экспортировании.

1. Переименование в модуле (файл экспорта)

// переименование импорта в module.js
export {
    function1 as newName1,
    function2 as newName2
};

// когда хотим использовать модуль, 
// импортируем из него нужные функции
import { newName1, newName2 } from './module.js';

Когда мы экспортировали функции из файла module.js, мы обращались к ним по новым именам: newName1 и newName2

2. Переименование в основном файле (файл импорта)

// внутри module.js
export {
    function1,
    function2
};

// когда нужно использовать модуль, 
// импортируем функции в основной файл с другими именами
import { function1 as newName1, function2 as newName2 } from './module.js';

Когда мы импортировали функции, мы задали им новые имена newName1 и newName2

Экспорт по умолчанию (export default)

Разберем, что это такое, на примере.

Вернемся к модулю greet.js и немного изменим его.

// экспортирование по умолчанию
export default function greet(name) {
    return `Привет, ${name}`;
}

export const age = 23;

Импортировать тееперь можно так:

import random_name from './greet.js';

 Как это работает

  • random_name (это может быть любое имя) импортируется из greet.js. Но поскольку в файле greet.js отсутствует такой объект, импортируется тот объект, который помечен ключевыми словами export default, — в нашем случае функция greet().
  • Объект, помеченный export default, в основном файле получает имя random_name.
  • Использовать фигурные скобки {} в этом случае необязательно.

Примечание. В программе может быть только один экспорт по умолчанию (export default).

Преимущества использования модулей

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

Примечание. Ключевые слова import и export работают не во всех браузерах. Узнать, поддерживает ли их ваш браузер, можно на странице JavaScript import/export Support.

Проверьте себя
1. Как импортировать именованный экспорт функции greetPerson из файла greet.js?
Aimport greetPerson from './greet.js'
Brequire('./greet.js')
Cimport { greetPerson } from './greet.js'
Dinclude greetPerson from './greet.js'
2. Сколько export default может быть в одном файле?
AНеограниченно
BНе более двух
CТолько один
DЗависит от размера файла
3. Зачем переименовывают импорты с помощью as?
AЧтобы избежать конфликта имён
BДля сокращения кода
CЭто обязательный синтаксис
DДля ускорения выполнения
4. Нужны ли фигурные скобки при импорте export default?
AДа, всегда
BДа, только если имя совпадает
CНет, но их можно добавить
DНет, фигурные скобки не нужны