SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Монолитный спагетти-код
• script.js, содержащий код всего сайта
• множество глобальных объектов, нет инкапсуляции,
конфликты
• функциональность разбросана внутри script.js и
inline-скриптов
• местами inline-код
Нет разделения сложной задачи на более простые — любая
задача будет сложной. Нужна модульность.
2 / 28
JavaScript модуль
(function () {
var privVar
function privFunc() {
}
return {
pubFunc: function () {
}
}
})()
• реализация скрыта
• нет глобальных
переменных
• простой внешний фасад
для сложной внутренней
реализации
• отдельная единица
загрузки
3 / 28
Использование модулей
• модули зависят от других модулей
• модули нужно загружать
• и только когда это необходимо
Нужно стандартное решение:
• обеспечивающее загрузку по требованию
• гарантирующую подгрузку зависимостей
• делающее это эффективно
4 / 28
AMD
Asynchronous Module Definition
https://github.com/amdjs/amdjs-api/wiki/AMD
Стандартный способ определения модуля с учетом
зависимостей и возможностью асинхронной загрузки.
define(id?, dependencies?, factory);
5 / 28
AMD: id
define(id?, dependencies?, factory);
• строковый идентификатор — имя модуля
• необязателен, если не указан — идентификатор, который
был использован для загрузки файла
• всегда абсолютный, относительные имена не допускаются
6 / 28
AMD: dependencies
define(id?, dependencies?, factory);
• массив идентификаторов зависимостей
• зависимости разрешаются перед запуском factory
• экземпляры зависимостей передаются в factory в
соответствующих по порядку аргументах
• относительные идентификаторы — относительно
загружаемого модуля
• по умолчанию [’require’, ’exports’, ’module’]
7 / 28
AMD: factory
define(id?, dependencies?, factory);
• фабричная функция или объект
• функция выполняется только один раз
• возвращаемое значение функции — экспортируемое
значение модуля
• объект непосредственно присваивается экспортируемому
значению
8 / 28
AMD: factory
Специальные зависимости:
require функция получения объекта загруженного модуля
exports список экспортируемых значений
define(
’alpha’,
[’require’, ’exports’, ’beta’],
function(require, exports) {
exports.verb = function () {
return require(’beta’).something();
}
});
9 / 28
Require.js
http://requirejs.org
• одна из реализаций AMD (самая популярная)
• базовый стандарт + различные дополнения
• возможность статического анализа кода и последующая
оптимизация за счет сборки и компрессии модулей
10 / 28
Базовый API
Определение
define([
’dep1’, ’dep2’
], function(dep1, dep2) {
...
});
define({
color: "black",
size: "unisize"
});
Загрузка
require([
’dep1’, ’dep2’
], function(dep1, dep2) {
...
});
Конфигурирование
requirejs.config({
baseUrl: ’/another/path’,
...
});
11 / 28
Модули в Require.js
• один файл — один модуль
• объединение в один файл только оптимизатором
• не надо указывать имен — этим занимается оптимизатор
• модуль require — различные полезные утилиты
• относительные пути — с помощью модуля require:
define(function(require) {
var mod = require("./relative/name");
});
define(["require"], function(require) {
var cssUrl = require.toUrl("./style.css");
});
12 / 28
Бонус — JSONP
require(
["http://site.com/api/data.json?callback=define"],
function (data) {
//The data object will be the API response
// for the JSONP data call.
console.log(data);
}
);
Предназначено для использования при начальной
инициализации приложения.
13 / 28
Конфигурирование
requirejs.config(options)
basePath основной путь к загружаемым модулям
paths отдельные пути к различным префиксам
shim внешние определения для не модульных скриптов
map псевдонимы для модулей
config параметры конфигурации модулей
callback пользовательский обрабочик события загрузки
urlArgs дополнительные параметры для запроса
...
14 / 28
Структура модулей приложения
www/
js/
app/ код приложения
lib/ библиотечные модули
lib1.js
lib2.js
common.js код, общий для всех страниц
page1.js код для отдельной страницы
page2.js
lib/ внешние библиотеки
config.js конфигурация require.js
Приложение отдельно, библиотеки отдельно, постраничное
разбиение — если необходимо.
15 / 28
Структура модулей библиотек
www/js/lib/ внешние библиотеки
jquery/
fancybox.js плагины jQuery
easing.js
jquery-ui/
timepicker-addon.js плагины jquery-ui
jquery.js jQuery
jquery-ui.js jQuery UI
require.js Require.js
Используем единую схему именования файлов плагинов для
получения простых имен соответствующих модулей
16 / 28
Базовая конфигурация
config.js
require.config({
baseUrl: "/js/lib",
paths: {
"app": "/js/app"
}
});
common.js
define([
’jquery’,
’app/lib/ui’
], function($, ui) {
...
});
17 / 28
Загрузка модулей
Сначала загрузчик, потом конфиг, все остальное только после
конфига, чтобы проинициализировались пути.
<script src="js/lib/require.js"></script>
<script>
require([’js/config’], function(config) {
require([’app/common’, ’app/page1’]);
});
</script>
Сокращенная форма для одностраничных приложений:
<script src="js/lib/require.js" data-main="js/main.js">
18 / 28
Адаптация существующего кода
Проблемы:
• всегда глобальная область видимости
• вызов глобальных функций непосредственно из
HTML-кода
• inline код в HTML
• jQuery-плагины — не AMD модули
19 / 28
Что делать: модули
• группируем код по функциональности
• разбиваем на функции
• функции используются другими модулями —
библиотечный модуль, возвращает объект
• нужна только настройка DOM — просто выполняем
функцию
• все переменные и функции определяем внутри модуля,
снаружи они недоступны
20 / 28
Модуль-функция
define([
’jquery’,
’app/lib/ui’
], function ($, ui) {
$(function () {
setup();
$(window).resize(resize);
});
function setup() {
ui.slider(’#slider’);
}
function resize() {...}
});
21 / 28
Модуль-библиотека
define([
’jquery’,
], function($) {
var privateVar;
return {
slider: function (id) {
...
}
}
function privateFunc() { ... }
});
22 / 28
Что делать: глобальные объекты
В идеале — не использовать, не получается — использование и
явный экспорт с помощью window.
function () {
window.checkForm = validate;
function validate(form) {
var mode = window.globalMode
...
}
}
Используем window, легче отследить и потом избавиться.
23 / 28
Что делать: inline-код в HTML
• <script> — выносим в страничные модули
• onclick ... — обычной привязкой событий
• компромиссный вариант — группировать весь inline-код
require([’js/config’], function(config) {
require([
’jquery’, ’app/common’, ’app/page1’
], function ($) {
// тут весь inline-код.
}
});
24 / 28
Что делать: jQuery-плагины
• jQuery плагины должны быть AMD-модулями для
асинхронной загрузки
• не забываем про зависимости
(function (root) {
var amdExports;
define([’jquery’], function (jQuery) {
...
}.call(root));
return amdExports;
}); }(this));
Преобразование вручную или программой, например, volo.
25 / 28
Внешние библиотеки — если
ничего не помогает
shim config
requirejs.config({
shim: {
’module’: {
deps: [’underscore’, ’jquery’],
exports: ’Module’
});
26 / 28
AMD/Require — архитектурные
преимущества
• минимальный API
• отсутствие жесткой структуры
• отсутствие глобального объекта приложения
• соответствие базовым паттернам JavaScript
• легко сконвертировать существующий код
27 / 28
Что читать
• https://github.com/amdjs/amdjs-api/wiki/AMD —
стандарт AMD
• http://requirejs.org — документация по Require.js
• https://github.com/requirejs/example-multipage —
пример для мультистраничных сайтов
• http://addyosmani.com/writing-modular-js/ — Writing
modular JavaScript with AMD, CommonJS and ES Harmony.
28 / 28

Más contenido relacionado

La actualidad más candente

Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейKonstantin Komelin
 
Rambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRAMBLER&Co
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
 
Webpack integration
Webpack integrationWebpack integration
Webpack integrationIllia Zub
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Ontico
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьCodeFest
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSГлеб Тарасов
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливееYaroslav Serhieiev
 
Разработка и deploy Drupal сайтов с помощью Features.
Разработка и deploy Drupal сайтов с помощью Features.Разработка и deploy Drupal сайтов с помощью Features.
Разработка и deploy Drupal сайтов с помощью Features.Eugene Fidelin
 
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10OdessaFrontend
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...Yauheni Akhotnikau
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)Ontico
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеYandex
 
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Ontico
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Ontico
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Ontico
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»Roman Dvornov
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтовmetaform
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворкиRoman Brovko
 

La actualidad más candente (20)

Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людей
 
Rambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPER
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Webpack integration
Webpack integrationWebpack integration
Webpack integration
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливее
 
Разработка и deploy Drupal сайтов с помощью Features.
Разработка и deploy Drupal сайтов с помощью Features.Разработка и deploy Drupal сайтов с помощью Features.
Разработка и deploy Drupal сайтов с помощью Features.
 
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
All you need is Vue, Nuxt is all you need | Odessa Frontend Meetup #10
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
 
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)
 
Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтов
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 

Similar a RequireJS і Magento 2

Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Mikhail Davydov
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукАсинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукYandex
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкRoman Dvornov
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?buranLcme
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
Drupal и возможности его применения
Drupal и возможности его примененияDrupal и возможности его применения
Drupal и возможности его примененияMedia Gorod
 
Creating custom module
Creating custom moduleCreating custom module
Creating custom moduleyulia_tsyba
 

Similar a RequireJS і Magento 2 (20)

Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
Yulia tsuba
Yulia tsubaYulia tsuba
Yulia tsuba
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
The render api
The render apiThe render api
The render api
 
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр ЗинчукАсинхронная модульность в API Яндекс.Карт — Александр Зинчук
Асинхронная модульность в API Яндекс.Карт — Александр Зинчук
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Drupal и возможности его применения
Drupal и возможности его примененияDrupal и возможности его применения
Drupal и возможности его применения
 
Creating custom module
Creating custom moduleCreating custom module
Creating custom module
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 

Más de Elogic Magento Development

Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2Elogic Magento Development
 
CQRS and Event-Sourcing in Magento2 by examples of MSI
CQRS and Event-Sourcing in Magento2 by examples of MSICQRS and Event-Sourcing in Magento2 by examples of MSI
CQRS and Event-Sourcing in Magento2 by examples of MSIElogic Magento Development
 
Chernivtsi Magento Meetup&Contribution day. Naida V.
Chernivtsi Magento Meetup&Contribution day. Naida V.Chernivtsi Magento Meetup&Contribution day. Naida V.
Chernivtsi Magento Meetup&Contribution day. Naida V.Elogic Magento Development
 
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
Chernivtsi Magento Meetup&Contribution day. Miniailo.I. Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
Chernivtsi Magento Meetup&Contribution day. Miniailo.I. Elogic Magento Development
 
Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
 Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
Chernivtsi Magento Meetup&Contribution day. V. KublytskyiElogic Magento Development
 
12 Ways to Improve Magento 2 Security and Performance
12 Ways to Improve Magento 2 Security and Performance12 Ways to Improve Magento 2 Security and Performance
12 Ways to Improve Magento 2 Security and PerformanceElogic Magento Development
 
Как благодаря композеру использовать сторонние компоненты в Magento 2
Как благодаря композеру использовать сторонние компоненты в Magento 2Как благодаря композеру использовать сторонние компоненты в Magento 2
Как благодаря композеру использовать сторонние компоненты в Magento 2Elogic Magento Development
 
Як перехід на Magento допоміг нам стати лідером
Як перехід на Magento допоміг нам стати лідеромЯк перехід на Magento допоміг нам стати лідером
Як перехід на Magento допоміг нам стати лідеромElogic Magento Development
 
Как переписать модуль с Magento 1 на Magento 2
Как переписать модуль с Magento 1 на Magento 2Как переписать модуль с Magento 1 на Magento 2
Как переписать модуль с Magento 1 на Magento 2Elogic Magento Development
 

Más de Elogic Magento Development (16)

Magento Technical guidelines
Magento Technical guidelinesMagento Technical guidelines
Magento Technical guidelines
 
Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2Миграция кода с Magento 1 на Magento 2
Миграция кода с Magento 1 на Magento 2
 
Introduction to Magento Community
Introduction to Magento Community Introduction to Magento Community
Introduction to Magento Community
 
CQRS and Event-Sourcing in Magento2 by examples of MSI
CQRS and Event-Sourcing in Magento2 by examples of MSICQRS and Event-Sourcing in Magento2 by examples of MSI
CQRS and Event-Sourcing in Magento2 by examples of MSI
 
Chernivtsi Magento Meetup&Contribution day. Naida V.
Chernivtsi Magento Meetup&Contribution day. Naida V.Chernivtsi Magento Meetup&Contribution day. Naida V.
Chernivtsi Magento Meetup&Contribution day. Naida V.
 
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
Chernivtsi Magento Meetup&Contribution day. Miniailo.I. Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
 
Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
 Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
 
The process of a Lean Magento development
The process of a Lean Magento developmentThe process of a Lean Magento development
The process of a Lean Magento development
 
12 Ways to Improve Magento 2 Security and Performance
12 Ways to Improve Magento 2 Security and Performance12 Ways to Improve Magento 2 Security and Performance
12 Ways to Improve Magento 2 Security and Performance
 
MMnl Pavlo Okhrem
MMnl Pavlo Okhrem MMnl Pavlo Okhrem
MMnl Pavlo Okhrem
 
LIOF 2016
LIOF 2016LIOF 2016
LIOF 2016
 
Payment integration patterns в Magento2
Payment integration patterns в Magento2Payment integration patterns в Magento2
Payment integration patterns в Magento2
 
Как благодаря композеру использовать сторонние компоненты в Magento 2
Как благодаря композеру использовать сторонние компоненты в Magento 2Как благодаря композеру использовать сторонние компоненты в Magento 2
Как благодаря композеру использовать сторонние компоненты в Magento 2
 
Magento 2 - the future of eCommerce
Magento 2 - the future of eCommerceMagento 2 - the future of eCommerce
Magento 2 - the future of eCommerce
 
Як перехід на Magento допоміг нам стати лідером
Як перехід на Magento допоміг нам стати лідеромЯк перехід на Magento допоміг нам стати лідером
Як перехід на Magento допоміг нам стати лідером
 
Как переписать модуль с Magento 1 на Magento 2
Как переписать модуль с Magento 1 на Magento 2Как переписать модуль с Magento 1 на Magento 2
Как переписать модуль с Magento 1 на Magento 2
 

RequireJS і Magento 2

  • 1. Монолитный спагетти-код • script.js, содержащий код всего сайта • множество глобальных объектов, нет инкапсуляции, конфликты • функциональность разбросана внутри script.js и inline-скриптов • местами inline-код Нет разделения сложной задачи на более простые — любая задача будет сложной. Нужна модульность. 2 / 28
  • 2. JavaScript модуль (function () { var privVar function privFunc() { } return { pubFunc: function () { } } })() • реализация скрыта • нет глобальных переменных • простой внешний фасад для сложной внутренней реализации • отдельная единица загрузки 3 / 28
  • 3. Использование модулей • модули зависят от других модулей • модули нужно загружать • и только когда это необходимо Нужно стандартное решение: • обеспечивающее загрузку по требованию • гарантирующую подгрузку зависимостей • делающее это эффективно 4 / 28
  • 4. AMD Asynchronous Module Definition https://github.com/amdjs/amdjs-api/wiki/AMD Стандартный способ определения модуля с учетом зависимостей и возможностью асинхронной загрузки. define(id?, dependencies?, factory); 5 / 28
  • 5. AMD: id define(id?, dependencies?, factory); • строковый идентификатор — имя модуля • необязателен, если не указан — идентификатор, который был использован для загрузки файла • всегда абсолютный, относительные имена не допускаются 6 / 28
  • 6. AMD: dependencies define(id?, dependencies?, factory); • массив идентификаторов зависимостей • зависимости разрешаются перед запуском factory • экземпляры зависимостей передаются в factory в соответствующих по порядку аргументах • относительные идентификаторы — относительно загружаемого модуля • по умолчанию [’require’, ’exports’, ’module’] 7 / 28
  • 7. AMD: factory define(id?, dependencies?, factory); • фабричная функция или объект • функция выполняется только один раз • возвращаемое значение функции — экспортируемое значение модуля • объект непосредственно присваивается экспортируемому значению 8 / 28
  • 8. AMD: factory Специальные зависимости: require функция получения объекта загруженного модуля exports список экспортируемых значений define( ’alpha’, [’require’, ’exports’, ’beta’], function(require, exports) { exports.verb = function () { return require(’beta’).something(); } }); 9 / 28
  • 9. Require.js http://requirejs.org • одна из реализаций AMD (самая популярная) • базовый стандарт + различные дополнения • возможность статического анализа кода и последующая оптимизация за счет сборки и компрессии модулей 10 / 28
  • 10. Базовый API Определение define([ ’dep1’, ’dep2’ ], function(dep1, dep2) { ... }); define({ color: "black", size: "unisize" }); Загрузка require([ ’dep1’, ’dep2’ ], function(dep1, dep2) { ... }); Конфигурирование requirejs.config({ baseUrl: ’/another/path’, ... }); 11 / 28
  • 11. Модули в Require.js • один файл — один модуль • объединение в один файл только оптимизатором • не надо указывать имен — этим занимается оптимизатор • модуль require — различные полезные утилиты • относительные пути — с помощью модуля require: define(function(require) { var mod = require("./relative/name"); }); define(["require"], function(require) { var cssUrl = require.toUrl("./style.css"); }); 12 / 28
  • 12. Бонус — JSONP require( ["http://site.com/api/data.json?callback=define"], function (data) { //The data object will be the API response // for the JSONP data call. console.log(data); } ); Предназначено для использования при начальной инициализации приложения. 13 / 28
  • 13. Конфигурирование requirejs.config(options) basePath основной путь к загружаемым модулям paths отдельные пути к различным префиксам shim внешние определения для не модульных скриптов map псевдонимы для модулей config параметры конфигурации модулей callback пользовательский обрабочик события загрузки urlArgs дополнительные параметры для запроса ... 14 / 28
  • 14. Структура модулей приложения www/ js/ app/ код приложения lib/ библиотечные модули lib1.js lib2.js common.js код, общий для всех страниц page1.js код для отдельной страницы page2.js lib/ внешние библиотеки config.js конфигурация require.js Приложение отдельно, библиотеки отдельно, постраничное разбиение — если необходимо. 15 / 28
  • 15. Структура модулей библиотек www/js/lib/ внешние библиотеки jquery/ fancybox.js плагины jQuery easing.js jquery-ui/ timepicker-addon.js плагины jquery-ui jquery.js jQuery jquery-ui.js jQuery UI require.js Require.js Используем единую схему именования файлов плагинов для получения простых имен соответствующих модулей 16 / 28
  • 16. Базовая конфигурация config.js require.config({ baseUrl: "/js/lib", paths: { "app": "/js/app" } }); common.js define([ ’jquery’, ’app/lib/ui’ ], function($, ui) { ... }); 17 / 28
  • 17. Загрузка модулей Сначала загрузчик, потом конфиг, все остальное только после конфига, чтобы проинициализировались пути. <script src="js/lib/require.js"></script> <script> require([’js/config’], function(config) { require([’app/common’, ’app/page1’]); }); </script> Сокращенная форма для одностраничных приложений: <script src="js/lib/require.js" data-main="js/main.js"> 18 / 28
  • 18. Адаптация существующего кода Проблемы: • всегда глобальная область видимости • вызов глобальных функций непосредственно из HTML-кода • inline код в HTML • jQuery-плагины — не AMD модули 19 / 28
  • 19. Что делать: модули • группируем код по функциональности • разбиваем на функции • функции используются другими модулями — библиотечный модуль, возвращает объект • нужна только настройка DOM — просто выполняем функцию • все переменные и функции определяем внутри модуля, снаружи они недоступны 20 / 28
  • 20. Модуль-функция define([ ’jquery’, ’app/lib/ui’ ], function ($, ui) { $(function () { setup(); $(window).resize(resize); }); function setup() { ui.slider(’#slider’); } function resize() {...} }); 21 / 28
  • 21. Модуль-библиотека define([ ’jquery’, ], function($) { var privateVar; return { slider: function (id) { ... } } function privateFunc() { ... } }); 22 / 28
  • 22. Что делать: глобальные объекты В идеале — не использовать, не получается — использование и явный экспорт с помощью window. function () { window.checkForm = validate; function validate(form) { var mode = window.globalMode ... } } Используем window, легче отследить и потом избавиться. 23 / 28
  • 23. Что делать: inline-код в HTML • <script> — выносим в страничные модули • onclick ... — обычной привязкой событий • компромиссный вариант — группировать весь inline-код require([’js/config’], function(config) { require([ ’jquery’, ’app/common’, ’app/page1’ ], function ($) { // тут весь inline-код. } }); 24 / 28
  • 24. Что делать: jQuery-плагины • jQuery плагины должны быть AMD-модулями для асинхронной загрузки • не забываем про зависимости (function (root) { var amdExports; define([’jquery’], function (jQuery) { ... }.call(root)); return amdExports; }); }(this)); Преобразование вручную или программой, например, volo. 25 / 28
  • 25. Внешние библиотеки — если ничего не помогает shim config requirejs.config({ shim: { ’module’: { deps: [’underscore’, ’jquery’], exports: ’Module’ }); 26 / 28
  • 26. AMD/Require — архитектурные преимущества • минимальный API • отсутствие жесткой структуры • отсутствие глобального объекта приложения • соответствие базовым паттернам JavaScript • легко сконвертировать существующий код 27 / 28
  • 27. Что читать • https://github.com/amdjs/amdjs-api/wiki/AMD — стандарт AMD • http://requirejs.org — документация по Require.js • https://github.com/requirejs/example-multipage — пример для мультистраничных сайтов • http://addyosmani.com/writing-modular-js/ — Writing modular JavaScript with AMD, CommonJS and ES Harmony. 28 / 28