Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web 应用架构指南
Search
island205
March 27, 2016
Technology
370
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Web 应用架构指南
45 分钟学会5个前端框架
island205
March 27, 2016
More Decks by island205
See All by island205
Doorman
island205
1
77
Other Decks in Technology
See All in Technology
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
550
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
500
Microsoft Build Keynoteふりかえり
tomokusaba
0
120
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
610
Claude Codeをどのように キャッチアップしているか
oikon48
12
6k
AIはどのように 組織のアジリティを変えるのか?
junki
1
420
AIっぽい文章を採点して人間らしく直すアプリを作ってみた
yama3133
2
130
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.9k
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
230
Snowflakeと仲良くなる第一歩
coco_se
4
430
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
850
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
840
Featured
See All Featured
Believing is Seeing
oripsolob
1
140
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Why Our Code Smells
bkeepers
PRO
340
58k
Agile that works and the tools we love
rasmusluckow
331
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Between Models and Reality
mayunak
4
330
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
A Tale of Four Properties
chriscoyier
163
24k
Side Projects
sachag
455
43k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
160
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Deep Space Network (abreviated)
tonyrice
0
170
Transcript
Web 应用架构指南 45分钟学会五个前端框架 @island205
@寸志 是我的真名 前端架构师@陆金所 陆金所大前端招聘! https://github.com/island205/Lu-Hire ᅩᦧ̵Teambition̵ᴭᰂಅૡ JavaScript ཛྷࣘ۸̵ڹᒒຝ̵ڹᒒᚆս۸ ٟԡ̵ᘉᦲ̵Github̵ஙܗ̵ᎣԒ ᘷѺ
前端外刊评论 qianduan.guru ᴨ᯾̵ᚸᦔᒵ 10 ֖ૢݦጱڹᒒૡᑕᕟ౮ጱᖫᬋࢫᴚ҅ྯޮӞᓤᴅጱڹᒒܻڠᘉᦲᒍ ᕁ۱Ѻ
辣么多的前端框架?! 2010.10 2010.06 2011.12 2010.10 reborn in 2016? 2013.03 2014.03
Backbone.js Knockout Ember.js Angular 2 React Vue ெԍᬦҘ
፡፡ TodoMVC 1. ᬯԍग़ຝ҅ᥝکՋԍײҘ 2. ፡ TodoMVC ጱֺৼ҅᪙፳؉ԧ҅ᓌܔ҅֕॔ጱଫአெԍ؉Ҙ
万变不离其宗[指南] ԧᥴԧਤ҅܈كቔྎᜏ҅ռग़ຝḘӤտ ԧᥴԧਤ҅܈كቔྎᜏ҅ռग़ຝמಋೈ ᬯӻਤ҅੪ฎ౯Քॠᥝᦖጱܖ
第一式: 学会编写组件 ፘྲ Angular 1 ଲጱ༷ஷᘒ҅React ڊጱᕟկཛྷୗᓌܔ҅֕Ԟஉ୩य̶़React ጱၞᤈ҅ߥԧෆӻڹᒒຝಅ׀ጱݎཛྷୗ——ݻԭ׀ᕟկ۸ݎጱොୗ
<check-box></check-box> ਖ਼ଫአӾጱձ֜ UI ፘىጱ᮱ړ᮷፡౮ԧӞӻӻᕟկ҅੪ই HTML ຽᓋӞ ᮎ؟ᬯጱ HTML ᕟկᧆই֜ᖫٟޫҘ
按照 MVC 的思路解构组件! ᕟկ۸ݎጱ໐ஞཛྷࣳฎ MVC҅౯তᕣᦊԅ MVC ฎᦡᦇཛྷୗӾ๋᯿ᥝጱ༷ஷѺ
Ӟӻᕟկړ౮ӣ᮱ړғᥤࢶ̵ഴګ̵ᇫா ຝ׀ԧߺԶᥝᔰ҅ԭ౯ժᖫٟӞӻᕟկҘ 1. M ᕬਧک Vғහഝๅෛ҅View ᛔۖๅෛ 1. ໑ഝ M
ๅෛک V ጱොୗӧӞ҅ݢզຝړ౮ӷᔄ 1. React Virtual DOMғྲᡦ DOM 2. ӧฎ Virtual DOM ጱ 2. ໑ഝ M ݒ۸༄ၥጱݎොୗ҅Ԟݢզຝړ౮ӷᔄ 1. Angular Ӟ 1 $apply ᚍ༄ၥ҅2 Zone.js 2. ᶋ Angular ጱ Setter 2. V ᕬਧک Cғᕬਧ DOM Ԫկ 3. C ๅෛ M 1. Ԟݢզړ౮ӷᐿຝ 1. ፗള֢ M 2. ӧፗള֢ M ጱ
var checkbox = new Checkbox() $(document.body).append(checkbox.el) Backbone ᕟկ๋चᏐጱአဩ
export default Backbone.View.extend({ tagName: 'span', className: 'Checkbox', events: {'click .fake':
'toggle'}, initialize: function () { this.state = new Backbone.Model({ checked: false }) this.state.on('change:checked', this.render.bind(this)) this.render() }, toggle: function () { this.state.set({checked: !this.state.get('checked')}) }, render: function() { var checked = this.state.get('checked') this.$el.html(` <i class="fake${checked ? ' checked' : ''}"></i> <input type="checkbox" ${checked ? 'checked' : ''}></input> `) } }) state ฎ M events ฎ C render ฎ V
{{check-box}} Backbone ᕟկ๋चᏐጱአဩ
<span class="Checkbox"> <i class="fake {{if checked 'checked' ''}}" {{action 'toggle'
on="click"}}></i> <input type="checkbox" checked="{{if checked true false}}"/> </span> export default Ember.Component.extend({ checked: false, actions: { toggle() { this.set('checked', !this.get('checked')); } } }); checked M hbs V actions C
<check-box></check-box> Vue ᕟկጱԡٟොဩ੪ HTML चӞᛘ
var Checkbox = Vue.extend({ template: ` <span class="Checkbox"> <i class="fake"
:class="{checked: checked}” @click="toggle"></i> <input type="checkbox" v-model="checked"> </span> `, data: function () { return { checked: false } }, methods: { toggle: function () { this.checked = !this.checked } } }) Data M Template V methods C
<Checkbox /> React ጱԞฎইྌ
export class Checkbox extends React.Component { state = { checked:
false } toggle() { this.setState({ checked: !this.state.checked }) } render() { var checked = this.state.checked return ( <span className="Checkbox"> <i className={checked ? 'fake checked' 'fake'} onClick={this.toggle.bind(this))}></i> <input type="checkbox" checked={checked}/> </span> ) } }
没有 Angular 的例子? ࣁ Angular 1 Ӿ҅౯ժݢզአ Directive ਫሿᕟկຝ҅ᤰᵍᐶࣁ॔ጱଫአᶎڹฎஉํԎጱ̶
第二式: 用组件搭积木
ੜᕟկᕟݳ౮य़ᕟկ҅ړᘒလԏ ৼᕟկਂࣁىᘶىᔮ҅ݢզ᭗ᬦय़ᕟկ॒ቘ य़ᕟկ᭗ᬦં҅ဳفᯈᗝԪկࢧ᧣҅ഴګੜᕟկጱᤈԅ҅ߥଫੜᕟկጱԪկ
var checkbox = new Checkbox({ checked: true, onChange: function(checked) {
console.log(checked ? 'checked' : 'uncheck') } }) $(document.body).append(checkbox.el) փفᯈᗝࢧ᧣
initialize: function (options) { this.options = Object.assign({ checked: false, onChange:
function() {} }, options) this.state = new Backbone.Model({ checked: options.checked || false }) this.state.on('change:checked', this.render.bind(this)) this.render() }, toggle: function () { this.state.set({checked: !this.state.get('checked')}) this.options.onChange(this.state.get('checked')) }
{{checkbox checked=checked onChange=(action 'onCheckChange')}}
<div class="Todos"> <todos-header @add-todo=“addTodo" :all-done.sync="allDone"></todos-header> <todo-list :todos="filteredTodos"></todo-list> <todo-footer :todos="filteredTodos" :visibility="visibility"></todo-footer>
</div>
第三式: 把模块的 Template、Style、 JavaScript̵Images 放到一个目 录下!
None
None
组件和样式约定 <span class="Checkbox"> <i class=“fake" :class="{checked: checked}” @click="toggle"></i> <input type=“checkbox"
v-model="checked"> </span> .Checkbox { .fake { text-align: center; width: 40px; height: 40px; } input { display: none; } } Checkbox / checkbox-component 1. ֵአᕟկݷ֢ԅୗጱݷᑮᳵ 2. ୗֵአᶼ॒ቘ҅አ્ॺጱොୗᖫٟ
组件和样式约定 .Todo { position: relative; font-size: 24px; border-bottom: 1px solid
#ededed; .Checkbox { position: absolute; top: 0; bottom: 0; margin: auto 0; } } כᦤܔӻᕟկ CSS ጱᕍଶ҅Өᕟկᳵ൫ᯈጱ̵ྲইᳵ᪗̵ਧ֖ᒵמ௳ٟ҅ࣁᆿᕟկӾѺ
如何把散沙捏在一起? դᎱೆව҅੪؟වဉ҅ԧනࣁӞӻᕟկկ४Ӿ҅ᮎᧆই֜کӞ᩸ᬩᤈනࣁၨᥦӾᬩᤈޫҘ 1. Ḓضཛྷࣘ۸ࣈᖫٟᬯԶᕟկ 2. ᭗ᬦၨᥦᒒጱ Loader ᘏ Build ૡٍਖ਼ཛྷࣘᕟݳ᩸
3. ӥᶎฎӞԶݢᭌጱොໜದૣ 4. ୮ᆐ҅ፓڹ፡๋҅অጱ੪ฎᐦڊय़ Webpack
// app.css @import "./components/todos.less"; @import "./components/todos-header.less"; @import "./components/check-box.less"; @import "./components/todo-footer.less";
@import "./components/todo-list.less"; @import "./components/todo.less"; ಅํ CSS կጭᦕࣁӞӻկӾ҅᭗ᬦᶼ॒ቘݳଚ̶
import Template from './template.dot' import './style.less' export default Backbone.View.extend({ tagName:
'span', className: 'Checkbox', ... ਖ਼ٌ՜կ᮷ Import ک index.js ӾѺ
祭出 Webpack! browserify/grunt/gulp 其实也能做 Webpack ӧฎ JavaScript module Loader ᘒฎ
Component module loader ଉአጱൊկՕᕨ
<template> <span class="Checkbox"> </span> </template> <script> export default { …
} </script> <style lang="less"> .Checkbox { … } </style> Checkbox.vue
Tips: 开发运行时和线上运行时分开!
第四式: 用路由把组件链成应用
ӷ੶ MVC ጱᕮ̶
常用的 Route 模块 Backbone Backbone.Router Ember.js App.Router Angular ng-router/ui-router angular
2 router React react-router Vue vue-router
app.get('/app/*', function (req, res, next) { res.render('app') }) ԅԧعଫአࣁֵአᬦᑕӾڬෛ҅๐ۓᒒᦏಅํᧆᶭᶎಥጱ᪠ኧ҅᮷ᬬࢧ APP
ᶭ
业务复杂时,按照业务切 分为多个独立的单页应用
第五式: 聪明、准确的数据层 ᧗ ᖨਂ ݶྍ ݎ
鉴于时间关系,以及目前已 有的方案并没有达到理想的 要求,我们下次再聊吧!
Q&A