62
Tim Nizametdinov Eugeny Uspenskiy Last Update: Monday, June 6, 2022 APS JS SDK

Построение собственного JS SDK — зачем и как?

Embed Size (px)

DESCRIPTION

Многие разработчики любят делать свои велосипеды, но не все задумываются зачем. Мы расскажем о том, зачем вам может понадобится собственный JavaScript SDK и полезно ли кататься на велосипедах. Мы делали собственный JS SDK для того, чтобы дать возможность создания плагинов в рамках большой enterprise системы - Parallels Automation и Plesk Panel. Сам SDK является частью общего стандарта APS, который является шиной, объединяющей все наши продукты по автоматизации. Обе панели брендируются и мы должны были сохранить брендинг при уже существующей кодовой базе верстки и существующих правилах оформления. И главное - надо было дать возможность создания UI сторонним девелоперам, которые могут иметь абсолютно разный уровень - от пришедших бекэндеров до профессиональных js-разработчиков.

Citation preview

Page 1: Построение собственного JS SDK — зачем и как?

Tim NizametdinovEugeny Uspenskiy

Last Update: April 8, 2023

APS JS SDK

Page 2: Построение собственного JS SDK — зачем и как?

Зачем

Page 3: Построение собственного JS SDK — зачем и как?

3

Содержание

• Зачем• что такое OSS• что такое APS• APS 1.x• APS 2.0• ограничения• собственный JS SDK

• Как• Итоги

Page 4: Построение собственного JS SDK — зачем и как?

4

Зачем

• Создание плагинов для большой enterprise системы - Parallels Automation (OSS) и Plesk

• обеспечение брендинга в условиях существующего codebase верстки и общего style guide

• возможность унифицированного создания UI сторонними разработчиками

Page 5: Построение собственного JS SDK — зачем и как?

5

Что такое OSS

• OSS - системы эксплуатационной поддержки - управление сетевой инфрастуктурой, учет, выделение ресурсов

• предоставление сервисов в рамках этой инфрастуктуры

Page 6: Построение собственного JS SDK — зачем и как?

6

Что такое APS

• Стандарт, позволяющий относительно быстро проинтегрировать приложения и сервисы в экосистему на базе Parallels Automation (создать плагины)

\

Page 7: Построение собственного JS SDK — зачем и как?

7

APS 1.x

• Декларативное описание как модели, так и UI• Весь UI основан на декларируемых свойствах бизнес-

модели• Бизнес-модель -> UI, а не наоборот• -> Крайне убогий UI, нечитаемое декларативное мета-

описание

Page 8: Построение собственного JS SDK — зачем и как?

8

APS 2.x

• Модель объявляется отдельно, доступна по REST• UI абсолютно независим• Декларативная навигация• Screen - обычный html• -> UI -> бизнес-модель

Page 9: Построение собственного JS SDK — зачем и как?

9

Ограничения

• Панели брендируются - унаследованный лэйаут, который может меняться

• Девелоперы скринов - от бэкендеров до js-профи• Не опенсорс продукт - лицензионные ограничения

Page 10: Построение собственного JS SDK — зачем и как?

10

Собственный JS SDK

• Использование html маркапа минимально и отражает семантику

• Возможность использования унаследованного маркапа• Hаличие документации

Page 11: Построение собственного JS SDK — зачем и как?

Как

Page 12: Построение собственного JS SDK — зачем и как?

12

Содержание

• Зачем• Как

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

• Итоги

Page 13: Построение собственного JS SDK — зачем и как?

13

Использование существующих фреймворков

• Полностью свой фреймворк - слишком дорого

• Требования к фреймворку:• поддержка шаблонов• высокая гибкость• распространенность• кастомизируемость оформления• целостность• красивые и динамические элементы

Page 14: Построение собственного JS SDK — зачем и как?

14

Использование существующих фреймворков - выбор

• ExtJS (Sencha JS)

• JQueryUI

• loader (RequireJS/CommonJS/...) + MV* Framework (KnockoutJS/AngularJS/…)

• Dojo Toolkit

Page 15: Построение собственного JS SDK — зачем и как?

15

ExtJS (Sencha JS)

+• богатые виджеты (Grids, Charts etc.)• удобная модель связывания данных• система сборки• активное развитие• распространенность• поддержка шаблонов

Page 16: Построение собственного JS SDK — зачем и как?

16

ExtJS (Sencha JS)

-• сложная кастомизация виджетов• большие лицензионные отчисления

Page 17: Построение собственного JS SDK — зачем и как?

17

JQuery UI

+• готовые популярные виджеты• очень большая распространенность• низкий порог вхождения• легкость кастомизации оформления• отсутствие лицензионных отчислений

Page 18: Построение собственного JS SDK — зачем и как?

18

JQuery UI

-• отсутствие поддержки шаблонов в виджетах• отсутствие связывания данных• отсутствие четкой абстракции слоев• на момент исследования не стабилен

Page 19: Построение собственного JS SDK — зачем и как?

19

Loader + MV* Framework

+• свобода выбора• теоретический легкий переход на ES6 Modules

Page 20: Построение собственного JS SDK — зачем и как?

20

Loader + MV* Framework

-• отсутствие целостности• необходимость писать модули с нуля• отсутствие поддержки шаблонов внутри виджетов

Page 21: Построение собственного JS SDK — зачем и как?

21

Dojo Toolkit

+• модульная структура на базе AMD• богатые легко кастомизируемые виджеты• многолетняя поддержка Deferred и Promise• отсутствие лицензионных отчислений• поддержка связывания данных• поддержка шаблонов виджета• система сборки

Page 22: Построение собственного JS SDK — зачем и как?

22

Dojo Toolkit

-• слабая распространенность• высокий порог вхождения• навязывание своей философии• зачаточная поддержка мобильных девайсов

Page 23: Построение собственного JS SDK — зачем и как?

23

Содержание

• Зачем• Как

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

• Итоги

Page 24: Построение собственного JS SDK — зачем и как?

24

APS JS SDK

• модульная структура на базе AMD

• модули, имеющие визуальное представление - виджеты

• модули для работы с данными: Model и Store

Page 25: Построение собственного JS SDK — зачем и как?

25

Модульная структура AMD

• Позволяет подключать любые сторонние библиотеки запакованные в формате AMD:

• JQuery• AngularJS• KnockoutJS• и многие другие

Page 26: Построение собственного JS SDK — зачем и как?

26

Widgets

• верстка виджета задается его HTML-шаблоном

• виджеты могут включать друг друга

• виджеты могут динамически изменяться

• существует три способа объявления виджетов

Page 27: Построение собственного JS SDK — зачем и как?

30

Включение виджетов друг в друга

• на уровне шаблона

• в отношениях родитель-ребенок

Page 28: Построение собственного JS SDK — зачем и как?

31

Декларативное объявление виджетовrequire(["dojo/parser", "aps/ready!"], function(parser){ parser.parse(); });

<fieldset data-dojo-type=”aps/FieldSet” title=“I am aps/FieldSet”> <input type=”checkbox” data-dojo-type="aps/CheckBox" data-dojo-props="label: 'CheckBox',description: 'I am aps/CheckBox'" >

</fieldset>

Page 29: Построение собственного JS SDK — зачем и как?

32

Программное объявление виджетовrequire(["aps/FieldSet", "aps/CheckBox", "aps/ready!" ], function (FieldSet, CheckBox) { var fs = new FieldSet({ title : “I am aps / FieldSet” }, "idDiv"); fs.addChild(new CheckBox({ label : “CheckBox”, description : “I am aps / CheckBox” });      fs.startup(); });

Page 30: Построение собственного JS SDK — зачем и как?

33

Объявление виджетов с помощью загрузчикаrequire(["aps/load", "aps/ready!" ], function (load) { load(["aps/FieldSet", { title : "I am aps / FieldSet" }, [["aps / CheckBox", { label : "CheckBox", description : "I am aps / CheckBox" } ]] ]);});

Page 31: Построение собственного JS SDK — зачем и как?

34

Связывание данных: Store

• Store служит для связи с локальным (aps/Memory) или удаленным (aps/Store) хранилищем данных.require(["aps/Store", "aps/Grid", "aps/ready!" ], function (load) { var store = new Store({ target : "http://localhost/resources" });  var grid = new Grid({ columns : layoutSimpleGrid, store : store }, "gridDiv");});

 

Page 32: Построение собственного JS SDK — зачем и как?

35

Связывание данных: Model

• Model - служит для связи виджетов с данными.

require(["aps/TextBox", "dojox/mvc/getStateful", "dojox/mvc/at", "aps/ready!" ], function (TextBox, getStateful, at) { model = getStateful({val : "Hello, world!"});  new TextBox({value : at("model", "val")}, divTB").startup();  setTimeout(function () { model.set("val", "?!!"); model.watch("val", function (prop, oldVal, newVal) { alert(newVal); }); }, 1000);});

 

Page 33: Построение собственного JS SDK — зачем и как?

36

Продуманный API

• В основе - API устоявшегося и популярного фреймворка.

• Единые для всех модулей правила именования свойств и методов.

• Единые для всех модулей способы взаимодействия между собой и внешним миром.

Page 34: Построение собственного JS SDK — зачем и как?

37

Единые способы взаимодействия между собой

• Связывание данных и виджетов через модули Model и Store

• Слежения за состоянием виджета с помощью метода watch.Нет генерации событий

• Вся работа со свойствами выполняется только через методы get и set

Page 35: Построение собственного JS SDK — зачем и как?

38

Единые правила именования

• Имена приватных/защищенных свойств и методов начинаются с ‘_’.

• Классы - CamelCase, методы, функции, свойства, модули - mixedCase

Page 36: Построение собственного JS SDK — зачем и как?

39

Пример

var grid = new Grid({ //Грид с возможностью выбора строк columns : layoutSimpleGrid, selectionMode : "single", store : store }); 

grid.get("selectionArray") //Отследим события выбора строк.watchElements(function (index, removals, adds) { alert(adds);});

//выделим строку программноgrid.get("selectionArray").push("ea7865aa");

Page 37: Построение собственного JS SDK — зачем и как?

40

Содержание

• Зачем• Как

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

• Итоги

Page 38: Построение собственного JS SDK — зачем и как?

41

Билд-система

Build server

Maven3 (infrastructure)

DOJO Build (closure & layering)

Node.js (tests runner)

assembled .zip(+standalone .zip)

Jenkins (scheduler)

Nexus(artifact manager)

Page 39: Построение собственного JS SDK — зачем и как?

42

Автоматизированные тесты (1/2)

• Можно запустить без инфрастуктуры • Строго отдельный тест для каждого компонента• Тесты в директории самого фреймворка

• для ручного и автоматизированного тестирования• являются одновременно примерами

• Строгие соглашения об именовании• директория начинается с test - юнит тест• все остальное - ручное тестирование

Page 40: Построение собственного JS SDK — зачем и как?

43

Автоматизированные тесты (2/2)

• Юнит тесты запускаются ВСЕГДА при сборке• Сборка отменяется если хотя бы один тест хотя бы на

одном браузере не проходит

Page 41: Построение собственного JS SDK — зачем и как?

44

Автоматизированные тесты - выбор

• QUnit• PhantomJS + IE в виртуалках

• Почему не • TestSwarm• Buster.js• Dojoh Robot• External Farms (browsershots, browserling,etc)• Selenium

Page 42: Построение собственного JS SDK — зачем и как?

45

QUnit

• распространенный• удобный• простой

Page 43: Построение собственного JS SDK — зачем и как?

46

Почему не

• TestSwarm• сильная завязка на инфрастуктуру

o нам было необходимо встроить ее в наш билдпроцесс и в нашу экосистему

o билд помечается ПОСЛЕ сборки, а не во время• слабая возможность кастомизации

o пришлось бы копировать кодo кастомизация репортинга

Page 44: Построение собственного JS SDK — зачем и как?

47

Почему не

• Buster.js• ориентирован на node.js standalone модули, не на тест виджетов• инициировать тесты из браузера надо вручную

o нам нужен автоматический запуск/закрытие браузера

Page 45: Построение собственного JS SDK — зачем и как?

48

Почему не

• dojoh robot• куча ненужных фреймов• инициировать тесты из браузера надо вручную

o нам нужен автоматический запуск/закрытие браузера

Page 46: Построение собственного JS SDK — зачем и как?

49

Почему не

• External Farms (browsershots, browserling,etc)• дорого• проблемы безопасности (VPN access в интранет)• риск завязки сборки на внешние системы

Page 47: Построение собственного JS SDK — зачем и как?

50

Почему не

• Selenium• громоздок• невозможность запуска тестов без инфрастуктуры

Page 48: Построение собственного JS SDK — зачем и как?

51

В итоге

• Гибрид Selenium Server, WebDriver, node.js runner• Создана тестовая страница, запускающая ВСЕ юнит

тесты• Сборщик через node.js selenium wd client запускает

браузеры и тестовую страницу в разных браузерах• Страница создает json-результаты, которые

доставляются сборщику

Page 49: Построение собственного JS SDK — зачем и как?

52

Компоненты тестовой инфрастуктуры

WinXP (IE8)

Win7 (IE9)

Build server

phantomjsS

S

Win8 (IE10) S

WD

Mac 10.8 (Safari)

S

Sselenium server

node.js wd selenium client

WD

Page 50: Построение собственного JS SDK — зачем и как?

53

Содержание

• Зачем• Как

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

• Итоги

Page 51: Построение собственного JS SDK — зачем и как?

54

Удобная документация

• API Documentation• содержит краткое описание всех доступных модулей и их

интерфейсов.

• Reference Guide• содержит расширенное, по сравнению с API, описание модулей

APS SDK и их основных свойств и методов.

Page 52: Построение собственного JS SDK — зачем и как?

55

Большое количество примеров

• Каждая статья содержит примеры.

• Примеры использования и создания модуля даны для всех трех способов объявления.

• Страница каждого виджета содержит ссылку на страницу с автотестами.

Page 53: Построение собственного JS SDK — зачем и как?

56

Содержание

• Зачем• Как

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

• Итоги

Page 54: Построение собственного JS SDK — зачем и как?

57

Песочница

• возможность легко попробовать самому

• быстрое открытие примеров

• возможность сохранения

• удобство использования

Page 55: Построение собственного JS SDK — зачем и как?

58

Технологии песочницы

• Источник вдохновения: jsfiddle.net

• Базис: Code Mirror + addons

• Autocomplete: Tern

Page 56: Построение собственного JS SDK — зачем и как?

59

Словарь автокомплита

"MessageList":{ "!type":"fn(options: object)->!custom:MessageList_ctor", "prototype":{ "cols":{ "!type": "number", "!doc": "<p>Number of columns in a container. Supported values: 0 and 2. Default value is 0.</p>\n" }, "add":{ "!type":"fn(description: string, error: string)", "!doc":"added new message" }, ...

 

Page 57: Построение собственного JS SDK — зачем и как?

60

Удобная песочница

• подсветка синтаксиса

• умный autocomplete с подсказками из документации

• автодополнение закрывающих тегов и скобок

• проверка кода на лету

• форматирование

Page 58: Построение собственного JS SDK — зачем и как?

61

Page 59: Построение собственного JS SDK — зачем и как?

62

Содержание

• Зачем• Как• Итоги

Page 60: Построение собственного JS SDK — зачем и как?

63

Итоги

• Модульный SDK:• имеющие состояние «толстые» виджеты • датабиндинг• шаблонизация

• Документация• мануал и автоматически созданная по коду

• Тесты• для автоматического тестирования и как примеры

• Песочница• LiveEdit с продвинутым code-completion

Page 61: Построение собственного JS SDK — зачем и как?

64

Page 62: Построение собственного JS SDK — зачем и как?

Спасибо!