PS: Эта статья была впервые опубликована в моем блоге здесь
Существенным аспектом разработки программного обеспечения является эффективность. Каждому успешному приложению необходима прочная архитектурная структура, позволяющая без сбоев масштабироваться на всех уровнях. В связи с этим используются несколько методов и шаблонов для обеспечения эффективности кода.
В этой статье я расскажу вам о модулях ES6, о том, что они из себя представляют, как их использовать и почему вам это должно быть небезразлично {0 [] 0}
Что такое модуль?
В JavaScript слово «модули» относится к небольшим блокам независимого многоразового кода. Они являются основой многих шаблонов проектирования JavaScript и критически необходимы при создании любого существенного приложения на основе JavaScript.
Проще говоря, модули помогают писать код в модуле и открывают только те части кода, к которым должны получить доступ другие части кода.
В JavaScript уже давно есть модули. Однако они были реализованы с помощью библиотек, а не встроены в язык. ES6 - это первый случай, когда JavaScript имеет встроенные модули.
- Каждый модуль - это фрагмент кода, который выполняется после загрузки файла JavaScript.
- В этом коде могут быть объявления (переменные, функции, классы и т. Д.).
- По умолчанию каждое объявление в этом файле остается локальным для этого модуля и не может быть доступно в других модулях, если файл модуля не экспортирует их.
Что такое модули ES6?
Раньше было невозможно напрямую ссылаться на один файл JavaScript или включать его в другой, поэтому разработчики прибегали к альтернативным вариантам, таким как несколько тегов сценария HTML.
<script src="app.js"></script>
<script src="search.js"></script>
<script src="user.js"></script>
<script>
console.log('inline code');
</script>
Это плохая практика, поскольку каждый сценарий инициирует новый HTTP-запрос, который влияет на производительность страницы и нарушает дальнейшую обработку во время ее выполнения.
Допустим, у нас есть файл app.js
, и в этот файл включена функция, которая проверяет каждое ограничение в числе и возвращает, ЧЕТНОЕ или НЕЧЕТНОЕ.
function showNumbers(limit) { for (let i = 0; i <= limit; i++) { const message = (i % 2 === 0) ? 'EVEN' : 'ODD'; console.log(i, message); } }
Теперь эта функция доступна только в app.js
. Где бы вам ни понадобилась эта функция, вы должны либо переписать функцию, либо снова прикрепить скрипт.
Здесь на помощь приходят модули ES6 :)
С модулями ES6 вы можете объединить все скрипты в один основной скрипт, пометив некоторые из них как экспорт, а затем другие модули могут их импортировать.
Перед выпуском ES2015 существовало как минимум 3 основных модуля, конкурирующих со стандартами:
- Определение асинхронного модуля (AMD)
- Модули RequireJS
- Модули CommonJS
Поэтому в ES6 (ES2015) был предложен единый стандарт собственных модулей.
Модули ES6 - это очень мощная концепция, хотя поддержка пока доступна не везде, распространенный способ их использования - перенос в ES5. Вы можете использовать Grunt, Gulp, Webpack, Babe l или какой-либо другой транспилятор для компиляции модулей в процессе сборки.
Транспилеры или компиляторы преобразования исходного кода в исходный - это инструменты, которые считывают исходный код, написанный на одном языке программирования, и создают эквивалентный код на другом языке. (Википедия)
Браузеры с поддержкой модулей ES6, май 2017 г. [Источник]
То, что вы должны знать!
- Все внутри модуля ES6 по умолчанию является приватным и работает в строгом режиме (
'use strict'
не требуется). - Открытые переменные, функции и классы отображаются с помощью
export
. - Открытые модули вызываются в другие модули с помощью
import
- Модули должны быть включены в ваш HTML с помощью
type="module"
, который может быть встроенным или внешним тегом скрипта.
<script type="module" src="main.js"></script> <script type="module"> // or an inline script </script>
- Модули отложены и запускаются только после загрузки документа.
Чтобы получить более подробные сведения о модулях ES6, прочтите здесь.
Как использовать модули ES6
Для этой статьи давайте создадим три файла (app.js
, math.js
и max.js
)
В math.js
напишем базовый арифметический алгоритм
let sumAll = (a, b) => {return a + b;} let subtractAll = (a, b) => {return a - b;} let divideAll = (a, b) => {return a / b;} let multiplyAll = (a, b) => {return a * b;} let findModulus = (a, b) => {return a % b;}
Теперь, чтобы сделать этот модуль доступным для других частей нашего кода, нам нужно export
их. Есть несколько способов сделать это;
- Вы можете экспортировать каждый модуль по отдельности:
export let sumAll = (a, b) => {return a + b;} export let subtractAll = (a, b) => {return a - b;} export let divideAll = (a, b) => {return a / b;} export let multiplyAll = (a, b) => {return a * b;} export let findModulus = (a, b) => {return a % b;}
- Лучше использовать один оператор экспорта.
let sumAll = (a, b) => {return a + b;} let subtractAll = (a, b) => {return a - b;} let divideAll = (a, b) => {return a / b;} let multiplyAll = (a, b) => {return a * b;} let findModulus = (a, b) => {return a % b;} export {sumAll, subtractAll, divideAll, multiplyAll, findModulus};
- Вы также можете экспортировать значения по умолчанию
export default {sumAll, subtractAll, multiplyAll, divideAll};
Примечание. Вы экспортируете только те модули, которые хотите использовать в других частях вашего кода, вам не обязательно экспортировать каждый модуль в этом скрипте.
Теперь, чтобы использовать наши экспортированные модули, нам нужно импортировать их в app.js
. Это также можно сделать несколькими способами;
- Вы можете импортировать индивидуально
import {sumAll} from './math.js';
Давайте протестируем наш импорт
console.log(sumAll(9, 8)); //17
- Вы можете импортировать сразу несколько модулей:
import {sumAll, subtractAll, divideAll} from './math.js';
- Вы можете импортировать модули как псевдонимы
В некоторых компьютерных операционных системах и языках программирования псевдоним является альтернативным и обычно более понятным или более значимым именем для определенного объекта данных. Подробнее здесь
import * as math from './math.js';
Здесь мы импортировали все модули в math.js
и присвоили им псевдоним math
. Чтобы использовать этот импортированный модуль, мы делаем это:
console.log(math.sumAll(50, 10)); // 60 console.log(math.subtractAll(50, 10)); // 40 console.log(math.multiplyAll(50, 10)); // 500 console.log(math.divideAll(50, 10)); // 5 console.log(math.findModulus(50, 15)); // 5
- Вы также можете импортировать значения по умолчанию
import math from './math.js'; console.log(math.sumAll(5, 2)); // 7
Здесь мы импортировали sumAll()
в math.js
и назначили его псевдониму math
. Здесь нет необходимости добавлять * as
.
Если вы не экспортируете как
default
и импортируете с помощью этого метода, вы получите следующую ошибку:
Uncaught SyntaxError: The requested module './math.js' does not provide an export named 'default'
Чтобы использовать этот метод, вы должны экспортировать sumAll()
как default
export default {sumAll};
- Вы также можете использовать абсолютный путь для импорта модуля, чтобы ссылаться на модули, определенные в другом домене:
import {
sumAll}from '
https://bolaji-module.glitch.me/sumAll.js'; console.log(sumAll(50, 10)); // 60
Примечание. Модули загружаются с помощью CORS. Это означает, что если вы ссылаетесь на сценарии из других доменов, они должны иметь допустимый заголовок CORS, который разрешает межсайтовую загрузку.
Модули импортируются либо с абсолютными, либо с относительными ссылками и должны начинаться с «/», «./» или «../».
import {sumAll} from 'math.js'; ❌ import {sumAll} from 'lib/max.js'; ❌ import {sumAll} from './math.js'; ✔️ import {sumAll} from '../max.js'; ✔️import {
sumAll}from '
https://bolaji-module.glitch.me/sumAll.js'; ✔️
- Вы можете импортировать несколько модулей из разных файлов, в нашем
max.js
добавьте это:
let max = (a, b) => { return (a > b) ? a : b; } export {max};
Теперь вы можете импортировать max.js
и math.js
вместе в app.js
import * as math from './math.js'; import {max} from './max.js'; console.log(max(50, 10)); // 50 console.log(math.subtractAll(50, 10)); // 40 console.log(math.multiplyAll(50, 10)); // 500 console.log(math.divideAll(50, 10)); // 5
Вы можете импортировать несколько файлов, но мы также должны помнить, что наличие более чем нескольких модулей приведет к снижению производительности нашего приложения, используйте модули только при необходимости.
Некоторые преимущества использования модулей
- Код можно разделить на более мелкие файлы с автономной функциональностью.
- Можно объединить несколько сценариев, что повысит производительность.
- Отладка становится проще.
- Любой код, ссылающийся на модуль, понимает, что это зависимость. Если файл модуля изменяется или перемещается, проблема сразу становится очевидной.
- Модули (обычно) помогают устранить конфликты именования. Функция
sumAll()
в модуле1 не может конфликтовать с функциейsumAll()
в модуле2. Здесь очень полезны псевдонимы, это становитсяmodule1.sumAll()
иmodule2.sumAll()
. - Модули ES6 всегда выполняются в
strict mode
, поэтому‘use strict’
не требуется. - Модули ES6 помогут вам лучше организовать ваш код
ЗАКЛЮЧЕНИЕ
Модули ES6 - одна из самых больших функций, представленных в современных браузерах. Современные JavaScript-фреймворки, такие как Vue JS и React JS, используют эту функцию.
Вы также должны знать, что модули ES6 поддерживаются не всеми браузерами. Для производственных приложений транспилеры, такие как Webpack и Babel, используются для преобразования нашего кода из ES6 в ES5 для обеспечения кросс-браузерной совместимости.
Что касается этой статьи, завтра я напишу еще две статьи, чтобы показать вам, как использовать Babe l в качестве транспайлера (статья будет охватывать вводное руководство по установке и настройке Babel) и как эффективно работать с
node_modules
в разработке и производстве.
Подпишитесь на мою рассылку здесь и получайте уведомления, когда она упадет!
Итак, пока вы ждете статьи о Babel transpiler, практикуйте все, что вы узнали из этой статьи, используйте ее в разных проектах и пробуйте все методы, описанные, чтобы лучше понять модули ES6.
ОБНОВИТЬ
Вот статья "Введение в Babel и JavaScript Bundlers".
Вам нужно сделать две вещи
Используйте Live-сервер для запуска ваших HTML-файлов.
Загрузите веб-сервер для Chrome здесь
Вы также можете использовать расширения Live-сервера в редакторе кода: VScode, Atom
Не забудьте добавить
type="module"
при добавлении основного скрипта
При использовании транспайлеров все это вам не понадобится.
Посмотрите мою последнюю статью, которую я написал на Manipulating JavaScript Arrays
Если возникли вопросы или возникли вопросы, задавайте их в комментариях!