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

基于 Turbolinks 的跨平台开发

Rei
September 25, 2016
590

基于 Turbolinks 的跨平台开发

RubyConf China 2016 演讲

Rei

September 25, 2016
Tweet

Transcript

  1. 延迟 用户感知 延迟 用户感知 0–100 ms 即时 100–300 ms 稍微延迟

    300–1000 ms 等待处理 1,000+ ms 注意力分散 10,000+ ms 终止任务 https://hpbn.co/primer-on-web-performance/#speed- performance-and-human-perception
  2. SEO < s e c t i o n i

    d = ' m a i n ' > < / s e c t i o n > < s c r i p t > A p p . i n i t ( . . . ) ; < / s c r i p t >
  3. Turbolinks 做了什么 捕获 < a > 点击事件。 用 xhr 请求服务端内容。

    替换当前页面的 < b o d y > ,合并 < h e a d > 。 处理浏览器历史记录等等……
  4. 安装(Rails 默认) # = r e q u i r

    e t u r b o l i n k s 已经在使用 Turbolinks 了!
  5. Turbolinks Event 解决:使用 t u r b o l i

    n k s : * Event $ ( d o c u m e n t ) . o n ' t u r b o l i n k s : l o a d ' , - > # c o d e s h e r e . . . https://github.com/turbolinks/turbolinks#full-list-of-events
  6. 将事件委托到 d o c u m e n t #

    每次换页遍历绑定 # m y - e l e m e n t $ ( d o c u m e n t ) . o n ' t u r b o l i n k s : l o a d ' - > $ ( ' # m y - e l e m e n t ' ) . o n ' c l i c k ' , - > # c o d e s h e r e . . . # 只绑定一次 $ ( d o c u m e n t ) . o n ' c l i c k ' , ' # m y - e l e m e n t ' , - > # c o d e s h e r e . . .
  7. Turbolinks Caching 解决:让 JavaScript 操作幂等。 $ ( d o c

    u m e n t ) . o n ' t u r b o l i n k s : l o a d ' , - > i f ! $ ( ' # e l e m e n t ' ) . a t t r ( ' d a t a - i s - d o n e ' ) # d o s o m e t h i n g $ ( ' # e l e m e n t ' ) . a t t r ( ' d a t a - i s - d o n e ' , t r u e )
  8. Custom Elements(实验性 Web 标准) # 定义 e l e m

    e n t c l a s s M y E l e m e n t e x t e n d s H T M L E l e m e n t c o n s t r u c t o r : - > # e l e m e n t 创建 c o n n e c t e d C a l l b a c k : - > # e l e m e n t 插入 D O M d i s c o n n e c t e d C a l l b a c k : - > # e l e m e n t 脱离 D O M w i n d o w . c u s t o m E l e m e n t s . d e f i n e ( ' m y - e l e m e n t ' , M y E l e m e n t ) < m y - e l e m e n t > < / m y - e l e m e n t >
  9. Trix:基于 Custom Element 的富文本编辑器 https://github.com/basecamp/trix < f o r m

    … > < i n p u t i d = " x " t y p e = " h i d d e n " n a m e = " c o n t e n t " > < t r i x - e d i t o r i n p u t = " x " > < / t r i x - e d i t o r > < / f o r m >
  10. 安装 r e p o s i t o r

    i e s { j c e n t e r ( ) } d e p e n d e n c i e s { c o m p i l e ' c o m . b a s e c a m p : t u r b o l i n k s : 1 . 0 . 3 ' }
  11. Layout < L i n e a r L a

    y o u t a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " a n d r o i d : o r i e n t a t i o n = " v e r t i c a l " > < c o m . b a s e c a m p . t u r b o l i n k s . T u r b o l i n k s V i e w a n d r o i d : i d = " @ + i d / t u r b o l i n k s _ v i e w " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " / > < / L i n e a r L a y o u t >
  12. 初始化 TurbolinksSession @ O v e r r i d

    e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { t u r b o l i n k s V i e w = ( T u r b o l i n k s V i e w ) f i n d V i e w B y I d ( R . i d . t u r b o l i n k s _ v i e w ) ; T u r b o l i n k s S e s s i o n . g e t D e f a u l t ( t h i s ) . a c t i v i t y ( t h i s ) . a d a p t e r ( t h i s ) . v i e w ( t u r b o l i n k s V i e w ) . v i s i t ( " h t t p s : / / r u b y - c h i n a . o r g " ) ; }
  13. T u r b o l i n k s

    . v i s i t 回调 @ O v e r r i d e p u b l i c v o i d v i s i t P r o p o s e d T o L o c a t i o n W i t h A c t i o n ( S t r i n g l o c a t i o n , S t r i n g a c t i o n ) S t r i n g p a t h = U r i . p a r s e ( l o c a t i o n ) . g e t P a t h ( ) ; / / . . . i f ( p a t h . m a t c h e s ( " / t o p i c s / \ \ d + " ) ) { I n t e n t i n t e n t = n e w I n t e n t ( t h i s , T o p i c A c t i v i t y . c l a s s ) ; i n t e n t . p u t E x t r a ( I N T E N T _ U R L , l o c a t i o n ) ; t h i s . s t a r t A c t i v i t y ( i n t e n t ) ; } / / . . . }
  14. 用 Java 操作 WebVIew p r i v a t

    e v o i d t o p i c C r e a t e ( ) { T u r b o l i n k s S e s s i o n . g e t D e f a u l t ( t h i s ) . g e t W e b V i e w ( ) . e v a l u a t e J a v a s c r i p t ( " $ ( ' f o r m [ t b = \ " e d i t - t o p i c \ " ] ' ) . s u b m i t ( ) ; " , n u l l ) ; }
  15. 从 WebView 调用 Java T u r b o l

    i n k s S e s s i o n . g e t D e f a u l t ( ) . a d d J a v a s c r i p t I n t e r f a c e ( t h i s , " M y C u s t o m J a v a s c r i p t I n t e r f a c e " ) ;