SlideShare a Scribd company logo
1 of 49
What do you MEAN? ?
или введение в Fullstack JavaScript
Vasiliy Telyatnikov
Fullstack JavaScript Developer at
May 2017, Petrozavodsk
Node.js
(https://nodejs.org/) V8-
based modular web
platform
MongoDB
(https://www.mongodb.com/)
документо-ориентированная
база данных, BSON-формат,
запросы в стиле JavaScript
Express.js
(http://expressjs.com/)
фреймворк для API
(routing)
Angular.js
(https://angular.io/)
клиентский SPA-
фреймворк
The MEAN Stack
User Computer
desktop, mobile
Web Browser
SPA
single-page
web
application
Cloud Server / Docker Container
App
REST
API
MongoDB
Driver
Same Server
/ Docker
Container /
Cluster
MongoDB
The Basis: JavaScript + JSON
JavaScript - eдиный язык для backend / frontend
(https://developer.mozilla.org/ru/docs/Web/JavaScript)
JSON (JavaScript Object Notation) - единый формат передачи и хранения
данных (http://json.org/)
* Если кому-то не хватает комментариев в JSON или надоело ставить кавычки - используйте json5
What is JavaScript?
- lightweight
- interpreted or JIT-compiled
- with first-class functions
- prototype-based (__proto__)
- multi-paradigm:
- OOP (Object-Oriented) - all is Object
- Imperative (run by parsed)
- FP (Functional Programming)
Best known as the scripting language
for Web pages, but it's used in many
non-browser environments as well.
(https://developer.mozilla.org/en-
US/docs/Web/JavaScript/About_JavaSc
ript)
Short About JS
- 1я версия создана Брендоном Эйхом для браузера Netscape в 1995 г.
- Описывается стандартами ECMAScript (https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Language_Resources) в разных редакциях:
- ECMA-262 - Language Specification (весь синтаксис языка), since Jun 1997
- ECMA-402 - Internationalization API Specification (Unicode table, datetime format, timezones,
currency, etc.), since Dec 2012
- Web APIs (https://developer.mozilla.org/en-US/docs/Web/API) - браузерные
API для работы с DOM-деревом
(https://developer.mozilla.org/ru/docs/DOM/DOM_Reference) и множеством
возможностей веб-страниц
Top Modern ES6 Features
- Multi-line template literals: console.log(`Hello, ${name}!
${message}
${sign}`);
- Default args: function img(src, width = 100, height = 100) {/*...*/}
- Destructuring: let [first, second] = array; const {width, height} =
options;
- Arrow functions: const map = (data) => data.map(s => s.value);
- class Me extends That { constructor() { super() } method() {} }
JavaScript’ом единым...
- Один язык программирования для разработки на backend и frontend
- Возможность использования одних и тех же библиотек на backend и
frontend, как сторонних, так и внутрикорпоративных - переход от
стандартов к shared codebase
- ад при импорте данных в JSON из C#-приложения (Unity3D) в Angular и хранением в
MongoDB
- проблемы при сохранении данных в JSON из Angular.js-приложения в RubyOnRails
backend, работе с ними в RoR и передаче обратно в Angular.js
- Изоморфность (pre- и full-рендеринг на сервере для SEO и better UX)
Зависимости, зависимости, зависимости...
- использование сторонних библиотек ускоряет
разработку (jQuery, Angular, custom libraries)
- библиотеки хранятся во внешних репозиториях
(github, CDN) и имеют разные версии (иногда
совершенноневозможноабсолютно несовместимые)
- проблемы с зависимостями эффективно решают
пакетные менеджеры:
- Сomposer in PHP
- Rubygems in Ruby
All-in-NPM
NPM (https://npmjs.com/) - пакетный менеджер зависимостей для управления
3rd-party libraries в Node.js:
- Устанавливается обычно вместе с Node.js
- Любой проект описывается в специальном файле package.json
(https://docs.npmjs.com/files/package.json): npm help json
- Пакеты устанавливаются в `./node_modules` или глобально (npm i -g)
- Простая установка модулей и обновление зависимостей
- Поддержка скриптов запуска и хуков: npm start, npm postinstall
How to NPM?
1) Инициализация проекта
2) Установка зависимостей
3) Результат
NPM Scripts
(https://docs.npmjs.com/misc/scripts)
{ “start”: “node ./app.js”,
“install”: “bower install --allow-root”,
“postinstall”: “node-pre-gyp install --fallback-to-build”,
“test”: “NODE_ENV=test ./node_modules/.bin/mocha”,
“dependencies”: {
“mocha”: “3.4.1”
}}
Node.js
- Событийно-ориентированная система (Reactive Programming)
- Основан на Chrome V8 JavaScript engine (https://developers.google.com/v8/)
- Не-блокирующее взаимодействие с устройствами ввода-вывода (I/O over
pipes)
- Поддерживаются addon modules путем сборки в gyp
(https://github.com/nodejs/node-gyp) (например, драйвер к базе данных, C-
библиотека, драйвер к микроконтроллеру)
- Создан в 2009 Райаном Далом, развивается под эгидой Node.js Foundation
(https://nodejs.org/en/foundation/)
Example: Node.js vs PHP (Ruby)
(https://habrahabr.ru/post/140066/)
Node.js Process Management
- PM2 (http://pm2.keymetrics.io/) - гибкий pm с аналитикой Keymetrics:
pm2 start|stop|reload|kill processes.json
{"apps" : [{
"script": "./api.js", "name": "api",
"instances" : 4, "exec_interpreter": "/home/vasiliy0s/.nvm/versions/node/v0.12.9/bin/node",
"exec_mode" : "cluster", ”watch": true
}]}
- forever (https://www.npmjs.com/package/forever) - простая надежная CLI
- он вам nodemon (https://www.npmjs.com/package/nodemon) - для
development, “simply wraps your code under development”
Workers
Проблема любого highload - разделение нагрузки по серверам на задачи:
- sms/email-рассылка
- сервер авторизации
- сервер загрузки объемных файлов
- подсчет статистики, и т.д.
node ./workers/stats-server.js
node ./workers/notifications-server.js
Node.js позволит использовать одну и ту же программную базу (models, libs,
Node.js version management
Много проектов - много версий - один рабочий компьютер на всю жизнь
- NVM - Node Version Manager (https://github.com/creationix/nvm)
- ‘n’ package (https://www.npmjs.com/package/n)
- Docker: FROM node:7 https://hub.docker.com/_/node/
Express.js
Простой и быстрый HTTP-фреймворк для Node.js (http://expressjs.com/)
- Отвечает за API-роутинг
- Гибкий и расширяется за счет бесчисленных middleware
- Поддерживает разные render engines:
- EJS, Handlebars, Hogan, Jade/Pug (defaults), Twig, Vash - для генерации HTML
- Less, Stylus, Compass, Sass - для генерации CSS
- Высокая производительность (в т.ч. для highload)
- Отлично документирован, много примеров, большое сообщество
What Middleware Does?
Приложение Express, по сути, представляет собой серию вызовов функций
промежуточной обработки:
- Выполнение любого кода
- Внесение изменений в объекты запросов (req) и ответов (res)
- Завершение цикла “запрос-ответ” - res.status(200).send(‘OK’)
- Вызов следующей функции промежуточной обработки из стека - next(err)
HTTP request
HTTP response
Express.js App
Matched /route
cookie
parser
body
parser
logger callback
cookie
parser
logger
Example: Express.js Regular Middlewares
app.js: routes/index.js:
Example:
Express.js Routes
Типовая структура приложений на
Express.js:
- Entrypoint в ./app.js
- Все контроллеры в ./controllers
- Все модели c бизнес-логикой в
./models
- Все шаблоны во ./views
Альтернативы Express.js
- Koa (http://koajs.com/)
- Hapi (https://hapijs.com/)
- Strapi (http://strapi.io/)
- Sails (http://sailsjs.com/) (а-ля Ruby on Rails)
- Restify (http://mcavage.me/node-restify/)
MongoDB
- NoSQL == несвязанность данных:
- коллекции вместо таблиц
- несвязанные документы вместо строк, schema-less
- базы и коллекции создаются “на лету”
- данные любого типа
- BSON (http://bsonspec.org/) - надмножество JSON + регулярные
выражения, двоичные данные и даты
- индексы, быстрый поиск
GridFS
Возможность хранить файлы в базе данных (images, PDFs, XLSXs, etc.)
(https://docs.mongodb.com/manual/core/gridfs/)
- GridFS automatically chunk files (default to 255 kB) - BSON file max size is
16 MB
- Uses two collections to store files:
- file chunks
- metadata
- Storing like regular mongoDB document & allowed for queries (via mongodb-
native-driver or mongofiles CLI tool)
MongoDB ODMs
ODM - связывание коллекций и JS-моделей с использованием схемы и
добавлением ООП-методов (ORM в RDBMS)
- Mongoose.js (http://mongoosejs.com/) - schemas, methods, etc.
- Mongorito (http://mongorito.com/) - middlewares, generators instead of
promises: yield post.save();
- others like ‘Mongolia’ (https://www.npmjs.com/package/mongolia) :)
- позволяет описать и стандартизировать модели данных через UserSchema
= new mongoose.Schema({/*...*/});
- всегда добавляет _id;
- позволяет хранить логику в модели в виде методов модели и коллекции
- имеет chain interface:
User.find(query).select(‘age’).limit(1).skip(num).then(/**/);
- помогает связывать данные: User.find(query).populate(‘articles
followers likes’);
- схемы для subdocuments: Schema({ likes: [LikeSchema] });
Mongoose
Example:
Small
Mongoose
Model “SMS”
Нужен GUI? Держи Robomongo!
https://robomongo.org/
сохраняемые запросы;
редактирование JSON;
кроссплатформ;
сохраняемый коннект к
разным базам, ssh
тоннель
100500+ других на
https://docs.mongodb.com/ecosystem/t
Angular.js
- Open-Source JS framework, разработан в Google + сообщество
- MVC паттерн, позволяющий разделить бизнес-логику (императивное
программирование) и представление (декларативное
программирование) для более удобного тестирования и поддержки
- Реализовано двустороннее связывание данных (two-way data binding),
синхронизирующий данные в JS-коде (Model) <=> DOM-дереве (View)
- Хорошая поддержка e2e-тестирования из коробки (по сценариям)
- Модульная архитектура (angular.module(‘app’)) + паттерн внедрения
зависимостей (Dependency Injection) делают фреймворк гибким и
расширяемым - легко подключать сторонние модули и шарить код между
Angular.js
- Директивы - свои кастомные HTML-компоненты (напр, <calendar />)
- Шаблоны - <h1>Hello, {{ name }}!</h1>
- Много встроенных директив: ngModel, Repeat, ngIf, ngBind…
- Встроенный HTTP-клиент: $http.get(‘/users’).then(/**/)
- Встроенная поддержка <form><input ng-model=”name”/ >…</form>
- Фильтры вывода данных (напр., форматирование)
- Локализация (встроенная - для фильтров)
- Большое коммьюнити, подробная документация, много курсов
Angular.js
- Angular 1.x - https://angularjs.org/
- Angular 2.x, 4.x - https://angular.io/ (TypeScript “почти” обязателен)
- Дополнительные официальные модули:
- ngRoute - роутинг c поддержкой HTML5 mode (как обычный веб-сайт)
- ngSanitize - безопасная фильтрация вывода данных: username = “<script src=’...’>”
- ngResource - удобная работа с REST API (редко используется)
- ngAnimate - CSS-анимации
- ngCookies - работа с cookies
Dependency Injection
Архитектурный паттерн, предоставляющий возможность внедрять
зависимости в программные компоненты (например, $http-сервис в controller)
Попса в Angular 1.x
- Angular Translate (https://angular-translate.github.io/) - комплексная
локализация в PO-файлах (или JSON/JS)
- ng-file-upload (http://angular-file-upload.appspot.com/) - загрузка файлов на
сервер
- AngularUI (https://angular-ui.github.io/) - много разных компонентов, в т.ч.:
- UI-Router (https://ui-router.github.io/) - state machine + вложенные urls
- UI Bootstrap (https://angular-ui.github.io/bootstrap/) - директивы для Bootstrap
- angular-ui-tree (https://angular-ui-tree.github.io/angular-ui-tree/) - UI Tree
implementation
Example:
Angular 1.5
App
Example:
Angular 2.x App
- React.js (https://facebook.github.io/react/):
- библиотека от Facebook, требует много сторонних пакетов (например, для http-
запросов)
- Component-Based, Virtual DOM => быстрый
- State-based (Flux-архитектура): Redux (http://redux.js.org/)
- JSX-синтаксис: render() { return <h1>Hello, {this.state.name}</h1>; }
- Vue.js (https://vuejs.org/) - финансируется Alibaba:
- легкий в освоении и быстродействии
- .vue-файлы как компоненты содержат в себе JS+HTML+CSS
Альтернативы Angular
На закуску
Server-side Rendering
- Решает проблему SEO для SPA
- Angular Universal for Angular 2+ apps https://universal.angular.io/
Web
Crawler
(Google,
Yandex,
etc.) Render Server
Render App
Phantom.js
SPA
(Angular)
Backend
MongoDB
(Main
Database)
MongoDB
(HTML
Cache
Database)
Node.js
Express
App
API
JS everywhere? Yes, babies!
- Desktop
- Electron для приложений (https://electron.atom.io/) под Windows, OS X, Linux
- Mobile
- Adobe PhoneGap (http://phonegap.com/) - упаковка SPA в iOS / Android / WindowsPhone-
приложения, с готовыми модулями ngCordova (http://ngcordova.com/)
- NativeScript (https://www.nativescript.org/) - без web-views (быстрее), любит TypeScript
- IoT
- Espruino - JavaScript Interpreter for Microcontrollers (https://www.espruino.com/)
- Tessel - платформа со своим железом для кодинга на node.js (https://tessel.io/)
“Any application that can be written in
JavaScript, will eventually be written in
JavaScript”, Jeff Atwood
Fin

More Related Content

What's hot

Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без болиAnton Piskunov
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложенийRoman Brovko
 
инструментарий
инструментарийинструментарий
инструментарийigdweb
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineHTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineVolha Banadyseva
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформуVadim Kruchkov
 
nw.js введение в кросс-платформенные десктопные приложения на javascript (mo...
nw.js  введение в кросс-платформенные десктопные приложения на javascript (mo...nw.js  введение в кросс-платформенные десктопные приложения на javascript (mo...
nw.js введение в кросс-платформенные десктопные приложения на javascript (mo...Kirill Danilov
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиентыRoman Brovko
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияYandex
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5Provectus
 
Web deployment
Web deploymentWeb deployment
Web deploymentGetDev.NET
 
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...GeeksLab Odessa
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...Ontico
 
Алексей Андросов "Криокамера для статики"
Алексей Андросов "Криокамера для статики"Алексей Андросов "Криокамера для статики"
Алексей Андросов "Криокамера для статики"Yandex
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...IT-Portfolio
 

What's hot (20)

Webcluster cases
Webcluster casesWebcluster cases
Webcluster cases
 
1c bitrix-cluster-et
1c bitrix-cluster-et1c bitrix-cluster-et
1c bitrix-cluster-et
 
Chef @DevWeb
Chef @DevWebChef @DevWeb
Chef @DevWeb
 
Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без боли
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений
 
инструментарий
инструментарийинструментарий
инструментарий
 
02 1c-bitrix-cloud-storage
02 1c-bitrix-cloud-storage02 1c-bitrix-cloud-storage
02 1c-bitrix-cloud-storage
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineHTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
 
nw.js введение в кросс-платформенные десктопные приложения на javascript (mo...
nw.js  введение в кросс-платформенные десктопные приложения на javascript (mo...nw.js  введение в кросс-платформенные десктопные приложения на javascript (mo...
nw.js введение в кросс-платформенные десктопные приложения на javascript (mo...
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
 
non-blocking java script
non-blocking java scriptnon-blocking java script
non-blocking java script
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
 
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
HTML5 Web Components: следующий шаг к модульности вашего проекта / Андрей Рах...
 
Алексей Андросов "Криокамера для статики"
Алексей Андросов "Криокамера для статики"Алексей Андросов "Криокамера для статики"
Алексей Андросов "Криокамера для статики"
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
 

Similar to What do you MEAN? или введение в Fullstack JavaScript

NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложенияDenis Latushkin
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakAmasty
 
Web programming modern tendencies
Web programming modern tendenciesWeb programming modern tendencies
Web programming modern tendenciesDarkestMaster
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Mikhail Davydov
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in RussianOleg Kachan
 
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)Ontico
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...JSib
 
Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5Dmitriy Krukov
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработкиIT-Доминанта
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиБэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиITCrowd Almaty
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Pavel Chertorogov
 
20160330 Приложение с использованием данных с сервера (EMS)
20160330 Приложение с использованием данных с сервера (EMS) 20160330 Приложение с использованием данных с сервера (EMS)
20160330 Приложение с использованием данных с сервера (EMS) Andrew Sovtsov
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word pressvovasik
 

Similar to What do you MEAN? или введение в Fullstack JavaScript (20)

NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis Bosak
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Web programming modern tendencies
Web programming modern tendenciesWeb programming modern tendencies
Web programming modern tendencies
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in Russian
 
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
WebAssembly
WebAssemblyWebAssembly
WebAssembly
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5Мировые информационные ресурсы. Лекция 5
Мировые информационные ресурсы. Лекция 5
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиБэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)
 
20160330 Приложение с использованием данных с сервера (EMS)
20160330 Приложение с использованием данных с сервера (EMS) 20160330 Приложение с использованием данных с сервера (EMS)
20160330 Приложение с использованием данных с сервера (EMS)
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
 

What do you MEAN? или введение в Fullstack JavaScript

  • 1. What do you MEAN? ? или введение в Fullstack JavaScript Vasiliy Telyatnikov Fullstack JavaScript Developer at May 2017, Petrozavodsk
  • 2.
  • 3. Node.js (https://nodejs.org/) V8- based modular web platform MongoDB (https://www.mongodb.com/) документо-ориентированная база данных, BSON-формат, запросы в стиле JavaScript Express.js (http://expressjs.com/) фреймворк для API (routing) Angular.js (https://angular.io/) клиентский SPA- фреймворк
  • 4. The MEAN Stack User Computer desktop, mobile Web Browser SPA single-page web application Cloud Server / Docker Container App REST API MongoDB Driver Same Server / Docker Container / Cluster MongoDB
  • 5.
  • 6. The Basis: JavaScript + JSON JavaScript - eдиный язык для backend / frontend (https://developer.mozilla.org/ru/docs/Web/JavaScript) JSON (JavaScript Object Notation) - единый формат передачи и хранения данных (http://json.org/) * Если кому-то не хватает комментариев в JSON или надоело ставить кавычки - используйте json5
  • 7. What is JavaScript? - lightweight - interpreted or JIT-compiled - with first-class functions - prototype-based (__proto__) - multi-paradigm: - OOP (Object-Oriented) - all is Object - Imperative (run by parsed) - FP (Functional Programming) Best known as the scripting language for Web pages, but it's used in many non-browser environments as well. (https://developer.mozilla.org/en- US/docs/Web/JavaScript/About_JavaSc ript)
  • 8. Short About JS - 1я версия создана Брендоном Эйхом для браузера Netscape в 1995 г. - Описывается стандартами ECMAScript (https://developer.mozilla.org/en- US/docs/Web/JavaScript/Language_Resources) в разных редакциях: - ECMA-262 - Language Specification (весь синтаксис языка), since Jun 1997 - ECMA-402 - Internationalization API Specification (Unicode table, datetime format, timezones, currency, etc.), since Dec 2012 - Web APIs (https://developer.mozilla.org/en-US/docs/Web/API) - браузерные API для работы с DOM-деревом (https://developer.mozilla.org/ru/docs/DOM/DOM_Reference) и множеством возможностей веб-страниц
  • 9. Top Modern ES6 Features - Multi-line template literals: console.log(`Hello, ${name}! ${message} ${sign}`); - Default args: function img(src, width = 100, height = 100) {/*...*/} - Destructuring: let [first, second] = array; const {width, height} = options; - Arrow functions: const map = (data) => data.map(s => s.value); - class Me extends That { constructor() { super() } method() {} }
  • 10. JavaScript’ом единым... - Один язык программирования для разработки на backend и frontend - Возможность использования одних и тех же библиотек на backend и frontend, как сторонних, так и внутрикорпоративных - переход от стандартов к shared codebase - ад при импорте данных в JSON из C#-приложения (Unity3D) в Angular и хранением в MongoDB - проблемы при сохранении данных в JSON из Angular.js-приложения в RubyOnRails backend, работе с ними в RoR и передаче обратно в Angular.js - Изоморфность (pre- и full-рендеринг на сервере для SEO и better UX)
  • 11. Зависимости, зависимости, зависимости... - использование сторонних библиотек ускоряет разработку (jQuery, Angular, custom libraries) - библиотеки хранятся во внешних репозиториях (github, CDN) и имеют разные версии (иногда совершенноневозможноабсолютно несовместимые) - проблемы с зависимостями эффективно решают пакетные менеджеры: - Сomposer in PHP - Rubygems in Ruby
  • 12.
  • 13. All-in-NPM NPM (https://npmjs.com/) - пакетный менеджер зависимостей для управления 3rd-party libraries в Node.js: - Устанавливается обычно вместе с Node.js - Любой проект описывается в специальном файле package.json (https://docs.npmjs.com/files/package.json): npm help json - Пакеты устанавливаются в `./node_modules` или глобально (npm i -g) - Простая установка модулей и обновление зависимостей - Поддержка скриптов запуска и хуков: npm start, npm postinstall
  • 14. How to NPM? 1) Инициализация проекта 2) Установка зависимостей 3) Результат
  • 15. NPM Scripts (https://docs.npmjs.com/misc/scripts) { “start”: “node ./app.js”, “install”: “bower install --allow-root”, “postinstall”: “node-pre-gyp install --fallback-to-build”, “test”: “NODE_ENV=test ./node_modules/.bin/mocha”, “dependencies”: { “mocha”: “3.4.1” }}
  • 16.
  • 17. Node.js - Событийно-ориентированная система (Reactive Programming) - Основан на Chrome V8 JavaScript engine (https://developers.google.com/v8/) - Не-блокирующее взаимодействие с устройствами ввода-вывода (I/O over pipes) - Поддерживаются addon modules путем сборки в gyp (https://github.com/nodejs/node-gyp) (например, драйвер к базе данных, C- библиотека, драйвер к микроконтроллеру) - Создан в 2009 Райаном Далом, развивается под эгидой Node.js Foundation (https://nodejs.org/en/foundation/)
  • 18. Example: Node.js vs PHP (Ruby) (https://habrahabr.ru/post/140066/)
  • 19. Node.js Process Management - PM2 (http://pm2.keymetrics.io/) - гибкий pm с аналитикой Keymetrics: pm2 start|stop|reload|kill processes.json {"apps" : [{ "script": "./api.js", "name": "api", "instances" : 4, "exec_interpreter": "/home/vasiliy0s/.nvm/versions/node/v0.12.9/bin/node", "exec_mode" : "cluster", ”watch": true }]} - forever (https://www.npmjs.com/package/forever) - простая надежная CLI - он вам nodemon (https://www.npmjs.com/package/nodemon) - для development, “simply wraps your code under development”
  • 20. Workers Проблема любого highload - разделение нагрузки по серверам на задачи: - sms/email-рассылка - сервер авторизации - сервер загрузки объемных файлов - подсчет статистики, и т.д. node ./workers/stats-server.js node ./workers/notifications-server.js Node.js позволит использовать одну и ту же программную базу (models, libs,
  • 21. Node.js version management Много проектов - много версий - один рабочий компьютер на всю жизнь - NVM - Node Version Manager (https://github.com/creationix/nvm) - ‘n’ package (https://www.npmjs.com/package/n) - Docker: FROM node:7 https://hub.docker.com/_/node/
  • 22.
  • 23. Express.js Простой и быстрый HTTP-фреймворк для Node.js (http://expressjs.com/) - Отвечает за API-роутинг - Гибкий и расширяется за счет бесчисленных middleware - Поддерживает разные render engines: - EJS, Handlebars, Hogan, Jade/Pug (defaults), Twig, Vash - для генерации HTML - Less, Stylus, Compass, Sass - для генерации CSS - Высокая производительность (в т.ч. для highload) - Отлично документирован, много примеров, большое сообщество
  • 24. What Middleware Does? Приложение Express, по сути, представляет собой серию вызовов функций промежуточной обработки: - Выполнение любого кода - Внесение изменений в объекты запросов (req) и ответов (res) - Завершение цикла “запрос-ответ” - res.status(200).send(‘OK’) - Вызов следующей функции промежуточной обработки из стека - next(err) HTTP request HTTP response Express.js App Matched /route cookie parser body parser logger callback cookie parser logger
  • 25. Example: Express.js Regular Middlewares app.js: routes/index.js:
  • 26. Example: Express.js Routes Типовая структура приложений на Express.js: - Entrypoint в ./app.js - Все контроллеры в ./controllers - Все модели c бизнес-логикой в ./models - Все шаблоны во ./views
  • 27. Альтернативы Express.js - Koa (http://koajs.com/) - Hapi (https://hapijs.com/) - Strapi (http://strapi.io/) - Sails (http://sailsjs.com/) (а-ля Ruby on Rails) - Restify (http://mcavage.me/node-restify/)
  • 28.
  • 29. MongoDB - NoSQL == несвязанность данных: - коллекции вместо таблиц - несвязанные документы вместо строк, schema-less - базы и коллекции создаются “на лету” - данные любого типа - BSON (http://bsonspec.org/) - надмножество JSON + регулярные выражения, двоичные данные и даты - индексы, быстрый поиск
  • 30. GridFS Возможность хранить файлы в базе данных (images, PDFs, XLSXs, etc.) (https://docs.mongodb.com/manual/core/gridfs/) - GridFS automatically chunk files (default to 255 kB) - BSON file max size is 16 MB - Uses two collections to store files: - file chunks - metadata - Storing like regular mongoDB document & allowed for queries (via mongodb- native-driver or mongofiles CLI tool)
  • 31. MongoDB ODMs ODM - связывание коллекций и JS-моделей с использованием схемы и добавлением ООП-методов (ORM в RDBMS) - Mongoose.js (http://mongoosejs.com/) - schemas, methods, etc. - Mongorito (http://mongorito.com/) - middlewares, generators instead of promises: yield post.save(); - others like ‘Mongolia’ (https://www.npmjs.com/package/mongolia) :)
  • 32. - позволяет описать и стандартизировать модели данных через UserSchema = new mongoose.Schema({/*...*/}); - всегда добавляет _id; - позволяет хранить логику в модели в виде методов модели и коллекции - имеет chain interface: User.find(query).select(‘age’).limit(1).skip(num).then(/**/); - помогает связывать данные: User.find(query).populate(‘articles followers likes’); - схемы для subdocuments: Schema({ likes: [LikeSchema] }); Mongoose
  • 34. Нужен GUI? Держи Robomongo! https://robomongo.org/ сохраняемые запросы; редактирование JSON; кроссплатформ; сохраняемый коннект к разным базам, ssh тоннель 100500+ других на https://docs.mongodb.com/ecosystem/t
  • 35.
  • 36. Angular.js - Open-Source JS framework, разработан в Google + сообщество - MVC паттерн, позволяющий разделить бизнес-логику (императивное программирование) и представление (декларативное программирование) для более удобного тестирования и поддержки - Реализовано двустороннее связывание данных (two-way data binding), синхронизирующий данные в JS-коде (Model) <=> DOM-дереве (View) - Хорошая поддержка e2e-тестирования из коробки (по сценариям) - Модульная архитектура (angular.module(‘app’)) + паттерн внедрения зависимостей (Dependency Injection) делают фреймворк гибким и расширяемым - легко подключать сторонние модули и шарить код между
  • 37. Angular.js - Директивы - свои кастомные HTML-компоненты (напр, <calendar />) - Шаблоны - <h1>Hello, {{ name }}!</h1> - Много встроенных директив: ngModel, Repeat, ngIf, ngBind… - Встроенный HTTP-клиент: $http.get(‘/users’).then(/**/) - Встроенная поддержка <form><input ng-model=”name”/ >…</form> - Фильтры вывода данных (напр., форматирование) - Локализация (встроенная - для фильтров) - Большое коммьюнити, подробная документация, много курсов
  • 38. Angular.js - Angular 1.x - https://angularjs.org/ - Angular 2.x, 4.x - https://angular.io/ (TypeScript “почти” обязателен) - Дополнительные официальные модули: - ngRoute - роутинг c поддержкой HTML5 mode (как обычный веб-сайт) - ngSanitize - безопасная фильтрация вывода данных: username = “<script src=’...’>” - ngResource - удобная работа с REST API (редко используется) - ngAnimate - CSS-анимации - ngCookies - работа с cookies
  • 39. Dependency Injection Архитектурный паттерн, предоставляющий возможность внедрять зависимости в программные компоненты (например, $http-сервис в controller)
  • 40. Попса в Angular 1.x - Angular Translate (https://angular-translate.github.io/) - комплексная локализация в PO-файлах (или JSON/JS) - ng-file-upload (http://angular-file-upload.appspot.com/) - загрузка файлов на сервер - AngularUI (https://angular-ui.github.io/) - много разных компонентов, в т.ч.: - UI-Router (https://ui-router.github.io/) - state machine + вложенные urls - UI Bootstrap (https://angular-ui.github.io/bootstrap/) - директивы для Bootstrap - angular-ui-tree (https://angular-ui-tree.github.io/angular-ui-tree/) - UI Tree implementation
  • 43. - React.js (https://facebook.github.io/react/): - библиотека от Facebook, требует много сторонних пакетов (например, для http- запросов) - Component-Based, Virtual DOM => быстрый - State-based (Flux-архитектура): Redux (http://redux.js.org/) - JSX-синтаксис: render() { return <h1>Hello, {this.state.name}</h1>; } - Vue.js (https://vuejs.org/) - финансируется Alibaba: - легкий в освоении и быстродействии - .vue-файлы как компоненты содержат в себе JS+HTML+CSS Альтернативы Angular
  • 45. Server-side Rendering - Решает проблему SEO для SPA - Angular Universal for Angular 2+ apps https://universal.angular.io/ Web Crawler (Google, Yandex, etc.) Render Server Render App Phantom.js SPA (Angular) Backend MongoDB (Main Database) MongoDB (HTML Cache Database) Node.js Express App API
  • 46.
  • 47. JS everywhere? Yes, babies! - Desktop - Electron для приложений (https://electron.atom.io/) под Windows, OS X, Linux - Mobile - Adobe PhoneGap (http://phonegap.com/) - упаковка SPA в iOS / Android / WindowsPhone- приложения, с готовыми модулями ngCordova (http://ngcordova.com/) - NativeScript (https://www.nativescript.org/) - без web-views (быстрее), любит TypeScript - IoT - Espruino - JavaScript Interpreter for Microcontrollers (https://www.espruino.com/) - Tessel - платформа со своим железом для кодинга на node.js (https://tessel.io/)
  • 48. “Any application that can be written in JavaScript, will eventually be written in JavaScript”, Jeff Atwood
  • 49. Fin

Editor's Notes

  1. -) Приветствие-представление -) Опрос "кто знаетJS"?
  2. Уделить 3 минуты и дать введение публике (intro о персонажах)
  3. И другие примеры вроде build C extensions
  4. Почему важно следить за демонами в системе. Отличия от php/ruby
  5. Добавить примеры
  6. Слайд, Middlewares - описание (pattern + UML), примеры, отличие от MVC, как применяется (json parsing, acl example)
  7. отрицательные стороны… как хранятся данные (сравнение с RDBS)
  8. примеры
  9. почему выбран для MEAN? DI, паттерн и реализация
  10. Акцент на KendoUI для Enterprice Apps
  11. Кейс icons8.com: 50 000+ страниц контента * 7 стилей иконок * 2 режима (desktop+mobile) = >=700 000 страниц кеша