Лекция
Привет, Вы узнаете о том , что такое модули в javascript шаблон модуль и его форматов, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое модули в javascript шаблон модуль и его форматов, commonjs amd umd , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).
Модуль — часть кода, которая инкапсулирует детали реализации и предоставляет открытый API для использования другим кодом.
JavaScript изначально не имел встроенной поддержки модулей, в отличие от большинства других языков программирования, но с усложнением фронтенда стала очевидна необходимость структурирования кода.
Это привело к появлению сначала паттерна программирования «Модуль», а затем и отдельных форматов: CommonJS, AMD, UMD, и специальных инструментов для работы с ними. Нативная система модулей в JavaScript добавилась в спецификации ECMAScript 6, а разработчики браузеров работают над ее поддержкой.

Первое использование этого подхода было замечено в 2003 году, когда Ричард Корнфорд привел его в качестве примера использования замыканий.
В 2005-2006 годах разработчики YUI использовали этот подход для своего фреймворка.
Наибольшую популярность шаблон «Модуль» получил после того, как Дуглас Крокфорд описал его в своей книге «JavaScript the Good Part»
Шаблон «Модуль» основывается на немедленно вызываемой функции (IIFE):
JavaScript
var MODULE = (function() {
var privateVariable = 1;
function privateMethod() {
// ...
}
return {
moduleProperty: 1,
moduleMethod: function() {
// ...
}
};
}());



Немедленно вызываемая функция образует локальную область видимости, в которой можно объявить необходимые приватные свойства и методы. Результат функции — объект, содержащий публичные свойства и методы.
С помощью передачи параметров в немедленно вызываемую функцию можно импортировать зависимости в модуль. Это увеличивает скорость разрешения переменных, поскольку импортированные значения становятся локальными переменными внутри функции.
JavaScript
(function ($) {
// ...
}(jQuery));
Если нужно выполнить без немедленного вызова, то можно использовать обекты с свойсвами из функций на Javascript
например
window.SomeModule = {
someBlock1: '[data-first-Block]',
someBlock2: '[data-second-block]',
buttons: {
botton1: '[data-botton1]',
botton2: '[data-botton2]'
},
urls: {
action1Url: '/url1',
action2Url: '/url2',
},
init: function () {
this.initActions();
},
initActions: function () {
var $this = this;
$('body').on('click', this.buttons.botton1, function () {
$this.add($(this).data('id'));
});
$(document).ready(function () {
$this.initPlugin();
});
},
initPlugin: function () {
var $this = this;
},
add: function (id, options) {
var $this = this;
},
remove: function (id) {
var $this = this;
if (!$this.pending) {
$this.pending = true;
$.ajax({
type: 'DELETE',
dataType: 'json',
url: this.urls.action1Url+ '/' + id,
}).done(function (res) {
}).fail(function (err) {
});
}
},
};
вызов
SomeModule.init()
С точки зрения структуры модуль CommonJS — это часть JavaScript-кода, которая экспортирует определенные переменные, объекты или функции, делая их доступными для любого зависимого кода.
Модули CommonJS состоят из двух частей: module.exports содержит объекты, которые модуль хочет сделать доступными, а функция require() используется для импорта других модулей.
Пример модуля в формате CommonJS:
JavaScript
// определяем функцию, которую хотим экспортировать
function foobar() {
this.foo = function() {
console.log('Hello foo');
}
this.bar = function() {
console.log('Hello bar');
}
}
// делаем ее доступной для других модулей
module.exports.foobar = foobar;
Пример кода, использующего модуль:
JavaScript
var foobar = require('./foobar').foobar,
test = new foobar();
test.bar(); // 'Hello bar'
В основе формата AMD (Asynchronous Module Definition) лежат две функции: define()для определения именованных или безымянных модулей и require() для импорта зависимостей.
Функция define() имеет следующую сигнатуру:
JavaScript
define(
module_id /*необязательный*/,
[dependencies] /*необязательный*/,
definition function /*функция для создания экземпляра модуля или объекта*/
);
Параметр module_id необязательный, он обычно требуется только при использовании не-AMD инструментов объединения. Об этом говорит сайт https://intellect.icu . Когда этот аргумент опущен, модуль называется анонимным. Параметр dependencies представляет собой массив зависимостей, которые требуются определяемому модулю, а третий аргумент (definition function) — это функция, которая выполняется для создания экземпляра модуля.
Пример модуля:
JavaScript
define('myModule',
['foo', 'bar'],
// зависимости (foo и bar) передаются в функцию
function(foo, bar) {
// создаем модуль
var myModule = {
doStuff: function() {
console.log('Hi!');
}
}
// возвращаем модуль
return myModule;
}
);
Функция require() используется для импорта модулей:
JavaScript
require(['foo', 'bar'], function(foo, bar) {
foo.doSomething();
});
Также с помощью require() можно динамически импортировать зависимости в модуль:
JavaScript
define(function(require) {
var foobar;
require(['foo', 'bar'], function (foo, bar) {
foobar = foo() + bar();
});
// возвращаем модуль
// обратите внимание на другой шаблон определения модуля
return {
foobar: foobar
};
});
Существование двух форматов модулей, несовместимых друг с другом, не способствовало развитию экосистемы JavaScript. Для решения этой проблемы был разработан формат UMD (Universal Module Definition). Этот формат позволяет использовать один и тот же модуль и с инструментами AMD, и в средах CommonJS.
Суть подхода UMD заключается в проверке поддержки того или иного формата и объявлении модуля соответствующим образом. Пример такой реализации:
JavaScript
(function(define) {
define(function() {
var bar = 'foo';
return {
foo: function() {
// ...
}
};
});
}(
typeof module === 'object' && module.exports && typeof define !== 'function' ?
function (factory) { module.exports = factory(); } :
define
));
UMD — это скорее подход, а не конкретный формат. Различных реализаций может быть множество.
В стандарте ECMAScript 2015 появились нативные модули JavaScript. На текущий момент модули ES6 поддерживаются в Safari 10.1 и за флагом в Firefox 54, Chrome 60 и Edge 15.
В основе ES6 модулей лежат ключевые слова export и import. Любая переменная, объявленная в модуле, доступна за его пределами, только если явно экспортирована из модуля.
Если модуль экспортирует только одно значение, можно использовать экспорт по умолчанию. Например, модуль экспортирует функцию:
JavaScript
export default function () { ··· }
Или класс:
JavaScript
export default class { ··· }
Или даже выражение:
JavaScript
export default 5 * 7;
Один модуль может экспортировать несколько значений:
JavaScript
export const pi = Math.PI;
export function sum(x, y) {
return x + y;
}
export function multiply(x, y) {
return x * y;
}
Можно перечислить все, что вы хотите экспортировать, в конце модуля:
JavaScript
export const pi = Math.PI;
export function sum(x, y) {
return x + y;
}
export { pi, sum };
И переименовать:
JavaScript
export { pi as PI, sum };
Импортировать модули также можно несколькими способами:
JavaScript
// Импорт значения по умолчанию
import localName from 'utils';
// Импорт отдельных функций
import { sum, multiply } from 'utils';
sum(4, 3);
// Импорт всего модуля
import * as utils from 'utils';
utils.sum(4, 3);
// Можно переименовать импортируемое значение
import { pi as PI, sum } from 'utils';
// Или не импортировать ничего
// (в этом случае выполнится код инициализации модуля,
// но ничего не будет импортировано)
import 'utils';
Ключевые слова import и export могут использоваться только на верхнем уровне, их нельзя использовать в функции или в блоке:
JavaScript
if (Math.random()) {
import 'foo'; // SyntaxError
}
Импорт из модуля поднимается в начало области видимости:
JavaScript
foo();
import { foo } from 'test_module';
Модули ES6 выполняются отложено, только когда документ полностью проанализирован.
Код модуля выполняется в строгом режиме.
AMD и CommonJS — это форматы модулей, а не реализации. Для поддержки AMD, например, необходима реализация функций define() и require(), для поддержки CommonJS — реализация module.exports и require().
Для поддержки модулей во время выполнения используются загрузчики модулей. Существует несколько различных загрузчиков, они имеют похожий принцип работы:
Популярные загрузчики модулей:
В отличие от загрузчиков модулей, которые работают в браузере и загружают зависимости «на лету», сборщики модулей позволяют заранее подготовить один файл со всеми зависимостями (бандл).
Существует ряд инструментов, позволяющих заранее собирать модули в один файл:
Чтобы лучше ориентироваться в современных инструментах фронтенд-разработки, необходимо понимать такие концепции как модули, форматы модулей, загрузчики модулей и сборщики.
Итак:
Модуль — это многократно используемая часть кода, инкапсулирующая детали реализации и предоставляющая открытый API.
Формат модуля — это синтаксис определения и подключения модуля.
Загрузчик модулей загружает модуль определенного формата во время выполнения непосредственно в браузере. Популярные загрузчики — RequireJS и SystemJS.
Сборщик модулей заранее объединяет модули в один файл, который подключается на странице. Примеры сборщиков — Webpack и Browserify.
Анализ данных, представленных в статье про модули в javascript шаблон модуль и его форматов, подтверждает эффективность применения современных технологий для обеспечения инновационного развития и улучшения качества жизни в различных сферах. Надеюсь, что теперь ты понял что такое модули в javascript шаблон модуль и его форматов, commonjs amd umd и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)
Комментарии