SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
Building an Event-driven Web
                       谢传贵
                     2012.03.30




12年3月31⽇日星期六
Agenda

               • 事件定义
               • 事件编程的演进
               • 事件编程实战
               • 对事件编程的一些思考

12年3月31⽇日星期六
事件的定义

               • Anything that happened(or didn’t happen)
               • A change in state
               • A condition that triggers a notification
               • An event is always named in the past tense
                 and is immutable



12年3月31⽇日星期六
事件的三个层次

               • 触发
               • 识别
               • 事件的上下⽂文


12年3月31⽇日星期六
事件编程的演进



12年3月31⽇日星期六
long  long  ago...


               <input type=”button” onclick=”doSomething();”/>




12年3月31⽇日星期六
<input type=”button” onclick=”doSomething();”/>




                      button.onclick = doSomething;




12年3月31⽇日星期六
<input type=”button” onclick=”doSomething();”/>

                      button.onclick = doSomething;




          button.addEventListener(‘click’,doSomething,false);




12年3月31⽇日星期六
if(button.addEventListener){
        button.addEventListener(‘click’,doSomething,false);
     }else if(button.attachEvent){
        button.attachEvent(‘click’,doSomething);
     }




12年3月31⽇日星期六
<input type=”button” onclick=”doSomething();”/>

                      button.onclick = doSomething;

          button.addEventListener(‘click’,doSomething,false);

                if(button.addEventListener){ /* madness*/ }

                  addEvent(button,‘click’,doSomething);




12年3月31⽇日星期六
function doSomething(e){
                  if(e && e.preventDefault){
                     e.preventDefault();
                  }
                  return false;
                }


               每一段代码里都需要进行这样的处理,坑爹啊




12年3月31⽇日星期六
<input type=”button” onclick=”doSomething();”/>

                      button.onclick = doSomething;

          button.addEventListener(‘click’,doSomething,false);

                if(button.addEventListener){ /* madness*/ }

                  addEvent(button,‘click’,doSomething);




12年3月31⽇日星期六
YUI2
           YAHOO.util.Event.on(button,‘click’,doSomething);

               YAHOO.util.Event.preventDefault(e);


                       规范化的事件订阅
                       规范化的事件处理




12年3月31⽇日星期六
jQuery
     button.on(‘click’,doSomething)

     e.preventDefault()
                                      感兴趣,可以去看看jQuery  
                                      Event模块源码,会有意想
                                           不到的收获
                 规范化的事件订阅
                 规范化的事件处理
                 context重置为当前DOM




12年3月31⽇日星期六
Custom  Events


               button.on(‘myEvent’,doSomething);
               button.trigger(‘myEvent’);




12年3月31⽇日星期六
App




                          Event API
               DOM Events          App Events

                API for everything with events

12年3月31⽇日星期六
事件编程实践



12年3月31⽇日星期六
先来理解事件中的两种角色




12年3月31⽇日星期六
⽣生产者(Producer)




                  提供信息




12年3月31⽇日星期六
消费者(Consumer)




                  接收信息




12年3月31⽇日星期六
Publish-Subscribe
                                Consumer1




          Producer     Topic    Consumer2



         Producer2              Consumer3
                       Topic2


12年3月31⽇日星期六
先来看一个例子




                                    1




                                2



                                        target
               3   滚动条滚动到指定位置
12年3月31⽇日星期六
 单页面
                 N个APP
                 通过应用框架来管理
                 支持配置按需加载




12年3月31⽇日星期六
对于App的要求
           • 可维护性
           • 可扩展性
           • 支持单元测试(部分)
           • 高性能
           • 尽量少的模块依赖
           • App快速接入和下线
12年3月31⽇日星期六
肿么办?

               Event-driven!!!


12年3月31⽇日星期六
Event-driven  Architecture

        Event
                   APP          APP       APP
      Producers


         Event                Event Bus
       Transport         Event Bus

       Event       APP          APP       APP
     Consumers
12年3月31⽇日星期六
Example




12年3月31⽇日星期六
事件流

               通过事件流来解决多个App级联关系




12年3月31⽇日星期六
页面打点



               一次部署,解决后顾之忧




12年3月31⽇日星期六
组件对外的接口



        定义事件名称以及传递的数据格式,暴露给外部




12年3月31⽇日星期六
事件的管理




12年3月31⽇日星期六
使用Event-driven性能怎么样?


               查看Event模块源码,只在第一次进行初始化操作,后
               续事件查找是在cache中,并且不涉及和DOM交互,
               基本事件响应在0~1ms之间




12年3月31⽇日星期六
有思路了么?




                                    1




                                2



                                        target
               3   滚动条滚动到指定位置
12年3月31⽇日星期六
优点
               • 模块的稳定性增强
               • 模块的低耦合度
               • 单模块重构成本低
               • plugin支持良好
               • 易于团队协作以及单模块测试

12年3月31⽇日星期六
问题和挑战
               • 开发人员需要对事件进行抽象,分类和管理
               • 需要处理好事件触发顺序
               • 对于异步的理解



12年3月31⽇日星期六
对事件编程的思考



12年3月31⽇日星期六
还是需要我们多去尝试事件方式的编程,才能挖掘
           潜在的优点。




12年3月31⽇日星期六
谢谢



12年3月31⽇日星期六

Weitere ähnliche Inhalte

Was ist angesagt?

Hibernate查询
Hibernate查询Hibernate查询
Hibernate查询llying
 
jQuery实践经验与技巧
jQuery实践经验与技巧jQuery实践经验与技巧
jQuery实践经验与技巧fangdeng
 
Script with engine
Script with engineScript with engine
Script with engineWebrebuild
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会Joseph Chiang
 
GAE/J 簡介
GAE/J 簡介GAE/J 簡介
GAE/J 簡介Cloud Tu
 
OpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQLOpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQLHung-yu Lin
 

Was ist angesagt? (6)

Hibernate查询
Hibernate查询Hibernate查询
Hibernate查询
 
jQuery实践经验与技巧
jQuery实践经验与技巧jQuery实践经验与技巧
jQuery实践经验与技巧
 
Script with engine
Script with engineScript with engine
Script with engine
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会
 
GAE/J 簡介
GAE/J 簡介GAE/J 簡介
GAE/J 簡介
 
OpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQLOpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQL
 

Andere mochten auch

Html基础培训
Html基础培训Html基础培训
Html基础培训fangdeng
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成fangdeng
 
Javascript正则
Javascript正则Javascript正则
Javascript正则fangdeng
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Jsfangdeng
 
浅尝jQuery
浅尝jQuery浅尝jQuery
浅尝jQueryfangdeng
 
Teaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & TextspeakTeaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & TextspeakShelly Sanchez Terrell
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Andere mochten auch (8)

Html基础培训
Html基础培训Html基础培训
Html基础培训
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
 
Javascript正则
Javascript正则Javascript正则
Javascript正则
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Js
 
浅尝jQuery
浅尝jQuery浅尝jQuery
浅尝jQuery
 
Teaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & TextspeakTeaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & Textspeak
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Ähnlich wie Building an event driven web

管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列Frank Cheung
 
眼高手低的产品设计
眼高手低的产品设计眼高手低的产品设计
眼高手低的产品设计kent zhu
 
基于Spring batch的大数据量并行处理
基于Spring batch的大数据量并行处理基于Spring batch的大数据量并行处理
基于Spring batch的大数据量并行处理Jacky Chi
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现hua qiu
 
Top100summit 芈珺七拼八凑搭建移动自动化测试框架
Top100summit 芈珺七拼八凑搭建移动自动化测试框架Top100summit 芈珺七拼八凑搭建移动自动化测试框架
Top100summit 芈珺七拼八凑搭建移动自动化测试框架drewz lin
 
Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)
Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)
Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)Hiiir Lab
 

Ähnlich wie Building an event driven web (6)

管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列
 
眼高手低的产品设计
眼高手低的产品设计眼高手低的产品设计
眼高手低的产品设计
 
基于Spring batch的大数据量并行处理
基于Spring batch的大数据量并行处理基于Spring batch的大数据量并行处理
基于Spring batch的大数据量并行处理
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现
 
Top100summit 芈珺七拼八凑搭建移动自动化测试框架
Top100summit 芈珺七拼八凑搭建移动自动化测试框架Top100summit 芈珺七拼八凑搭建移动自动化测试框架
Top100summit 芈珺七拼八凑搭建移动自动化测试框架
 
Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)
Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)
Hiiir 營銷講座 營運App的二三事 創造領先App 的必勝手冊 (分享版)
 

Mehr von fangdeng

J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架fangdeng
 
前端单元测试初体验
前端单元测试初体验前端单元测试初体验
前端单元测试初体验fangdeng
 
Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit utfangdeng
 
2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖fangdeng
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考fangdeng
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考fangdeng
 
Postoffer前端架构设计
Postoffer前端架构设计Postoffer前端架构设计
Postoffer前端架构设计fangdeng
 
Varnish简介
Varnish简介Varnish简介
Varnish简介fangdeng
 
Let's talk about date in javascript
Let's talk about  date  in javascriptLet's talk about  date  in javascript
Let's talk about date in javascriptfangdeng
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-developfangdeng
 
方凳良品1期
方凳良品1期方凳良品1期
方凳良品1期fangdeng
 
方凳良品2期
方凳良品2期方凳良品2期
方凳良品2期fangdeng
 
魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式fangdeng
 
Datalazyload
DatalazyloadDatalazyload
Datalazyloadfangdeng
 
Request animateframe初探
Request animateframe初探Request animateframe初探
Request animateframe初探fangdeng
 
简鲜侠Websocket
简鲜侠Websocket简鲜侠Websocket
简鲜侠Websocketfangdeng
 
魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式fangdeng
 
方凳激励体系(试行)
方凳激励体系(试行)方凳激励体系(试行)
方凳激励体系(试行)fangdeng
 
高性能Javascript
高性能Javascript高性能Javascript
高性能Javascriptfangdeng
 

Mehr von fangdeng (20)

J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 
前端单元测试初体验
前端单元测试初体验前端单元测试初体验
前端单元测试初体验
 
Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit ut
 
2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考
 
Postoffer前端架构设计
Postoffer前端架构设计Postoffer前端架构设计
Postoffer前端架构设计
 
Varnish简介
Varnish简介Varnish简介
Varnish简介
 
Websocket
WebsocketWebsocket
Websocket
 
Let's talk about date in javascript
Let's talk about  date  in javascriptLet's talk about  date  in javascript
Let's talk about date in javascript
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
 
方凳良品1期
方凳良品1期方凳良品1期
方凳良品1期
 
方凳良品2期
方凳良品2期方凳良品2期
方凳良品2期
 
魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式
 
Datalazyload
DatalazyloadDatalazyload
Datalazyload
 
Request animateframe初探
Request animateframe初探Request animateframe初探
Request animateframe初探
 
简鲜侠Websocket
简鲜侠Websocket简鲜侠Websocket
简鲜侠Websocket
 
魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式
 
方凳激励体系(试行)
方凳激励体系(试行)方凳激励体系(试行)
方凳激励体系(试行)
 
高性能Javascript
高性能Javascript高性能Javascript
高性能Javascript
 

Building an event driven web