SlideShare a Scribd company logo
1 of 29
jEngine--构建高性能、可监控
      的前端应用框架


   王涛
 2012-03-02
应用框架—解决应用的实际问题

  应用复杂,开发者多,需要引入模块化编程


    需求紧,无遐优化,框架需要真正的 fast by default


     前端代码无日志, 线上故障发现晚, 急需异常监控系统


    单点故障多,可用性不高,应用的容错性要增强


  浏览器多样,调试不便,引入统一的分层log机制
整体框架图

                 延迟加载
                  模块
首屏加载                               延迟初始
 模块                                化模块



       沙箱(core.sandbox.js)

       应用核心(core.application.js)

                FDEV4
https://github.com/wtxidian/jEngine
模块化编程—模块
    模块:




•   模块对整体架构的了解非常有限,它只知道sandbox的存在。


•   每个模块各司其职,共同构建了应用的正常运行。
模块化编程—模块代码示例
!(function($){
      var Sandbox,
       configs = {
            end:0
      };
      function lazyloadModule1(sb) {
                Sandbox = sb;
                return lazyloadModule1;
      }
      $.extend(lazyloadModule1,{
                init:function(cfg){

                      this.config = $.extend(true, {}, configs, cfg);
                      Sandbox.on( Searchweb.Config.Events.DELETE, this.create);
              },

              create:function(data){
                     alert("lazyloadModule1 got the message:" + data.msg);
              },
              end:0
     });
     Searchweb.Business.lazyloadModule1 = lazyloadModule1;
})(jQuery);
模块化编程—模块




    模块必须呆在相应的sandbox中,也许会
    很不舒服,但这对应用是安全的!
模块化编程—模块设计原则

 不要在模块中创建全局变量。


   禁止访问该模块之外的Dom节点。


   只允许调用自身的或是sandbox提供的方法。


   不可直接引用其它模块的对象或调用其方法。



 Sandbox是通往外界的桥梁!
模块化编程—沙箱
• 沙箱负责模块间的数据传递及事件交互




          notify        on

    模块1            沙箱            模块2

          on            notify
模块化编程—沙箱
Module1:
var data={msg:"send from Module1"};
Sandbox.notify (Searchweb.Config.Events.DELETE, data);


Module2:
Sandbox.on ( Searchweb.Config.Events.DELETE, this.callback);
模块化编程—应用核心

 模块生命周期管理        异常处理



      注册
                      容错
                       性
            初始
销毁
             化   监控

                       消除SPOF

 停止        运行
模块化编程—应用核心代码示例
register: function(moduleId, creator, opt){
     moduleData[moduleId] = {
     creator: creator,
     instance: null
     };
},
start: function(moduleId){
     moduleData[moduleId].instance = moduleData[moduleId].creator(new Sandbox(this));
     moduleData[moduleId].instance.init();
},
stop: function(moduleId){
     var data = moduleData[moduleId];
     if (data.instance){
     data.instance.destroy();
     data.instance = null;
     }
}
模块化编程—应用核心代码示例
//注册所有首屏加载模块
AppCore.register("mod-search-module1", Searchweb.Business.Module1);
AppCore.register("mod-search-module2", Searchweb.Business.Module2);
AppCore.register("mod-search-module3", Searchweb.Business.Module3);
AppCore.register(“mod-search-module4”, Searchweb.Business.Module4, {callback:function(){/* */}});

//初始化所有首屏加载模块
AppCore.startAll();



  <div id=“mod-search-module1" data-mod-config=
   '{"name":"title","url":"http://china.alibaba.com/offer/post/json/validate_result.htm"}„>
   …
  </div>
性能提升—Fast By Default
• 在模块管理中加入“懒注册”机制,从框架的层面解决性能
  问题 -- Fast By Default!

            延迟加载
            模块注册
     首屏加载          延迟初始化
     模块注册          模块注册


            模块注册
性能提升—Fast By Default
/**
      *@method: lazyRegister 延迟(加载|初始化)模块注册函数
      * @param: moduleId: 注册模块的名称(string)
      * @param: creator: 模块的构造函数(string|function),如果为string,则会被parse成为function
      * @param: els: 触发延迟加载模块的元素,可以是id、dom、domArray(jquery dom数组对象)
      * @param: event: 延迟加载的驱动事件,可以是曝光事件、dom事件、manual事件{exposure|manual|normal
                 events like: click, mouseover, focus, mouseenter}
      * @param: opt : (optional)延迟加载成功后的回调函数{Object}
*/
lazyRegister: function(moduleId, creator, els, event, opt){

      var succeed = false;
      if(opt.init === false){
                succeed = jEngine.Core.LazyModule.register(els, event, opt);
                }else{
                        var self = this;
                       succeed = jEngine.Core.LazyModule.register(els, event, opt,
                                    function(){self._lazyStart(moduleId, creator)});
                }
                return succeed;
}
性能提升—Fast By Default
lazyLoadModuleInit:function(){

            //曝光延迟加载模块的注册方式
            AppCore .lazyRegister(“mod-search-lazyload1”,
                        “Searchweb.Business.lazyloadModule1”,
                        $(".domDetail"), 'exposure',{
                                   threshold:200,
                                   module:this.config.lazyurl.lazyModule1
          });

           //交互事件驱动延迟加载模块的注册方式
           AppCore .lazyRegister("mod-search-lazyload2",
                       "Searchweb.Business.lazyloadModule2",
                       '#mod-search-lazyload2', 'mouseover',{
                                   module:this.config.lazyurl.lazyModule2
           });

           //使用代码主动触发的延迟加载模块的注册方式 Sandbox.notify("jEngine.lazyLoad", moduleId);
           AppCore.lazyRegister("mod-search-lazyload3",
                      "Searchweb.Business.lazyloadModule3",
                       null, 'manual',{
                                   module:this.config.lazyurl.lazyModule3
           });
},
性能提升—Fast By Default
模块注册的三种方式统一定义在一个文件中:
性能提升—Fast By Default
<html>
    <body>
             … 省略 …

     <!--页面上只应该有一个js文件被放置在<script>标签中加载,其余都是无阻塞加载-->
    <script type=“text/javascript” src=“http://style.china.alibaba.com/js/app/search/v4.0/core/core.seed.js”></script>
        <script>
             jEngine.Core.Loader.js(“http://style.china.alibaba.com/js/lib/fdev-v4/core/fdev-min.js”)
                          .js(“http://style.china.alibaba.com/js/app/search/v4.0/core/core.logger.js”)
                          .js(“http://style.china.alibaba.com/js/app/search/v4.0/core/core.sandbox.js”)
                          .js(“http://style.china.alibaba.com/js/app/search/v4.0/core/core.lazymodule.js”)
                           .js(“http://style.china.alibaba.com/js/app/search/v4.0/core/core.application.js”)
                            //核心类加载完毕,开始加载业务类
                           .js(“http://style.china.alibaba.com/js/app/search/v4.0/example/config.js”)
                           .js(“http://style.china.alibaba.com/js/app/search/v4.0/example/module1.js”)
                           .js(“http://style.china.alibaba.com/js/app/search/v4.0/example/lazyinitmodule.js”)
                           .js(“http://style.china.alibaba.com/js/app/search/v4.0/example/app.start.js”);
        </script>
     </body>
</html>
性能提升—Fast By Default

完美的js加载瀑布图:
便于开发调试—分层log机制
修改自叶周全分层log类,添加了IE下的log机制:
Firefox:




IE:
增强容错性—全局性异常处理
区分线上线下模式的方法:
var DEBUG_MOD = (typeof window.dmtrack ==="undefined") ? true : false;


try{
       …
}
catch (ex) {
            if(!DEBUG_MOD){
                  $.logger.error(“log error message:” + ex.message); //线上模式记录异常
            }else{
                  throw ex; //debug模式下抛异常给浏览器
            }
}
增强容错性—全局性异常处理
 var instance = new module.creator(sb), name, method;
 instance.options = opt;

    //debug模式下try catch不起作用,交由浏览器自己处理错误。
    //online模式下可以把错误信息记录在日志服务器上。
    if (!DEBUG_MOD){
           for (name in instance){
                method = instance[name];
                if (typeof method == "function"){
                       instance[name] = function(name, method){
                           return function (){
                              try {
                                    return method.apply(this, arguments);
                               }
                                catch(ex) {
                                    $.logger.error(moduleId + " throw error: " + name + "()-> " +
    ex.message);                            }
                                         };
                        }(name, method);
                 }
          }
    }
return instance;
增强容错性—全局性异常处理
• 模块中的每个函数都被自动加入到异常处理机制中。

• 线上异常的定位可以非常迅速。
异常监控—与Dragoon的完美结合

//online模式下针对warning和error才需要报警
 if(!DEBUG_MOD){
      if(level == 0 || level == 1){
           (new Image()).src = $.Logger.errorUri + this.getBrowserInfo() + errorMsg;
       }
 }
异常监控—与Dragoon的完美结合
异常监控—与Dragoon的完美结合
• 更加完善的前端异常监控系统
后期完善方向

• 性能优化结合后端的继续深入

• 模块化编程更完善的支持
J engine -构建高性能、可监控的前端应用框架

More Related Content

What's hot

Jdbc中驱动加载的过程分析(上)
Jdbc中驱动加载的过程分析(上)Jdbc中驱动加载的过程分析(上)
Jdbc中驱动加载的过程分析(上)yiditushe
 
JavaScript Code Quality
JavaScript Code QualityJavaScript Code Quality
JavaScript Code QualityJoseph Chiang
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会Joseph Chiang
 
高粒度模块化的前端开发
高粒度模块化的前端开发高粒度模块化的前端开发
高粒度模块化的前端开发iddcn
 
Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1modou li
 
Honey's Data Dinner#7 webpack 包達人(入門)
Honey's Data Dinner#7 webpack 包達人(入門)Honey's Data Dinner#7 webpack 包達人(入門)
Honey's Data Dinner#7 webpack 包達人(入門)beehivedata
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 
Browser vs. Node.js Jackson Tian Shanghai
Browser vs. Node.js   Jackson Tian ShanghaiBrowser vs. Node.js   Jackson Tian Shanghai
Browser vs. Node.js Jackson Tian ShanghaiJackson Tian
 
webpack 入門
webpack 入門webpack 入門
webpack 入門Anna Su
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練Joseph Chiang
 
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染Sheng-Han Su
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kaoxwcoder
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing江華 奚
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVCjeffz
 
2018 8 18_play_framework
2018 8 18_play_framework2018 8 18_play_framework
2018 8 18_play_frameworkLorn Jhu
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile ServicesKuo-Chun Su
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超drewz lin
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Jsfangdeng
 

What's hot (20)

Jdbc中驱动加载的过程分析(上)
Jdbc中驱动加载的过程分析(上)Jdbc中驱动加载的过程分析(上)
Jdbc中驱动加载的过程分析(上)
 
JavaScript Code Quality
JavaScript Code QualityJavaScript Code Quality
JavaScript Code Quality
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会
 
高粒度模块化的前端开发
高粒度模块化的前端开发高粒度模块化的前端开发
高粒度模块化的前端开发
 
Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1Uliweb cheat sheet_0.1
Uliweb cheat sheet_0.1
 
Jsp
JspJsp
Jsp
 
Honey's Data Dinner#7 webpack 包達人(入門)
Honey's Data Dinner#7 webpack 包達人(入門)Honey's Data Dinner#7 webpack 包達人(入門)
Honey's Data Dinner#7 webpack 包達人(入門)
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
Browser vs. Node.js Jackson Tian Shanghai
Browser vs. Node.js   Jackson Tian ShanghaiBrowser vs. Node.js   Jackson Tian Shanghai
Browser vs. Node.js Jackson Tian Shanghai
 
webpack 入門
webpack 入門webpack 入門
webpack 入門
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練
 
Vue
VueVue
Vue
 
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
從改寫後台 jQuery 開始的 Vue.js 宣告式渲染
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kao
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
2018 8 18_play_framework
2018 8 18_play_framework2018 8 18_play_framework
2018 8 18_play_framework
 
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
從 Web Site 到 Web Application,從 Web Services 到 Mobile Services
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Js
 

Viewers also liked

Яндекс.Парковки
Яндекс.ПарковкиЯндекс.Парковки
Яндекс.ПарковкиMikhail Dyachenko
 
Available MCE Courses
Available MCE CoursesAvailable MCE Courses
Available MCE Courseskellymurray63
 
Sejarah rt rw di indonesia
Sejarah rt rw di indonesiaSejarah rt rw di indonesia
Sejarah rt rw di indonesiaheri hermawan
 
Customer delight
Customer delightCustomer delight
Customer delightSree Roy
 
Sejarah rt rw di indonesia
Sejarah rt rw di indonesiaSejarah rt rw di indonesia
Sejarah rt rw di indonesiaheri hermawan
 
古町活性化提案
古町活性化提案古町活性化提案
古町活性化提案hituji_haneta
 
SC History Jeopardy Game
SC History Jeopardy GameSC History Jeopardy Game
SC History Jeopardy GameVicky McLain
 
Le Meridien Coimbatore
Le Meridien CoimbatoreLe Meridien Coimbatore
Le Meridien Coimbatorelemcbe
 
Solar Tower
Solar TowerSolar Tower
Solar Towerhjayan
 

Viewers also liked (16)

Slideshow
SlideshowSlideshow
Slideshow
 
Яндекс.Парковки
Яндекс.ПарковкиЯндекс.Парковки
Яндекс.Парковки
 
Cms TokoDaring Demo
Cms TokoDaring DemoCms TokoDaring Demo
Cms TokoDaring Demo
 
Available MCE Courses
Available MCE CoursesAvailable MCE Courses
Available MCE Courses
 
Kickingtips
KickingtipsKickingtips
Kickingtips
 
Sejarah rt rw di indonesia
Sejarah rt rw di indonesiaSejarah rt rw di indonesia
Sejarah rt rw di indonesia
 
Ps interiors ppt
Ps interiors pptPs interiors ppt
Ps interiors ppt
 
Slideshow
SlideshowSlideshow
Slideshow
 
Remix powerpoint
Remix powerpointRemix powerpoint
Remix powerpoint
 
Customer delight
Customer delightCustomer delight
Customer delight
 
Sejarah rt rw di indonesia
Sejarah rt rw di indonesiaSejarah rt rw di indonesia
Sejarah rt rw di indonesia
 
古町活性化提案
古町活性化提案古町活性化提案
古町活性化提案
 
SC History Jeopardy Game
SC History Jeopardy GameSC History Jeopardy Game
SC History Jeopardy Game
 
Le Meridien Coimbatore
Le Meridien CoimbatoreLe Meridien Coimbatore
Le Meridien Coimbatore
 
p.s interiors
p.s interiorsp.s interiors
p.s interiors
 
Solar Tower
Solar TowerSolar Tower
Solar Tower
 

Similar to J engine -构建高性能、可监控的前端应用框架

Kissy design
Kissy designKissy design
Kissy designyiming he
 
使用kslite支持第三方内容开发
使用kslite支持第三方内容开发使用kslite支持第三方内容开发
使用kslite支持第三方内容开发leneli
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现hua qiu
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejsChi-wen Sun
 
Android 智慧型手機程式設計
Android 智慧型手機程式設計Android 智慧型手機程式設計
Android 智慧型手機程式設計Kyle Lin
 
Backbone.js and MVW 101
Backbone.js and MVW 101Backbone.js and MVW 101
Backbone.js and MVW 101Jollen Chen
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xBo-Yi Wu
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
第十期 阿甘Javascript开发思想(入门篇)
第十期 阿甘Javascript开发思想(入门篇)第十期 阿甘Javascript开发思想(入门篇)
第十期 阿甘Javascript开发思想(入门篇)9scss
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
網站設計100步
網站設計100步網站設計100步
網站設計100步evercislide
 
SeaJS 那些事儿
SeaJS 那些事儿SeaJS 那些事儿
SeaJS 那些事儿lifesinger
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发qingpiao1983
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 

Similar to J engine -构建高性能、可监控的前端应用框架 (20)

Kissy design
Kissy designKissy design
Kissy design
 
使用kslite支持第三方内容开发
使用kslite支持第三方内容开发使用kslite支持第三方内容开发
使用kslite支持第三方内容开发
 
Mvc
MvcMvc
Mvc
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
Android 智慧型手機程式設計
Android 智慧型手機程式設計Android 智慧型手機程式設計
Android 智慧型手機程式設計
 
Backbone.js and MVW 101
Backbone.js and MVW 101Backbone.js and MVW 101
Backbone.js and MVW 101
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
第十期 阿甘Javascript开发思想(入门篇)
第十期 阿甘Javascript开发思想(入门篇)第十期 阿甘Javascript开发思想(入门篇)
第十期 阿甘Javascript开发思想(入门篇)
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
網站設計100步
網站設計100步網站設計100步
網站設計100步
 
SeaJS 那些事儿
SeaJS 那些事儿SeaJS 那些事儿
SeaJS 那些事儿
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 

J engine -构建高性能、可监控的前端应用框架