133
Vue.js и его брат-близнец VueServer.js Андрей Солодовников 1.4

Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

  • Upload
    ontico

  • View
    597

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue.js и его брат-близнец VueServer.jsАндрей Солодовников

1.4

Page 2: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue [Вю] (франц.) — Вид

Page 3: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue [Вю] (франц.) — Вид

Vue → View [Вью]

Page 4: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

5 летFrontend/JavaScript developer

7 летВелосипедист

Page 5: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 6: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 7: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Недвижимость

Вся Россия

Page 8: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Недвижимость

Вся Россия

2 года в разработке

Page 9: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

НГС.НЕДВИЖИМОСТЬ

realty.ngs.ru

Page 10: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

НГС.НЕДВИЖИМОСТЬ

realty.ngs.ru

Page 11: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 12: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 13: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Сложный Frontend:что выбрать?

Page 14: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 15: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

WEB COMPONENTS

Page 16: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

React (v15.1.0)Vue.js (v1.0.24)

Page 17: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

React (v15.1.0)

43k

Vue.js (v1.0.24)

20kЗвездочек на GitHub

Page 18: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

React (v15.1.0)

43k

IE9+

147 (43) kb

Vue.js (v1.0.24)

20k

IE9+

76 (26) kb

Звездочек на GitHub

Поддержка

Размер

Page 19: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

React (v15.1.0)

43k

IE9+

147 (43) kb

550ms

Vue.js (v1.0.24)

20k

IE9+

76 (26) kb

450ms

Звездочек на GitHub

Поддержка

Размер

Стартует за*

* В моём личном тесте

Page 20: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Application

List

Item x250

Page 21: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 22: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Evan You

Page 23: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data

Page 24: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data + watchers

Page 25: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data + watchers DOM

Data

Page 26: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data + watchers DOM

Data + watchers

ReactiveBindings

Page 27: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Директивы

Page 28: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

v-if

v-for

v-show

v-text

v-html

v-bind

v-on

Page 29: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

v-if

v-for

v-show

v-text

v-html

v-bind

v-on

ng-if

ng-repeat

ng-show

ng-bind

ng-bind-html

ng-style, ng-class...

ng-click, ng-change...

Page 30: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div v-if="false">Не отрисуется</div><div v-else>Отрисуется</div>

Page 31: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div v-if="false">Не отрисуется</div><div v-else>Отрисуется</div>

<div>Отрисуется</div>

Page 32: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div v-bind:class=" 'foo' "></div>

Page 33: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div v-bind:class=" 'foo' "></div><div :class=" 'foo' "></div>

Page 34: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div v-bind:class=" 'foo' "></div><div :class=" 'foo' "></div><div :class=" ['foo', {bar: true}] "></div>

Page 35: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div class="foo"></div><div class="foo"></div><div class="foo bar"></div>

Page 36: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Усатые выражения

Page 37: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div>{{ someText }}</div>

Page 38: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div>{{ someText }}</div><div>{{* someText }}</div>

Page 39: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div>{{ someText }}</div><div>{{* someText }}</div><div>{{{ someHtml }}}</div>

Page 40: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div>{{ someText }}</div><div>{{* someText }}</div><div>{{{ someHtml }}}</div>

<div title="Было {{pubDate}}">

Page 41: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<div>{{ someText }}</div><div>{{* someText }}</div><div>{{{ someHtml }}}</div>

<div title="Было {{pubDate}}"><div title="Было {{pubDate | dateFull}}">

Page 42: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Lifecycle + Hooks

Page 43: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data Scope

Template + Children

Destroy

Attach

created

compiled

ready

destroyed

Page 44: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data Scope

Template + Children

Destroy

Attach

created

compiled

ready

destroyedbeforeDestroy

beforeCompiled

Page 45: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Data Scope

Template + Children

Destroy

Attach

created

compiled

ready

destroyedbeforeDestroy

beforeCompiled

activate

Page 46: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Создание компонентов

Page 47: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

export default { // ...}

Создание компонентов

Page 48: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<h1>Hello world</h1>',

Page 49: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<h1>Hello world</h1>',data () { return { cats: 1, dogs: 2 };}

Page 50: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<h1>Hello world</h1>',data () { return { cats: 1, dogs: 2 };},methods: { … }

Page 51: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<h1>Hello world</h1>',data () { return { cats: 1, dogs: 2 };},methods: { … },computed: { summ () { return this.cats + this.dogs; } // 3}

Page 52: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

created () { … }beforeCompiled () { … }compiled () { … }activate () { … }ready () { … }beforeDestroy () { … }destroyed () { … }

Page 53: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue.component('MyBlock', { … });

Page 54: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue.component('MyBlock', { … });

export default { // ... components: { MyBlock: { … } }}

Page 55: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<my-block></my-block>

Page 56: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<my-block></my-block><component is="MyBlock"></component>

Page 57: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<my-block></my-block><component is="MyBlock"></component><tbody is="MyBlock" v-for="block in blocks"></tbody>

Page 58: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

const Root = { el: 'body', template: '<div>...</div>'};

new Vue(Root);

Page 59: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Динамические компоненты

Page 60: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<component :is=" name + 'Page' "></component>',data: { name: 'Main'}

Page 61: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<component :is=" name + 'Page' "></component>',data: { name: 'Main'},components: { MainPage: {...}, ArticlesPage: {...}}

Главная

Page 62: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

template: '<component :is=" name + 'Page' "></component>',data: { name: 'Articles'},components: { MainPage: {...}, ArticlesPage: {...}}

Статьи

Page 63: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Обработка событий

Page 64: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<button v-on:click="onButtonClick($event)"></button> <button v-on:click="isVisible = !isVisible"></button>

Обработка событий

Page 65: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<button v-on:click="onButtonClick($event)"></button> <button v-on:click="isVisible = !isVisible"></button> <button @click="isVisible = !isVisible"></button>

Обработка событий

Page 66: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<button @click="isVisible = !isVisible"> {{ isVisible ? 'Скрыть' : 'Показать' }}</button><div v-show="isVisible">Содержимое</div>

Page 67: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Показать

Page 68: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Содержимое

Скрыть

Page 69: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Данные между компонентами

Page 70: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

{ message: 'Привет!' }<child></child>parent

child{ }<div></div>

Page 71: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

{ message: 'Привет!' }<child></child>parent

child{ }<div></div>

Как передать?

Page 72: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

{ message: 'Привет!' }<child></child>parent

child props: { ... }{ }<div></div>

Как передать?

Page 73: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

props: { value: null}

Page 74: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

props: { value: { required: true, default: 'foo', type: String, validate () {…} }}

Page 75: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

{ message: 'Привет!' }<child></child>parent

child props: { value: null }{ }<div></div>

Page 76: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

{ message: 'Привет!' }<child :value="message"></child>parent

child props: { value: null }{ }<div></div>

Page 77: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

{ message: 'Привет!' }<child :value="message"></child>parent

child props: { value: null }{ value: 'Привет!' }<div>Привет!</div>

Page 78: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<child :value="message"></child><child :value.once="message"></child><child :value.sync="message"></child>

parent (*)→ childparent (1)→ childparent ←→ child

Page 79: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

● vue-router, vuex…

● Slot API

● DevTools (Hot Reload + TimeTravel)

● Шикарные доки

А ещё...

Page 80: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Попробуйте Vue.js 1 день(серьёзно)

Page 81: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Что делать с SEO?

Page 82: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Что делать с SEO?

Хочу видеть контент сразу!

Page 83: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Умеет?

Page 84: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Время

250ms

210ms

430ms

Версия

15.0.2

0.14.8

0.13.3

* В моём личном тесте, NODE_ENV=production

React: SSR

Page 85: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Другие решения

Page 86: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Другие решения

● Эмуляция (jsdom, PhantomJS)

Page 87: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Другие решения

● Эмуляция (jsdom, PhantomJS)

● Snapshots / Prerender.io

Page 88: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Другие решения

● Эмуляция (jsdom, PhantomJS)

● Snapshots / Prerender.io [SEO]

Page 89: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

VueServer.js

Page 90: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Почему это не сложно?

Page 91: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Почему это не сложно?

● Vue.js — простой

Page 92: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Почему это не сложно?

● Vue.js — простой● Реактивность — не нужна

Page 93: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Почему это не сложно?

● Vue.js — простой● Реактивность — не нужна● Кроссбраузерность — забудьте

Page 94: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Почему это не сложно?

● Vue.js — простой● Реактивность — не нужна● Кроссбраузерность — забудьте● Не всё писать с нуля

Page 95: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Рендерим.Как поступить с данными?

Page 96: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → State

Page 97: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → State

getData()

Page 98: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → State

getData()

App

Content

Page 99: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → App

Content

Page 100: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → App

Content

COMPILED

Page 101: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → App

Content

getData()

Page 102: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Request → App

Content

Page 103: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

import {renderer} from 'vue-server';const Vue = new renderer();

new Vue({ template: '<div>Hello world!</div>'})

Page 104: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

import {renderer} from 'vue-server';const Vue = new renderer();

new Vue({ template: '<div>Hello world!</div>'}) .$on('vueServer.htmlReady', (html) => { res.send(html); // '<div>Hello world!</div>' });

Page 105: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

import {compiler} from 'vue-server';

export default { template: compiler('<div>.../div>')}

Пре-компиляция шаблонов

Page 106: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

npm install gulp-vue-compile

Пре-компиляция шаблонов

Page 107: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Время

430ms

250ms

[email protected]

[email protected]

* В моём личном тесте

React vs VueServer

Page 108: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Время

430ms

250ms

150ms

[email protected]

[email protected]

[email protected]

* В моём личном тесте

React vs VueServer

Page 109: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Время

30ms

50ms

100ms

Объявление

Главная

Поиск

Рендеринг страниц N1.RU

Page 110: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Серверный → Клиентский HTML

Page 111: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Подходы

● Подхват (сохранение разметки)

● Замена (re-rendering)

Page 112: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Пере-рендериваем

Page 113: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Server HTML

Page 114: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

body

Page 115: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

body{{ body }}

Page 116: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

{{ body }}

body

Page 117: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

body

body

Page 118: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

body

body

Page 119: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

body

body

Page 120: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

head

body

body

Page 121: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 122: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Page 123: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

import {renderer} from 'vue-server';const Vue = new renderer();

Vue.prototype.$isServer = true;

Page 124: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

<span v-if="$isServer">Загрузка...</span><select v-else> ...</select>

Page 125: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

VueServer: недостатки

Page 126: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

VueServer: недостатки

● Версия 1.0.0-migration

Page 127: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

VueServer: недостатки

● Версия 1.0.0-migration

● Свои директивы — нельзя

Page 128: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

VueServer: недостатки

● Версия 1.0.0-migration

● Свои директивы — нельзя

● vue-router и другое — не поддерживается

Page 129: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue 2.0

Page 130: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue 2.0

● SSR «из коробки»

Page 131: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue 2.0

● SSR «из коробки»

● API ещё проще (на ~90% совместимо с 1.x)

Page 132: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Vue 2.0

● SSR «из коробки»

● API ещё проще (на ~90% совместимо с 1.x)

● render ()

Page 133: Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)

Спасибо за внимание!

http://n1.ru/http://vuejs.org/guide/https://www.npmjs.com/package/vue-server/https://www.npmjs.com/package/gulp-vue-compile/

Андрей СолодовниковJS-разработчик «НГС Технологии»[email protected]