Upgrade to Pro — share decks privately, control downloads, hide ads and more …

react at alipay

react at alipay

react at alipay

yiminghe

April 03, 2015
Tweet

More Decks by yiminghe

Other Decks in Technology

Transcript

  1. 支付宝前端架构   •  2012  ~  2014   – seajs  &  arale2

      •  2014  ~       – react  &  roof  
  2. 2012  ~  2014   •  技术特点   – 基于浏览器动态加载的模块化   • 

    url  combo   •  build   – 基于  jQuery  面向  DOM  的编程方式   •  初步的组件编写规范   – 提供细粒度的基础模块支持  
  3. 2012  ~  2014   •  mvc  组件   – Model:  attrs

      – View:  handlebars   – Control:  events  
  4. 问题   •  浏览器端加载逻辑过重   –  无法语义化版本   •  组件机制不完善

      –  模版与局部刷新   –  组合性   –  和  DOM  节点的结合   •  流行功能缺失   –  数据绑定   –  …   •  专有源不便与业界接轨  
  5. 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
  6. React   •  Component   – jsx   – Virtual  DOM  

    – Life  cycle   •  Flux   •  Isomorphic  javascript  
  7. Component   •  Jsx   •  扩充  es6   PrimaryExpression

     =>  JSXElement   JSXAttributeValue  =>  {  AssignmentExpression  }   JSXChild  =>  {AssignmentExpression    }  ||  JSXElement   JSXChildren  =>  JSXChild  JSXChildren    
  8. Virtual  dom   •  化动为静,可预测   – 某一时刻的状态对应于确定的虚拟  dom  表示  

    – 避免人肉追踪随时间而产生得  dom  局部变化   •  框架负责经可能高效得在虚拟  dom  和原生   dom  间同步   •  *  抽象层和具体实现脱离,底层可切换为   canvas/svg/native/dom  
  9. Life  cycle   •  在组件的不同生命周期会调用不同的组件 函数   •  初次创建时  

    – constructor      //  server  and  client   – componentWillMount  //  server  and  client   – render    //  server  and  client   – componentDidMount  //  client   – componentWillUnmount  //  client  
  10. Life  cycle   •  组件更新     – 父组件重新渲染该组件   – 本身

     setState   •  函数调用顺序  (client)   – componentWillReceiveProps   – shouldComponentUpdate   – componentWillUpdate   – render   – componentDidUpdate  
  11. flux   •  Single-direction  data  flow  application   pattern  

    – Action   – Dispatcher   – Store   – View  
  12. Isomorphic     •  服务器端渲染   –  React.renderString   • 

    逻辑共享   –  UI  无关的业务逻辑   –  Router  路由   –  Validator  验证   –  Data  model  数据模型   •  前后端一致的开发模式  
  13. react-component   •  基础设施   –  加载  npm  模块  

    –  代码检测   –  测试,覆盖率,示例页面/脚手架自动生成   –  travis,  saucelabs  支持   •  目录结构   –  assets:    less  源码   –  examples:  组件示例   –  lib:  commonjs  源码   –  tests:  测试代码  
  14. lib   •  源码示例   – es6:  动态转化为  es5  到浏览器执行,通过  

    sourcemap  支持源码调试   – require  node_modules  模块  
  15. 组件开发的一点经验   •  职责清晰   •  扁平访问   •  避免信息冗余

      •  概念一致   •  标签化   •  避免使用  ref  
  16. 技术栈 •  server:  chair(koa)   •  生态圈/源:  tnpm(npm)   • 

    组件:  react-­‐component(react)   •  应用架构:  flux   •  工具:  webpack  
  17. 部署   •  使用  webpack  进行  build   – 每个页面打包出一个  css

     一个  js,不依赖浏览 器端  loader   – 通过  sourcemap  可以在线调试源码    
  18. 部署 •  Webpack  的一些其他特性   –  排除公共库的打包,react,jquery  可以单独引   – 

    通过定义常量,将开发中的  log  在线上删除   •  if(__DEV__)  {  console.log(‘xxx’)  }   –  抽取多页面的公用依赖模块为单独 js,加强跨页面 缓存   –  将按需加载的模块打包成单独的 js,按需加载
  19. 总结 •  组件化开发   –  越细越好   •  中央数据模型  

    –  易于理解   •  前后端一致的开发模式   –  基于  npm  包管理   –  js  为中心   –  项目代码独立  (业务同组件整体打包)   •  不适合?   –  复杂动态场景(店铺装修?)  
  20. 展望   •  tnpm   •  alipay  roof   • 

    Isomorphic     •  react-art   •  react-native  
  21. tnpm   •  Private  package   – @alipay/xx   •  npm

     package   – 同步自  npm,内网速度快   •  快速拼装收银台应用  
  22. Isomorphic   •  同构  javascript   – 通过 react-­‐router  共享路由  

    – 通过 fluxible  共享  store   – 通过  alipay  roof  共享模型与验证   – 通过  react  共享渲染
  23. react-­‐art •  用标签化来实现 canvas  与 svg   •  Svg  

    – Pro:  结构化易理解,支持事件   – Con:  性能   •  Canvas   – Pro:  性能高   – 非结构化,无事件   •  react-­‐art:  svg+canvas  
  24. 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