Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É...

41
Vue.js 2.0 ݸᒒວਫ᪢ ᴢก @kalasoo യᰂڠতՈڹ ݎ

Transcript of Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É...

Page 1: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js 2.0

@kalasoo

Page 2: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Agenda

• Why Vue.js

• Vue.js 2.0

• Nuxt.js

Page 3: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js, React.js, Angular.js

!"!"!"!"!"

Page 4: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë
Page 5: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

JavaScript in 2016

“ …

Typescript Fetch ES6 Babel stage-3

ES6 ES5 SystemJS Fetch polyfill Bluebird Request

Axios await Promise

https://www.v2ex.com/t/310767?p=2

Page 6: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Web JavaScript

• Node.js #v8powered

• Hybrid, React Native, NativeScript, Weex

• Electron, nw.js

• VR WebVR, A-Frame, WebGL

• Cylon.js, Tessel, Johnny-Five

• d3.js, vis.js, HighCharts, Charts

• ……

Page 7: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js -

Evan You / Alibaba?

Angular.js -

Google

React.js -

Facebook

Page 8: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë
Page 9: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Why Vue.js? Vue.js

0.12.X => 2.X

Page 10: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js / About

• The Progressive JavaScript Framework

• GitHub 3 5 ⭐

• NPM 22 ⏬

Page 11: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js

coder-price http://xitu.github.io/coder-price/

Page 12: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js

1.0 MVVM

Model / View / ModelView

UI = VM(State)

Page 13: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js

2.0

Page 14: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js

• Object.defineProperty

Page 15: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js

• Declarative Rendering

• vue-loader

Page 16: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js

Page 17: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

% %

& &

⚡ ⚡️

Page 18: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

) IE … 8 ) Vue.js, React.js, Angular.js: IE9+

Page 19: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

SEO

Google * Baidu +

Page 20: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Initial Loading

Page 21: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

URL <=> Content Cache

• URL

• URL

• Cache URL

Page 22: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vue.js 2.0 Render Function

Stream

Page 23: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

A Simple Vue.js Program

<ul :id='id'> <li v-for:'item in items'>{{item}}</li> <ul>

// A simple vue program bound to <ul> var vue = new Vue({ el: 'ul', data: { id: 'myId', items: ['Item 1', 'Item 2'] } })

Page 24: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Virtual DOM• Vue.js 2.0 DOM Virtual DOM

<ul id='myId'> <li>Item 1</li> <li>Item 2</li> <ul>

// Pseudo-code of a DOM node represented as Javascript Let domNode = { tag: 'ul' attributes: { id: 'myId' } children: [ // where the LI's would go ] };

domNode.children.push('<ul>Item 3</ul>'); sync(originalDomNode, domNode);

Page 25: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Render Function• Render Function DOM

<div id='app'> <div id='myId'> hello world </div> </div>

new Vue({ el: '#app', data: { message: 'hello world' }, render() { var node = this.$createElement; return node( 'div', { attrs: { id: 'myId' } }, this.message ); } });

Page 26: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

• $createElement • jsx

// @returns {VNode} createElement( // {String | Object | Function}

// An HTML tag name, component options, or function // returning one of these. Required. 'div',

// {Object} // A data object corresponding to the attributes // you would use in a template. Optional.

{ // (see details in the next section below) }, // {String | Array}

// Children VNodes. Optional. [ createElement('h1', 'hello world'),

createElement(MyComponent, { props: { someProp: 'foo'

} }), 'bar' ]

)

Page 27: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

• Render Function Node

Page 28: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

// Step 1: Create a Vue instance

var Vue = require('vue')

var app = new Vue({

render: function (h) {

return h('p', 'hello world')

}

})

// Step 2: Create a renderer

var renderer = require(‘vue-server-renderer’)

.createRenderer()

// Step 3: Render the Vue instance to HTML

renderer.renderToString(app, function (error, html) {

if (error) throw error

console.log(html)

// => <p server-rendered="true">hello world</p>

})

Page 29: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Stream

• Vue function call window context

• renderer js

• Vue.js 2.0 Stream

• HTML • renderer.renderToStream( … )

Page 30: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Nuxt.js ❤ ❤️

Page 31: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

-

• vue-cli

• vue-loader

• vue-router

• vuex

• Ajax vue-resource / vue-axios

• vue-devtools

• vux / vue-mdl / mint-ui / element

Page 32: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Nuxt.js

• Next.js (React)

• code-splitting, generation • github.com/nuxt/nuxt.js

$ npm install -g nuxt $ nuxt dev $ nuxt build $ nuxt start $ nuxt generate

Page 33: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Nuxt.js

/assets // LESS, SCSS, ES6, Coffee… /components // Vue Components /layouts // Application Layouts /pages // Vue Pages/Routes /plugins // 3rd party / Vue Plugins

/static //

/store // Vuex State Management nuxt.config.js // nuxt config file package.json

Page 34: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

nuxt.config.jsmodule.exports = { head: { title: 'starter', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', content: 'Nuxt.js project' } ], link: [ { rel: 'icon', type: 'image/x-icon', href: 'favicon.ico' } ] }, css: ['~assets/css/main.css'], loading: { color: '#3B8070' } }

Page 35: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Pages

<template> … </template> <script> export default { data () { … }, fetch () { … }, layout: '…', transition: '…', scrollToTop: '…', validate ({params}) { … }, middleware () { … }, head: { title: '…', … } } </script>

Page 36: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Async Data

<script> export default { data ({params}) { return axios.get(`https://api/${params.id}`) .then((res) => { return { title: res.data.title } }) } } </script>

Page 37: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vuex / Fetch

<script> export default { fetch ({params}) { return axios.get(`https://api/${params.id}`) .then((res) => { store.commit('setTitle', res.data.title) }) } } </script>

Page 38: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

Vuex / nuxtServerInit

// store/index.js actions: { nuxtServerInit ({ commit }, { req }) { if (req.authUser) { commit('user', req.authUser) } } }

Page 39: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

. Any application that can be written in

JavaScript, will eventually be written in JavaScript.

— Atwood’s Law 2007

Page 40: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

• Vue.js 2.0

• Nuxt.js

Page 41: Vue.js 2.0 x É - open.qiniudn.comopen.qiniudn.com/ecug-2016/vue-js-2.0.pdf · • Vue.js 2.0 x É § • x É § Nuxt.js 1 O N + ... • _ o ø vue-loader • § vue-router • ë

juejin.im 2017-01-15