# 01. Modules

The modularity solves next issues:

* code isolation,
* dependency definition between modules,
* delivering of the code into execution environment.

**Модуль** - это инкапсулированный блок кода, экспортирующий конкретные интерфейсы для использования другими модулями.

* Модулем в ES6 считается любой `.js`-файл с кодом.
* Одному файлу соответствует один модуль и наоборот.
* Внутри модуля могут находится объявления переменных, исполняемый код и т.д.
* Все объявления переменных локальны внутри модуля.
* Содержимое модуля в по умолчанию выполняется в строгом режиме.
* Модуль выполняется один раз при загрузке. Первый импорт запускает выполнение тела модуля.
* Даже если модуль импортируется множество раз, существует только один экземпляр модуля и его переменных.
* В модуле ключевым словом `export` помечаются переменные и функции, которые могут быть использованы за пределами данного модуля, при помощи `import` выражения в другом модуле.
* Модуль может подключать определения в других модулях при помощи декларации `import`.
* Всегда выполняется импорт определений (bindings), а не значений.
* Модули в ES6 resolved at compile-time.

```javascript
//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
  return x * x;
}
export function diag(x, y) {
  return sqrt(square(x) + square(y));
}

//------ main.js ------
import { square, diag } from "lib";
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5
```

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

Целью разработки модулей в ES6 являлось создание общего фундамента для единой модульной системы

* Компактный синтаксис;
* Compile-time резолюция модулей (for static checking, optimization, etc.);
* Поддержка одиночного и множественного экспорта;
* Поддержка циклических зависимостей;
* Поддержка асинхронной загрузки модулей;
* Конфигурация загрузки модулей;

Стандарт модулей из ES6 включает в себя:

* Спецификация модуля.
* Декларативный синтаксис экспорта/импорта модулей.
* Спецификация загрузчика модулей.

Преимущества модулей:

* Решают проблему конфликта имен, глобального объекта и глобальной области видимости.
* Модульность и пере-использование кода.
* Улучшается поддерживаемость кода.
* Удобный экспорт по умолчанию (основной сценарий использования).
* Компактный синтаксис.
* Статическая структура зависимостей, позволяющая ряд оптимизаций
* `import` происходит только на верхнем уровне программы.
* Поддержка как синхронного, так и асинхронного режима при едином синхронном синтаксисе.
* Поддержка циклических зависимостей.
