Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
react at alipay
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
yiminghe
April 03, 2015
Technology
4.6k
43
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
react at alipay
react at alipay
yiminghe
April 03, 2015
More Decks by yiminghe
See All by yiminghe
小程序终端技术架构
yiminghe
0
320
支付宝小程序的开放架构
yiminghe
0
250
gitc2016 react based architecture
yiminghe
1
190
antd at qcon2016
yiminghe
1
260
react-based architecture
yiminghe
2
190
React Ecosystem At Ant Financial
yiminghe
4
2.3k
ant design preview
yiminghe
1
360
react best practice
yiminghe
3
250
form validation in react
yiminghe
4
580
Other Decks in Technology
See All in Technology
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
970
Making AI Agents Safe and Fast- Jev, Obsidian, and the Meta-Harness
x5gtrn
PRO
0
160
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
190
顧客の成果創出とプロダクトの成長を 両立するためのFDE
sansantech
PRO
0
420
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
1
1.1k
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
340
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
700
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
4
1.4k
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
460
20260915deck.gl-raster を使ってみた
rena1208
0
140
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
2
180
Goodbye ShellScript, Hello File-based App
shunsock
0
1.3k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
500
Darren the Foodie - Storyboard
khoart
PRO
4
4k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
The Language of Interfaces
destraynor
162
27k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
支付宝前端架构的涅槃 承玉,加缪
大纲 • 历史 • 下一代前端架构 • 实践
• 展望
支付宝前端架构 • 2012 ~ 2014 – seajs & arale2
• 2014 ~ – react & roof
2012 ~ 2014
2012 ~ 2014 • 技术特点 – 基于浏览器动态加载的模块化 •
url combo • build – 基于 jQuery 面向 DOM 的编程方式 • 初步的组件编写规范 – 提供细粒度的基础模块支持
2012 ~ 2014 使用 定义
2012 ~ 2014 • mvc 组件 – Model: attrs
– View: handlebars – Control: events
问题 • 浏览器端加载逻辑过重 – 无法语义化版本 • 组件机制不完善
– 模版与局部刷新 – 组合性 – 和 DOM 节点的结合 • 流行功能缺失 – 数据绑定 – … • 专有源不便与业界接轨
2014 ~ • 重新思考~~
history • Inspired by XHP(php), 2010 开源
history • react 2013.8 开源 • 人物 –
Jordan Walke @jordwalke 第一版,目前 react-‐ naEve. G – Pete Hunt @floydophone 早期开源版本贡献者. ig,G – SebasEan Markbåge @sebmarkbage 目前主力,决策 制定. G tc39 – Paul O’Shannessy @zpao PM. Fb – Tom Occhino @tomocchino manager
React • Component – jsx – Virtual DOM
– Life cycle • Flux • Isomorphic javascript
Component
Component • Jsx • 扩充 es6 PrimaryExpression
=> JSXElement JSXAttributeValue => { AssignmentExpression } JSXChild => {AssignmentExpression } || JSXElement JSXChildren => JSXChild JSXChildren
Virtual DOM
Dom diff
Virtual dom • 化动为静,可预测 – 某一时刻的状态对应于确定的虚拟 dom 表示
– 避免人肉追踪随时间而产生得 dom 局部变化 • 框架负责经可能高效得在虚拟 dom 和原生 dom 间同步 • * 抽象层和具体实现脱离,底层可切换为 canvas/svg/native/dom
Life cycle • 在组件的不同生命周期会调用不同的组件 函数 • 初次创建时
– constructor // server and client – componentWillMount // server and client – render // server and client – componentDidMount // client – componentWillUnmount // client
Life cycle • 组件更新 – 父组件重新渲染该组件 – 本身
setState • 函数调用顺序 (client) – componentWillReceiveProps – shouldComponentUpdate – componentWillUpdate – render – componentDidUpdate
flux • Single-direction data flow application pattern
– Action – Dispatcher – Store – View
dispatcher store view acEon
None
推崇的原则 • 单向数据流 • 组件组合 • 可预测,可靠,容易测试
• 声明式语法
Isomorphic • 服务器端渲染 – React.renderString •
逻辑共享 – UI 无关的业务逻辑 – Router 路由 – Validator 验证 – Data model 数据模型 • 前后端一致的开发模式
React at alipay
下一代前端架构
commonjs • 具备凌乱生命力的 commonjs 生态圈: npm
React component • 基于 commonjs 生态圈的 react 生态
react-component • 基础设施 – 加载 npm 模块
– 代码检测 – 测试,覆盖率,示例页面/脚手架自动生成 – travis, saucelabs 支持 • 目录结构 – assets: less 源码 – examples: 组件示例 – lib: commonjs 源码 – tests: 测试代码
lib • 源码示例 – es6: 动态转化为 es5 到浏览器执行,通过
sourcemap 支持源码调试 – require node_modules 模块
lib
lib • 浏览器实际
examples • No html, Just js
examples • 页面自动生成
tests • 基于 mocha • commonjs 格式
tests • 覆盖率自动生成
持续集成支持 • travis, coveralls, saucelabs
组件开发的一点经验 • 职责清晰 • 扁平访问 • 避免信息冗余
• 概念一致 • 标签化 • 避免使用 ref
职责清晰 • 多个组件协同完成一件事情,而不是一个 组件替其他组件完成本该它自己完成的事 情。
扁平访问 • 组件推荐使用状态来控制交互和显示,如 果需要显示访问,也尽量实行扁平访问, 即只可以调用其 children 的方法。
避免信息冗余 • 尽量避免信息冗余,如果某个 state 可以由 其他 state 计算得到,那么就删除这个 state.
概念一致 • 如果 api 可以和已知概念保持一致,那么就 用已知的 api
标签化 • 尽量使用标签嵌套而不是属性配置。
避免使用 ref • 不要关注细节,使用父组件的 state 控制子 组件的状态而不是直接通过 ref 操作子组件
实际项目实践 • 开发 • 部署
技术栈 • server: chair(koa) • 生态圈/源: tnpm(npm) •
组件: react-‐component(react) • 应用架构: flux • 工具: webpack
开发 • nodejs (chair/koa) – koa-webpack-dev-middleware: webpack 实 时内存打包
package.json • devDependencies
开发源码 • commonjs – es6 同 react-component – css/less
也通过 require(‘xx.css’) 加载
页面 • 一个页面一个顶层组件 App 组合其他组件
构建数据模型 • flux store
更新 • 数据模型发生变化时顶层 App 重新渲染 – 数据传递: 顶层组件-子组件-孙子组件
– 父子组件互相耦合 • 最简单的做法 • 最高效?
部署 • 使用 webpack 进行 build – 每个页面打包出一个 css
一个 js,不依赖浏览 器端 loader – 通过 sourcemap 可以在线调试源码
部署 • Webpack 的一些其他特性 – 排除公共库的打包,react,jquery 可以单独引 –
通过定义常量,将开发中的 log 在线上删除 • if(__DEV__) { console.log(‘xxx’) } – 抽取多页面的公用依赖模块为单独 js,加强跨页面 缓存 – 将按需加载的模块打包成单独的 js,按需加载
总结 • 组件化开发 – 越细越好 • 中央数据模型
– 易于理解 • 前后端一致的开发模式 – 基于 npm 包管理 – js 为中心 – 项目代码独立 (业务同组件整体打包) • 不适合? – 复杂动态场景(店铺装修?)
展望 • tnpm • alipay roof •
Isomorphic • react-art • react-native
tnpm • Private package – @alipay/xx • npm
package – 同步自 npm,内网速度快 • 快速拼装收银台应用
Alipay roof
Isomorphic • 同构 javascript – 通过 react-‐router 共享路由
– 通过 fluxible 共享 store – 通过 alipay roof 共享模型与验证 – 通过 react 共享渲染
react-‐art • 用标签化来实现 canvas 与 svg • Svg
– Pro: 结构化易理解,支持事件 – Con: 性能 • Canvas – Pro: 性能高 – 非结构化,无事件 • react-‐art: svg+canvas
react-‐art demo
react-‐art • hep://yiminghe.me/learning-‐react/example/ react-‐art/index-‐build.html
react-‐naEve • 使用 js 来描述界面,布局(flexbox),处 理逻辑。单独的线程运行 javascriptcore。 • naEve
用来渲染组件,和 javascriptcore 通信。
Ref • React: hep://facebook.github.io/react • React-‐component: heps://github.com/react-‐component
• Learning-‐react: heps://github.com/yiminghe/learning-‐react • react-‐webpack-‐chair: • hep://gitlab.alibaba-‐inc.com/chengyu/chair-‐ react-‐webpack