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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
78
Other Decks in Technology
See All in Technology
私がブラウザを自作したくなった理由
supurazako
1
280
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.6k
8bit CPU 2026
koba789
6
2.6k
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
810
NANDでも描画したい!
nichica906
2
510
地震情報アプリを作ってみた
yama3133
1
110
VLMで2.3万枚のPyCon JP写真を検索!
terapyon
1
260
tamachi.go 誕生の裏側
rymiyamoto
1
200
【書籍出版記念】 10周回って、エージェント開発は RAGがすべてだった。〜RAGの歴史と開発現場で見えた実践知〜
akiratameto
14
5.5k
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
170
LLM Internals: 언어 모델의 계보와 알고리즘 진화 (2023~2026)
inureyes
PRO
1
880
AI・HPC開発を支えるGPU環境の新しい選択肢 液冷GPUシステム「AquSys」の取り組み
gpuunite_official
0
220
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
The Invisible Side of Design
smashingmag
301
52k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
Side Projects
sachag
455
43k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
New Earth Scene 8
popppiees
3
2.5k
How to build a perfect <img>
jonoalderson
1
5.9k
Odyssey Design
rkendrick25
PRO
2
770
Docker and Python
trallard
47
4.1k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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