SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
前端架构、框架与库的实战 周爱民 愚公 aimingoo [email_address] aimingoo.spaces.live.com … .
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
/* please sort first 如果找到返回查找值所在索引 否则返回 -(x+1) ( 插入点  x : , -(x+1)  防止  x=0 的插入点 与 找到的情况矛盾 )) 则判断某值是否存在只需判断 返回值  >=0  即可 */ Array.prototype.binarySearch = function(v){ var l = 0; var h = this.length-1; while (l<=h) { // 注:位操作 javascript 不一定提高效率 var m = (l+h)>>>1; if (this[m]===v) { return m; } if (this[m]>v) { h = m-1; } else { l = m+1; } } return -(l+1); }
 
function( url ) { with (new XMLHttpRequest()) return open(&quot;GET&quot;,  url , false), send(null),  responseText ; }
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
function HttpGetMachine () { Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); this. OnStateChange  = TMachineStateChange; THttpGetMachine = Class(TObject, 'HttpGetMachine'); var  onreadystatechange  = function() { var xmlHttp = this.get('XMLHTTP'); this.OnStateChange(xmlHttp.readyState); … var  doStateChange  = function(state) { … } this.Create = function() { this.data = null; this.pool = null; this. OnStateChange .add( doStateChange ); this.set(‘XMLHTTP’, …).onreadystatechange =  onreadysta… … } ? ?
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object]
THttpRequest = Class(TObject, function() { Attribute(this, 'XMLHTTPOBJECT', 'MSXML2.XMLHTTP', 'rw'); Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); Attribute(this, 'format', 'TEXT', 'r');  // 'XML',‘BODY‘, … Attribute(this, 'async', false, 'r');  // user, pass, … … this. OnSetRequestHeader  = NullFunction; this. OnResponse  = NullFunction; Attribute(this, ' _open ', function(ajx, args) { ajx. open (this.get('METHOD'), args[0], this.get('async'),… this. OnSetRequestHeader (ajx, args); }, 'r'); Attribute(this, ' _send ', function(ajx, args) { ajx. send (); }, 'r'); Attribute(this, ' _resp ', function(resp, url, fmt) { var FMT = {XML: 'responseXML', TEXT: 'responseText', …}; var data = resp[FMT[fmt]]; this. OnResponse (url, {format: fmt, data: data}); return data; }, 'r');
var doRequest = function(url) {  // [,data] // $assert(!this.get('async'), ['need not async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); this.get(' _send ').call(this, xmlHttp, arguments); this.get(' _resp ').call(this, xmlHttp, …); } var  getResult  = function(url) { return doRequest.apply(this, arguments); } this.Create = function() { var AJAX = this.get('XMLHTTPOBJECT'); this.set('XMLHTTP', (typeof AJAX=='function') ? new AJAX() : new ActiveXObject(AJAX)); this. getResult  =  getResult ; } });
THttpRequestAsync = Class(THttpRequest, function() { var  onreadystatechange  = function(url, state) { if (state == 4) { this.get(' _resp ').call(this, xmlHttp, …); … var _changer = function(req, url) { return function() { req. OnReadyStateChange (url,  …); … var doRequest = function(url) {  // [,data] // $assert(this.get('async'), ['need async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); xmlHttp.onreadystatechange  = _changer(this, url); this.get(' _send ').call(this, xmlHttp, arguments); } this.OnReadyStateChange = NullFunction; this.Create = function() { this.inherited(); this.getResult = …; // rewrite, call doRequest this. OnReadyStateChange .add( onreadystatechange ); } });
IHttpRequestAsync = function() { this.getResult =  this.OnResponse = this.OnSetRequestHeader = this.OnReadyStateChange  = Abstract } IHttpRequest = function() { this.getResult =  this.OnResponse = this.OnSetRequestHeader = Abstract }
function _POST() { _set('METHOD', 'POST'); _set('_send', function(ajx, args) { ajx.send(args[1] || '') }); } } /* this.Create = function() { … */ } THttpPost = Class(THttpRequest, _POST); THttpPostAsync = Class(THttpRequestAsync, _POST);
// IHttpGet = IHttpPost = IHttpRequest THttpGet = Class(THttpRequest, NullFunction); THttpPost = Class(THttpRequest, _POST); // IHttpGetAsync = IHttpPostAsync = IHttpRequestAsync THttpGetAsync = Class(THttpRequestAsync, NullFunction); THttpPostAsync = Class(THttpRequestAsync, _POST); THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
[object Object],[object Object],[object Object],[object Object],[object Object]
 
浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息
浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息 ssreader.exe HTTPAnalyzer Monitor.js Filter.js ProcessesPool.js SSGetter.js
/* a Framework for the system! /__events__. fire-onMonitorUpdate_in_HTA  ______ SSGetter.js _____   __|__ ||  /   /     /   _  monitor  ->  filter  -> onGetDownloadItem -> downIt ->  pool .push--* */
TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine
TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
THttpGetMachine HttpGet HttpPost HttpMachine TMachine TRequestMachine TPdgHttpGetMachine
function Machine() { Attribute(this, 'Core', null, 'rw'); this.sleep = function() { this.OnStateChange('sleep'); } this.stop = function() { this.get('Core').stop(); this.sleep(); } …
function RequestMachine() { var doStateChange = function(state) { if (state=='resume') { this.get('Core').getResult( … );  // src, data } } this.Create = function(cls) { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', cls.Create(this)); } }
function PdgHttpGetMachine() { var doQueryExist = function(state) { if (state == 'resume') … } this.getStatus = function() { return this.get('Core').get('XMLHTTP').status; } this.Create = function() { this.OnStateChange.add(doQueryExist); this.inherited('Create', Class(THttpGetAsyncMac, …)); } }
IRequestMachine = function() { // IMachine based } IMachine = function() { //  this.data = //  this.pool = null; this.sleep =  this.stop = this.OnStateChange = Abstract; } IPdgHttpGetMachine = function() { // IMachine based this.getStatus = Abstract }
1 * 1 1 THttpRequest TMachine TRequestMachine TPool THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync TPdgHttpGetMachine Core
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
输入层 调度层 处理层 ssreader.exe HTTPAnalyzer Monitor.js ProcessesPool.js TPool SSGetter.js Filter.js User-Request Batch Push MergeAndOutput
识别类 TObject 处理类 TMachine pool.push( data ) pool.OnRequireNew( mac ) pool.OnStateChange( mac , data ) pool.stop() 处理层 输入层 调度层 数据类 TObject TPool.Create( MacClass ) 调度类 TPool
function PoolApp() { Attribute(this, ‘pool’); Attribute(this, ‘watcher’); this.start = function() { this.get(‘watcher’).start();   } // Create(PoolClass, WatchClass, MachineClass); this.Create = function(P,W,M) { this.set(‘watch’, W.Create()).pool =  this.set(‘pool’, P.Create(M)); } }
IPool = function() { this.push = Abstract; // push(data) this.stop = Abstract; // stop() this.OnStateChange = Abstract; // OnStateChange(mac,data) this.Create = Abstract;  // Create(MachineClass) } IWatch = function() { //  this.pool = null; this.start = Abstract; // start() }
data = { src: …, param: … }; function MyWatch() { this.start = function() { this.pool.push(data)); } function MyMachine(cls) { var doStateChange = function(state) { if (state == ‘resume’) this.get(‘Core’). process (this.data)) } this.Create = function() { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', { process : function(data) { alert(data.src) } }); }); }
app = TPooledApp.Create( TPool, Class(TObject, ‘MyWatch’), Class(TMachine, ‘MyMachine’) ); app.start();
 
[object Object],[object Object],[object Object],[object Object],[object Object]
 
 
End.

Weitere ähnliche Inhalte

Was ist angesagt?

Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++corehard_by
 
Propuesta..sujei
Propuesta..sujeiPropuesta..sujei
Propuesta..sujeigersonjack
 
Шаблоны проектирования 2
Шаблоны проектирования 2Шаблоны проектирования 2
Шаблоны проектирования 2Constantin Kichinsky
 
آموزش ساختمان گسسته با رویکرد حل مساله
آموزش ساختمان گسسته با رویکرد حل مسالهآموزش ساختمان گسسته با رویکرد حل مساله
آموزش ساختمان گسسته با رویکرد حل مسالهfaradars
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRAMBLER&Co
 
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6Technopark
 
Java Script - Object-Oriented Programming
Java Script - Object-Oriented ProgrammingJava Script - Object-Oriented Programming
Java Script - Object-Oriented Programmingintive
 
Java лаб13
Java лаб13Java лаб13
Java лаб13Enkhee99
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorFedor Lavrentyev
 
Lightning talk second
Lightning talk secondLightning talk second
Lightning talk secondShinUsuda
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0zfconfua
 

Was ist angesagt? (14)

Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++
 
Propuesta..sujei
Propuesta..sujeiPropuesta..sujei
Propuesta..sujei
 
Шаблоны проектирования 2
Шаблоны проектирования 2Шаблоны проектирования 2
Шаблоны проектирования 2
 
Osmose
OsmoseOsmose
Osmose
 
آموزش ساختمان گسسته با رویکرد حل مساله
آموزش ساختمان گسسته با رویکرد حل مسالهآموزش ساختمان گسسته با رویکرد حل مساله
آموزش ساختمان گسسته با رویکرد حل مساله
 
Project
ProjectProject
Project
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6
 
Java Script - Object-Oriented Programming
Java Script - Object-Oriented ProgrammingJava Script - Object-Oriented Programming
Java Script - Object-Oriented Programming
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
 
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
 
Lightning talk second
Lightning talk secondLightning talk second
Lightning talk second
 
JQuery
JQueryJQuery
JQuery
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
 

Andere mochten auch

386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台Rui (Nash) Yang
 
511 香港树为母婴跨境电商
511 香港树为母婴跨境电商511 香港树为母婴跨境电商
511 香港树为母婴跨境电商Rui (Nash) Yang
 
Ripple支付技术
Ripple支付技术Ripple支付技术
Ripple支付技术jingping yi
 
The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716Payoneer
 
514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书Rui (Nash) Yang
 
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构勇浩 赖
 
移动客户端恶意行为分析系统
移动客户端恶意行为分析系统移动客户端恶意行为分析系统
移动客户端恶意行为分析系统正炎 高
 
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版liu sheng
 
高性能Web应用缓存架构设计浅谈
高性能Web应用缓存架构设计浅谈高性能Web应用缓存架构设计浅谈
高性能Web应用缓存架构设计浅谈Alvin Qi
 
20160315内刊投稿(刘胜)区块链研究综述v1.1.0331
20160315内刊投稿(刘胜)区块链研究综述v1.1.033120160315内刊投稿(刘胜)区块链研究综述v1.1.0331
20160315内刊投稿(刘胜)区块链研究综述v1.1.0331liu sheng
 
Scala the-good-parts
Scala the-good-partsScala the-good-parts
Scala the-good-partsFuqiang Wang
 
小さなお店(実店舗)のためのWeb集客セミナー
小さなお店(実店舗)のためのWeb集客セミナー小さなお店(実店舗)のためのWeb集客セミナー
小さなお店(実店舗)のためのWeb集客セミナーEbisui Kazunori
 
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, HadoopMonitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, HadoopSenthil Pandurangan
 
API Token 入門
API Token 入門API Token 入門
API Token 入門Andrew Wu
 
DWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPalDWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPalIDATE DigiWorld
 
Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129Junichi Okamura
 
DevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureDevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureAntons Kranga
 
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践美团点评技术团队
 
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...Premier Inc.
 

Andere mochten auch (20)

386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台
 
511 香港树为母婴跨境电商
511 香港树为母婴跨境电商511 香港树为母婴跨境电商
511 香港树为母婴跨境电商
 
Ripple支付技术
Ripple支付技术Ripple支付技术
Ripple支付技术
 
The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716
 
514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书
 
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
 
移动客户端恶意行为分析系统
移动客户端恶意行为分析系统移动客户端恶意行为分析系统
移动客户端恶意行为分析系统
 
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
 
高性能Web应用缓存架构设计浅谈
高性能Web应用缓存架构设计浅谈高性能Web应用缓存架构设计浅谈
高性能Web应用缓存架构设计浅谈
 
20160315内刊投稿(刘胜)区块链研究综述v1.1.0331
20160315内刊投稿(刘胜)区块链研究综述v1.1.033120160315内刊投稿(刘胜)区块链研究综述v1.1.0331
20160315内刊投稿(刘胜)区块链研究综述v1.1.0331
 
Scala the-good-parts
Scala the-good-partsScala the-good-parts
Scala the-good-parts
 
小さなお店(実店舗)のためのWeb集客セミナー
小さなお店(実店舗)のためのWeb集客セミナー小さなお店(実店舗)のためのWeb集客セミナー
小さなお店(実店舗)のためのWeb集客セミナー
 
Open Source Projects
Open Source ProjectsOpen Source Projects
Open Source Projects
 
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, HadoopMonitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
 
API Token 入門
API Token 入門API Token 入門
API Token 入門
 
DWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPalDWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPal
 
Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129
 
DevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureDevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless Architecture
 
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
 
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
 

Mehr von 裕波 周

web标准化交流会上海站bobby分享
web标准化交流会上海站bobby分享web标准化交流会上海站bobby分享
web标准化交流会上海站bobby分享裕波 周
 
web标准化交流会bobby分享
web标准化交流会bobby分享web标准化交流会bobby分享
web标准化交流会bobby分享裕波 周
 
前端架构漫谈
前端架构漫谈前端架构漫谈
前端架构漫谈裕波 周
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型裕波 周
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型裕波 周
 
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild裕波 周
 
彪叔 [2010]webrebuild
彪叔 [2010]webrebuild彪叔 [2010]webrebuild
彪叔 [2010]webrebuild裕波 周
 
Scrum敏捷项目管理
Scrum敏捷项目管理Scrum敏捷项目管理
Scrum敏捷项目管理裕波 周
 
移动设备web重构
移动设备web重构移动设备web重构
移动设备web重构裕波 周
 
重温网站重构
重温网站重构重温网站重构
重温网站重构裕波 周
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构裕波 周
 
《一专多长》——Twinsen[梁璟彪]
《一专多长》——Twinsen[梁璟彪]《一专多长》——Twinsen[梁璟彪]
《一专多长》——Twinsen[梁璟彪]裕波 周
 
浏览器兼容性问题简介 --- 黄昊
浏览器兼容性问题简介 --- 黄昊浏览器兼容性问题简介 --- 黄昊
浏览器兼容性问题简介 --- 黄昊裕波 周
 
揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍裕波 周
 
网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭裕波 周
 
分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军裕波 周
 
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当裕波 周
 

Mehr von 裕波 周 (18)

web标准化交流会上海站bobby分享
web标准化交流会上海站bobby分享web标准化交流会上海站bobby分享
web标准化交流会上海站bobby分享
 
web标准化交流会bobby分享
web标准化交流会bobby分享web标准化交流会bobby分享
web标准化交流会bobby分享
 
前端架构漫谈
前端架构漫谈前端架构漫谈
前端架构漫谈
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild
 
彪叔 [2010]webrebuild
彪叔 [2010]webrebuild彪叔 [2010]webrebuild
彪叔 [2010]webrebuild
 
Scrum敏捷项目管理
Scrum敏捷项目管理Scrum敏捷项目管理
Scrum敏捷项目管理
 
移动设备web重构
移动设备web重构移动设备web重构
移动设备web重构
 
重温网站重构
重温网站重构重温网站重构
重温网站重构
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
 
Ie9 overview
Ie9 overviewIe9 overview
Ie9 overview
 
《一专多长》——Twinsen[梁璟彪]
《一专多长》——Twinsen[梁璟彪]《一专多长》——Twinsen[梁璟彪]
《一专多长》——Twinsen[梁璟彪]
 
浏览器兼容性问题简介 --- 黄昊
浏览器兼容性问题简介 --- 黄昊浏览器兼容性问题简介 --- 黄昊
浏览器兼容性问题简介 --- 黄昊
 
揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍
 
网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭
 
分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军
 
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当
 

从问题开始,前端,架构、框架与库的实战

  • 1. 前端架构、框架与库的实战 周爱民 愚公 aimingoo [email_address] aimingoo.spaces.live.com … .
  • 2.
  • 3.
  • 4. /* please sort first 如果找到返回查找值所在索引 否则返回 -(x+1) ( 插入点 x : , -(x+1) 防止 x=0 的插入点 与 找到的情况矛盾 )) 则判断某值是否存在只需判断 返回值 >=0 即可 */ Array.prototype.binarySearch = function(v){ var l = 0; var h = this.length-1; while (l<=h) { // 注:位操作 javascript 不一定提高效率 var m = (l+h)>>>1; if (this[m]===v) { return m; } if (this[m]>v) { h = m-1; } else { l = m+1; } } return -(l+1); }
  • 5.  
  • 6. function( url ) { with (new XMLHttpRequest()) return open(&quot;GET&quot;, url , false), send(null), responseText ; }
  • 7.
  • 8. function HttpGetMachine () { Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); this. OnStateChange = TMachineStateChange; THttpGetMachine = Class(TObject, 'HttpGetMachine'); var onreadystatechange = function() { var xmlHttp = this.get('XMLHTTP'); this.OnStateChange(xmlHttp.readyState); … var doStateChange = function(state) { … } this.Create = function() { this.data = null; this.pool = null; this. OnStateChange .add( doStateChange ); this.set(‘XMLHTTP’, …).onreadystatechange = onreadysta… … } ? ?
  • 9.
  • 10.
  • 11. THttpRequest = Class(TObject, function() { Attribute(this, 'XMLHTTPOBJECT', 'MSXML2.XMLHTTP', 'rw'); Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); Attribute(this, 'format', 'TEXT', 'r'); // 'XML',‘BODY‘, … Attribute(this, 'async', false, 'r'); // user, pass, … … this. OnSetRequestHeader = NullFunction; this. OnResponse = NullFunction; Attribute(this, ' _open ', function(ajx, args) { ajx. open (this.get('METHOD'), args[0], this.get('async'),… this. OnSetRequestHeader (ajx, args); }, 'r'); Attribute(this, ' _send ', function(ajx, args) { ajx. send (); }, 'r'); Attribute(this, ' _resp ', function(resp, url, fmt) { var FMT = {XML: 'responseXML', TEXT: 'responseText', …}; var data = resp[FMT[fmt]]; this. OnResponse (url, {format: fmt, data: data}); return data; }, 'r');
  • 12. var doRequest = function(url) { // [,data] // $assert(!this.get('async'), ['need not async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); this.get(' _send ').call(this, xmlHttp, arguments); this.get(' _resp ').call(this, xmlHttp, …); } var getResult = function(url) { return doRequest.apply(this, arguments); } this.Create = function() { var AJAX = this.get('XMLHTTPOBJECT'); this.set('XMLHTTP', (typeof AJAX=='function') ? new AJAX() : new ActiveXObject(AJAX)); this. getResult = getResult ; } });
  • 13. THttpRequestAsync = Class(THttpRequest, function() { var onreadystatechange = function(url, state) { if (state == 4) { this.get(' _resp ').call(this, xmlHttp, …); … var _changer = function(req, url) { return function() { req. OnReadyStateChange (url, …); … var doRequest = function(url) { // [,data] // $assert(this.get('async'), ['need async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); xmlHttp.onreadystatechange = _changer(this, url); this.get(' _send ').call(this, xmlHttp, arguments); } this.OnReadyStateChange = NullFunction; this.Create = function() { this.inherited(); this.getResult = …; // rewrite, call doRequest this. OnReadyStateChange .add( onreadystatechange ); } });
  • 14. IHttpRequestAsync = function() { this.getResult = this.OnResponse = this.OnSetRequestHeader = this.OnReadyStateChange = Abstract } IHttpRequest = function() { this.getResult = this.OnResponse = this.OnSetRequestHeader = Abstract }
  • 15. function _POST() { _set('METHOD', 'POST'); _set('_send', function(ajx, args) { ajx.send(args[1] || '') }); } } /* this.Create = function() { … */ } THttpPost = Class(THttpRequest, _POST); THttpPostAsync = Class(THttpRequestAsync, _POST);
  • 16. // IHttpGet = IHttpPost = IHttpRequest THttpGet = Class(THttpRequest, NullFunction); THttpPost = Class(THttpRequest, _POST); // IHttpGetAsync = IHttpPostAsync = IHttpRequestAsync THttpGetAsync = Class(THttpRequestAsync, NullFunction); THttpPostAsync = Class(THttpRequestAsync, _POST); THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
  • 17.
  • 18.  
  • 19. 浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息
  • 20. 浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息 ssreader.exe HTTPAnalyzer Monitor.js Filter.js ProcessesPool.js SSGetter.js
  • 21. /* a Framework for the system! /__events__. fire-onMonitorUpdate_in_HTA ______ SSGetter.js _____ __|__ || / / / _ monitor -> filter -> onGetDownloadItem -> downIt -> pool .push--* */
  • 22. TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine
  • 23. TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
  • 24. THttpGetMachine HttpGet HttpPost HttpMachine TMachine TRequestMachine TPdgHttpGetMachine
  • 25. function Machine() { Attribute(this, 'Core', null, 'rw'); this.sleep = function() { this.OnStateChange('sleep'); } this.stop = function() { this.get('Core').stop(); this.sleep(); } …
  • 26. function RequestMachine() { var doStateChange = function(state) { if (state=='resume') { this.get('Core').getResult( … ); // src, data } } this.Create = function(cls) { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', cls.Create(this)); } }
  • 27. function PdgHttpGetMachine() { var doQueryExist = function(state) { if (state == 'resume') … } this.getStatus = function() { return this.get('Core').get('XMLHTTP').status; } this.Create = function() { this.OnStateChange.add(doQueryExist); this.inherited('Create', Class(THttpGetAsyncMac, …)); } }
  • 28. IRequestMachine = function() { // IMachine based } IMachine = function() { // this.data = // this.pool = null; this.sleep = this.stop = this.OnStateChange = Abstract; } IPdgHttpGetMachine = function() { // IMachine based this.getStatus = Abstract }
  • 29. 1 * 1 1 THttpRequest TMachine TRequestMachine TPool THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync TPdgHttpGetMachine Core
  • 30.
  • 31.  
  • 32. 输入层 调度层 处理层 ssreader.exe HTTPAnalyzer Monitor.js ProcessesPool.js TPool SSGetter.js Filter.js User-Request Batch Push MergeAndOutput
  • 33. 识别类 TObject 处理类 TMachine pool.push( data ) pool.OnRequireNew( mac ) pool.OnStateChange( mac , data ) pool.stop() 处理层 输入层 调度层 数据类 TObject TPool.Create( MacClass ) 调度类 TPool
  • 34. function PoolApp() { Attribute(this, ‘pool’); Attribute(this, ‘watcher’); this.start = function() { this.get(‘watcher’).start(); } // Create(PoolClass, WatchClass, MachineClass); this.Create = function(P,W,M) { this.set(‘watch’, W.Create()).pool = this.set(‘pool’, P.Create(M)); } }
  • 35. IPool = function() { this.push = Abstract; // push(data) this.stop = Abstract; // stop() this.OnStateChange = Abstract; // OnStateChange(mac,data) this.Create = Abstract; // Create(MachineClass) } IWatch = function() { // this.pool = null; this.start = Abstract; // start() }
  • 36. data = { src: …, param: … }; function MyWatch() { this.start = function() { this.pool.push(data)); } function MyMachine(cls) { var doStateChange = function(state) { if (state == ‘resume’) this.get(‘Core’). process (this.data)) } this.Create = function() { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', { process : function(data) { alert(data.src) } }); }); }
  • 37. app = TPooledApp.Create( TPool, Class(TObject, ‘MyWatch’), Class(TMachine, ‘MyMachine’) ); app.start();
  • 38.  
  • 39.
  • 40.  
  • 41.  
  • 42. End.

Hinweis der Redaktion

  1. 关于架构的三句话 http://v.ku6.com/show/4CzbEQbFHlG0YaVs.html http://aimingoo.spaces.live.com/ 为脚本语言平反 (2)(3) http://blog.csdn.net/aimingoo/archive/2009/09/08/4532496.aspx http://blog.csdn.net/aimingoo/archive/2009/09/08/4532567.aspx