SlideShare una empresa de Scribd logo
1 de 44
Template-Based
Modular Architecture
Advanced JavaScript
genify(caijf@corp)
Content
• Modular
• Module
• Template
• Dispatcher
• Case Study
• Deployment
Modular
• Features
– Independence
– Composability
– Decomposability
– Replaceability
Modular
• Advantages
– Several programmers can work on individual
programs at the same time, thus, making
development of program faster
– Concerns are separated such that modules
perform logically discrete functions
– The code base is easier to debug, update and
modify
Content
• Modular
• Module
• Template
• Dispatcher
• Deployment
Module
• Elements
– CSS
– HTML
– JAVASCRIPT
Module
• Encapsulation
– DSL
– JavaScript
– Html
[@STYLE]
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
[/@STYLE]
[@HTML]
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
[/@HTML]
[@SCRIPT]
var a = 'aaaaa';
var b = 'bbbbb';
[/@SCRIPT]
var style = '
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
';
var html = '
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
';
(function(){
var a = 'aaaaaaa';
var b = 'bbbbbbb';
// TODO
})();
<style>
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
</style>
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
<script>
var a = 'aaaaa';
var b = 'bbbbb';
// TODO
</script>
Module
• Encapsulation
<style>
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
</style>
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
<script>
var a = 'aaaaa';
var b = 'bbbbb';
// TODO
</script>
<textarea name="css">
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
</textarea>
<textarea name="html">
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
</textarea>
<textarea name="js">
var a = 'aaaaa';
var b = 'bbbbb';
// TODO
</textarea>
Content
• Modular
• Module
• Template
• Dispatcher
• Case Study
• Deployment
Template
• Import Style
<style>
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
</style>
<link rel="stylesheet"
type="text/css"
href="http://b.126.net/r/c.css"/>
<textarea name="css">
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
</textarea>
<textarea name="css"
data-src="http://b.126.net/r/c.css">
</textarea>
<textarea name="css"
data-src="http://b.126.net/r/c.css">
.m-test a{color:#aaa;}
.m-test b{color:#bbb;}
</textarea>
Template
• Import Script
<script>
var a = 'aaaaa';
var b = 'bbbbb';
</script>
<script src="http://b.126.net/r/c.js"></script>
<textarea name="js">
var a = 'aaaaa';
var b = 'bbbbb';
</textarea>
<textarea name="js"
data-src="http://b.126.net/r/c.js">
</textarea>
<textarea name="js"
data-src="http://b.126.net/r/c.js">
var a = 'aaaaa';
var b = 'bbbbb';
</textarea>
Template
• Import html
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
<textarea name="txt" id="txt-test-html">
<div class="m-test">
<span class="a">aaaaaaaaaaaa</span>
<span class="b">bbbbbbbbbbbb</span>
</div>
</textarea>
<textarea name="jst" id="jst-test-html">
<div class="m-test">
<span class="a">${x.a}</span>
<span class="b">${x.b}</span>
</div>
</textarea>
<textarea name="ntp" id="ntp-test-html">
<div class="m-test">
<span class="a"></span>
<span class="b"></span>
</div>
</textarea>
<textarea name="html"
data-src="/pub/module/widget.html">
</textarea>
Template
<meta charset="utf-8"/>
<textarea name="txt" id="m-ifrm-module">
<div class="n-login">
<div class="iner j-flag">
<span class="cls j-flag">×</span>
<span class="min j-flag">-</span>
</div>
<div class="cnt j-cnt"></div>
</div>
</textarea>
<!-- @TEMPLATE -->
<textarea name="js" data-src="./index.css"></textarea>
<textarea name="js" data-src="./index.js"></textarea>
<!-- /@TEMPLATE -->
Content
• Modular
• Module
• Template
• Dispatcher
• Case Study
• Deployment
Dispatcher
Dispatcher
• Principle
Blog
BlogList BlogTags
Setting
Account
Profile EduExp
Permission
SystemA
B C
D E F G
H I
System
Blog Setting
BlogList BlogTags Account Permission
Profile EduExp
Dispatcher
• UMI
– Uniform Module Identifier
– Format
• Path of URI,e.g. /m/m0/
• Begin with “/”
• Begin with“/?”if private module
– Dependency
• e.g. parent of “/m/m0/”and “/m/m1/”is “/m”
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
• UMI
– Split Dependency by UMI
Blog
BlogList BlogTags
Setting
Account
Profile EduExp
Permission
System
Dispatcher
Dispatcher
• UMI
– Mapping UMI to Module
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
System
Blog Setting
BlogList BlogTags
Account
PermissionProfile
EduExp
BlogList
/m/blog/list/
Dispatcher
• UMI
– Mapping UMI to html
BlogList
<style> …
<html> …
<script> …
module.html
BlogList
/m/blog/list/
Dispatcher
• UMI
– Mapping UMI to html
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
module/frame.html
module/blog/frame.html module/setting/frame.html
module/blog/list.html
module/setting/account/frame.html
module/setting/account/edu.html
Dispatcher
• Strategy
– dispatch to /m/blog/list/
• Check action
• Load or Dispatch
• Waiting Loaded Callback
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
Dispatcher
• Strategy
– dispatch to /m/setting/account/
• Find common root
• Hide : source -> common
• Refresh : root -> common
• Show : common -> target
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
Dispatcher
• Module Type
Module-I Module-I
Module-II Module-II
Dispatcher
• Composite
Module-aa
Module-aa-b2
Module-aa-b1 Module-aa-b3
'/m':{
module:'module/frame/frame/index.html',
composite:{
onrefresh:{
top:'/?/frame/top/',
side:'/?/frame/side/'
},
onshow:{
lyric:'/?/frame/foot/lyric/',
player:'/?/frame/foot/player/',
detailtag:'/?/frame/detailtag/'
}
}
}
Dispatcher
• Message Channel
– Pointer to Pointer m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
this.__doSendMessage(
'/m/setting/account/',
{d:'ddddd',e:'eeeeee'}
);
_proModuleAccountProfile.__onMessage = function(_event){
console.log(
'receive message from '+
_event.from+' and say: '+
JSON.stringify(_event.data)
);
};
Dispatcher
• Message Channel
– Publish and Subscribe
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ /
this.__doPublishMessage(
'onok',{a:'aaaa',b:'bbbbb'}
);
this.__doSubscribeMessage(
'/m/setting/account/','onok',
this.__onSubscribe._$bind(this)
);
this.__doSubscribeMessage(
'/m/setting/account/','onok',
this.__onSubscribe._$bind(this)
);
Content
• Modular
• Module
• Template
• Dispatcher
• Case Study
• Deployment
Case Study
Case Study
• System Decomposition
Blog
BlogList BlogTags
Setting
Account
Profile EduExp
Permission
System
m
blog
list tag/
setting
/ account permission
/ edu
/
/
/
/ // / /
/
/
m
blog setting
account
Case Study
• System Decomposition
收件箱切换
类别列表
标签列表日志列表
?
blog
tag listbox
/
/ /
class
/ //?/blog/box//?/blog/tag//?/blog/list//?/blog/class/
Case Study
• Module Development
Case Study
• Module Development
<meta charset="utf-8"/>
<textarea name="txt" id="module-id-2">
<div class="mdl-2">
<div class="lbx js-flag"></div>
<div class="pgr js-flag"></div>
</div>
</textarea>
<textarea name="jst" id="jst-2-blog-list">
{list beg..end as y}
{var x=xlist[y]}
<div class="w-bit">
<div class="f-cb">
<p class="fl ztl"><a href="#">${x.title}</a></p>
<div class="fr xat">
<a href="#">编辑</a>
<a href="#">删除</a>
</div>
</div>
<p class="inf">
<span>${x.publishTime|format:'yyyy-MM-dd HH:mm'
<span>阅读(${x.accessCount})</span>
<span>评论(${x.commentCount})</span>
</p>
</div>
{/list}
</textarea>
<!-- @TEMPLATE -->
<textarea name="css" data-src="./index.css"></textarea>
<textarea name="js" data-src="./index.js"></textarea>
<!-- /@TEMPLATE -->
Case Study
• Module Development
_$$AbstractModule
__doBuild
__onShow
__onHide
__onRefresh
/**
* 构建模块
* @return {Void}
*/
_pro.__doBuild = function(){
this.__body = _e._$html2node(
_e._$getTextTemplate('module-id-2')
);
// 0 - list box
// 1 - pager box
var _list = _e._$getByClassName(this.__body,'js-flag');
this.__mopt = {
limit:15,
parent:_list[0],
item:'jst-2-blog-list',
cache:{klass:_d._$$CacheBlog},
pager:{clazz:'w-pager',parent:_list[1]},
onbeforelistload:this.__onLoadingShow._$bind(this),
onemptylist:this.__onMessageShow._$bind(this,'没有日志列表!')
};
};
/**
* 显示模块触发事件,子类实现具体逻辑
* @param {Object} 事件对象
* @return {Void}
*/
_pro.__onShow = function(_options){
var _parent = this.__doParseParent(_options);
// show and refresh module
if (!!_parent&&!!this.__body)
_parent.appendChild(this.__body);
this.__supOnShow(_options);
this.__doApplyComposite('onshow',_options);
this.__onRefresh(_options);
};
/**
* 隐藏模块触发事件,子类实现具体逻辑
* @return {Void}
*/
_pro.__onHide = function(){
this.__supOnHide();
this.__doHideComposite();
_e._$removeByEC(this.__body);
};
/**
* 刷新模块
* @param {Object} 配置信息
* @return {Void}
*/
_pro.__onRefresh = (function(){
var _doParseCKey = function(_param){
if (!!_param.cid)
return 'class-'+_param.cid;
if (!!_param.tid)
return 'tag-'+_param.tid;
return 'box-'+(_param.box||1);
};
return function(_options){
this.__supOnRefresh(_options);
if (this.__lmdl) this.__lmdl._$recycle();
this.__mopt.cache.lkey = _doParseCKey(_options.param||_o);
this.__lmdl = _t._$$ListModulePG._$allocate(this.__mopt);
};
})();
_e._$regist('blog-list',_p._$$ModuleBlogList);
Case Study
• Module Test
<!-- template box -->
<div id="template-box" style="display:none;">
<textarea name="html" data-src="../index.html"></textarea>
</div>
<script>
define(['{lib}util/dispatcher/test.js'],
function(){
// test module
document.mbody = 'module-id-0';
NEJ.P('nej.e')._$testByTemplate('template-box');
});
</script>
Case Study
• System Composition
<script>
define(['{lib}util/dispatcher/dispatcher.2.js'],
function(){
var _ = NEJ.P;
/* start up dispatcher */
_('nej.e')._$startup({
rules:{...},
modules:{...}
});
});
</script>
rules:{
rewrite:{
'404':'/m/blog/list/',
'/m/blog/list/':'/m/blog/',
'/m/setting/account/':'/m/setting/'
},
title:{
'/m/blog/tag/':'日志标签',
'/m/blog/list/':'日志列表',
'/m/setting/permission/':'权限管理',
'/m/setting/account/':'基本资料',
'/m/setting/account/edu/':'教育经历'
},
alias:{
'system-tab':'/?/tab/',
'blog-tab':'/?/blog/tab/',
'blog-list-box':'/?/blog/box/',
'blog-list-tag':'/?/blog/tag/',
'blog-list-class':'/?/blog/class/',
'blog-list':'/?/blog/list/',
'setting-tab':'/?/setting/tab/',
'setting-account-tab':'/?/setting/account/tab/',
'layout-system':'/m',
'layout-blog':'/m/blog',
'layout-blog-list':'/m/blog/list/',
'layout-setting':'/m/setting',
'layout-setting-account':'/m/setting/account',
'blog-tag':'/m/blog/tag/',
'setting-edu':'/m/setting/account/edu/',
'setting-profile':'/m/setting/account/',
'setting-permission':'/m/setting/permission/'
}
}
modules:{
'/?/tab/':'module/tab/index.html',
'/?/blog/tab/':'module/blog/tab/index.html',
'/?/blog/box/':'module/blog/list.box/index.html',
'/?/blog/tag/':'module/blog/list.tag/index.html',
'/?/blog/class/':'module/blog/list.class/index.html',
'/?/blog/list/':'module/blog/list/index.html',
'/?/setting/tab/':'module/setting/tab/index.html',
'/?/setting/account/tab/':'module/setting/account.tab/index.h
'/m':{
module:'module/layout/system/index.html',
composite:{
tab:'/?/tab/'
}
},
'/m/blog':{
module:'module/layout/blog/index.html',
composite:{
tab:'/?/blog/tab/'
}
},
'/m/blog/list/':{
module:'module/layout/blog.list/index.html',
composite:{
box:'/?/blog/box/',
tag:'/?/blog/tag/',
list:'/?/blog/list/',
clazz:'/?/blog/class/'
}
},
'/m/blog/tag/':'module/blog/tag/index.html',
'/m/setting':{
module:'module/layout/setting/index.html',
composite:{
tab:'/?/setting/tab/'
}
},
Content
• Modular
• Module
• Template
• Dispatcher
• Case Study
• Deployment
Deployment
• Publisher
– NodeJS
– NEJ-Publisher
– Project Configuration
– do release
Deployment
• Performance Improvement
<div id="template-box" style="display:none;">
<!-- @TEMPLATE -->
<textarea name="html" data-src="module/tab/index.html"></textarea>
<textarea name="html" data-src="module/blog/tab/index.html"></textarea>
<textarea name="html" data-src="module/blog/list.box/index.html"></textarea>
<textarea name="html" data-src="module/blog/list.tag/index.html"></textarea>
<textarea name="html" data-src="module/blog/list.class/index.html"></textarea>
<textarea name="html" data-src="module/layout/system/index.html"></textarea>
<textarea name="html" data-src="module/layout/blog/index.html"></textarea>
<textarea name="html" data-src="module/layout/blog.list/index.html"></textarea>
<textarea name="html" data-src="module/layout/setting/index.html"></textarea>
<textarea name="html" data-src="module/layout/setting.account/index.html"></textarea>
<textarea name="html" data-src="module/blog/tag/index.html"></textarea>
<textarea name="html" data-src="module/blog/list/index.html"></textarea>
<textarea name="html" data-src="module/setting/tab/index.html"></textarea>
<textarea name="html" data-src="module/setting/account.tab/index.html"></textarea>
<!-- /@TEMPLATE -->
</div>
Deployment
• Performance Improvement
<div id="template-box" style="display:none;">
<!-- @MODULE -->
<textarea name="html" data-src="module/tab/index.html"></textarea>
<textarea name="html" data-src="module/blog/tab/index.html"></textarea>
<textarea name="html" data-src="module/blog/list.box/index.html"></textarea>
<textarea name="html" data-src="module/blog/list.tag/index.html"></textarea>
<textarea name="html" data-src="module/blog/list.class/index.html"></textarea>
<textarea name="html" data-src="module/layout/system/index.html"></textarea>
<textarea name="html" data-src="module/layout/blog/index.html"></textarea>
<textarea name="html" data-src="module/layout/blog.list/index.html"></textarea>
<textarea name="html" data-src="module/layout/setting/index.html"></textarea>
<textarea name="html" data-src="module/layout/setting.account/index.html"></textarea>
<textarea name="html" data-src="module/blog/tag/index.html"></textarea>
<textarea name="html" data-src="module/blog/list/index.html"></textarea>
<textarea name="html" data-src="module/setting/tab/index.html"></textarea>
<textarea name="html" data-src="module/setting/account.tab/index.html"></textarea>
<!-- /@MODULE -->
</div>
Deployment
• Performance Improvement
<!-- @TEMPLATE -->
<textarea name="html" data-src="./blog/tab/index.html"></textarea>
<textarea name="html" data-src="./blog/tag/index.html"></textarea>
<textarea name="html" data-src="./blog/list/index.html"></textarea>
<textarea name="html" data-src="./blog/list.box/index.html"></textarea>
<textarea name="html" data-src="./blog/list.tag/index.html"></textarea>
<textarea name="html" data-src="./blog/list.class/index.html"></textarea>
<!-- /@TEMPLATE -->
modules:{
'/?/tab/':'module/tab/index.html',
'/?/blog/tab/':'module/blog.html',
'/?/blog/box/':'module/blog.html',
'/?/blog/tag/':'module/blog.html',
'/?/blog/class/':'module/blog.html',
'/?/blog/list/':'module/blog.html',
'/?/setting/tab/':'module/setting.html',
'/?/setting/account/tab/':'module/setting.html',
DEMO
Q&A
Thank You !

Más contenido relacionado

La actualidad más candente

New text document
New text documentNew text document
New text documentsingaqq
 
Java Web Development with Stripes
Java Web Development with StripesJava Web Development with Stripes
Java Web Development with StripesSamuel Santos
 
Drupal Javascript for developers
Drupal Javascript for developersDrupal Javascript for developers
Drupal Javascript for developersDream Production AG
 
Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в MagentoMagecom Ukraine
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012ghnash
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQLddiers
 
CSS- Smacss Design Rule
CSS- Smacss Design RuleCSS- Smacss Design Rule
CSS- Smacss Design Rule皮馬 頑
 
Vue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentówVue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentówLaravel Poland MeetUp
 

La actualidad más candente (12)

Stripes Framework
Stripes FrameworkStripes Framework
Stripes Framework
 
New text document
New text documentNew text document
New text document
 
Java Web Development with Stripes
Java Web Development with StripesJava Web Development with Stripes
Java Web Development with Stripes
 
Pfnp slides
Pfnp slidesPfnp slides
Pfnp slides
 
Hibernate
HibernateHibernate
Hibernate
 
Drupal Javascript for developers
Drupal Javascript for developersDrupal Javascript for developers
Drupal Javascript for developers
 
Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в Magento
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
Insertcustomer
InsertcustomerInsertcustomer
Insertcustomer
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQL
 
CSS- Smacss Design Rule
CSS- Smacss Design RuleCSS- Smacss Design Rule
CSS- Smacss Design Rule
 
Vue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentówVue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentów
 

Similar a Template-based Modular Architecture

Elinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkej
Elinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkejElinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkej
Elinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkejPertti Paavola
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overviewYehuda Katz
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
Spca2014 hillier 3rd party_javascript_libraries
Spca2014 hillier 3rd party_javascript_librariesSpca2014 hillier 3rd party_javascript_libraries
Spca2014 hillier 3rd party_javascript_librariesNCCOMMS
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Joao Lucas Santana
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshowsblackman
 
Building Potent WordPress Websites
Building Potent WordPress WebsitesBuilding Potent WordPress Websites
Building Potent WordPress WebsitesKyle Cearley
 
Gaurav Jatav , BCA Third Year
Gaurav Jatav , BCA Third YearGaurav Jatav , BCA Third Year
Gaurav Jatav , BCA Third YearDezyneecole
 
AEM Sightly Template Language
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template LanguageGabriel Walt
 
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...Jeremy Fuksa
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From IusethisMarcus Ramberg
 
Copy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plazaCopy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plazahelgawerth
 
The project gutenberg e book, fairy tales from brazil, by elsie spicer
The project gutenberg e book, fairy tales from brazil, by elsie spicerThe project gutenberg e book, fairy tales from brazil, by elsie spicer
The project gutenberg e book, fairy tales from brazil, by elsie spicerAndrei Hortúa
 
AngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.jsAngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.jsMark
 
Your Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckYour Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckAnthony Montalbano
 

Similar a Template-based Modular Architecture (20)

Bootstrap
BootstrapBootstrap
Bootstrap
 
WIT lab programs.docx
WIT lab programs.docxWIT lab programs.docx
WIT lab programs.docx
 
Elinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkej
Elinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkejElinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkej
Elinvoimaa hunajasta-yleist-hunajatietoa-ja-kyttvinkkej
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Spca2014 hillier 3rd party_javascript_libraries
Spca2014 hillier 3rd party_javascript_librariesSpca2014 hillier 3rd party_javascript_libraries
Spca2014 hillier 3rd party_javascript_libraries
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshow
 
Test upload
Test uploadTest upload
Test upload
 
Sightly - Part 2
Sightly - Part 2Sightly - Part 2
Sightly - Part 2
 
Building Potent WordPress Websites
Building Potent WordPress WebsitesBuilding Potent WordPress Websites
Building Potent WordPress Websites
 
Upload[1]
Upload[1]Upload[1]
Upload[1]
 
Gaurav Jatav , BCA Third Year
Gaurav Jatav , BCA Third YearGaurav Jatav , BCA Third Year
Gaurav Jatav , BCA Third Year
 
AEM Sightly Template Language
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template Language
 
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
Copy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plazaCopy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plaza
 
The project gutenberg e book, fairy tales from brazil, by elsie spicer
The project gutenberg e book, fairy tales from brazil, by elsie spicerThe project gutenberg e book, fairy tales from brazil, by elsie spicer
The project gutenberg e book, fairy tales from brazil, by elsie spicer
 
AngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.jsAngularJS vs. Ember.js vs. Backbone.js
AngularJS vs. Ember.js vs. Backbone.js
 
Your Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckYour Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages Suck
 

Último

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfayushiqss
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburgmasabamasaba
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsBert Jan Schrijver
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationShrmpro
 

Último (20)

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 

Template-based Modular Architecture

  • 2. Content • Modular • Module • Template • Dispatcher • Case Study • Deployment
  • 3. Modular • Features – Independence – Composability – Decomposability – Replaceability
  • 4. Modular • Advantages – Several programmers can work on individual programs at the same time, thus, making development of program faster – Concerns are separated such that modules perform logically discrete functions – The code base is easier to debug, update and modify
  • 5. Content • Modular • Module • Template • Dispatcher • Deployment
  • 6. Module • Elements – CSS – HTML – JAVASCRIPT
  • 7. Module • Encapsulation – DSL – JavaScript – Html [@STYLE] .m-test a{color:#aaa;} .m-test b{color:#bbb;} [/@STYLE] [@HTML] <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> [/@HTML] [@SCRIPT] var a = 'aaaaa'; var b = 'bbbbb'; [/@SCRIPT] var style = ' .m-test a{color:#aaa;} .m-test b{color:#bbb;} '; var html = ' <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> '; (function(){ var a = 'aaaaaaa'; var b = 'bbbbbbb'; // TODO })(); <style> .m-test a{color:#aaa;} .m-test b{color:#bbb;} </style> <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> <script> var a = 'aaaaa'; var b = 'bbbbb'; // TODO </script>
  • 8. Module • Encapsulation <style> .m-test a{color:#aaa;} .m-test b{color:#bbb;} </style> <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> <script> var a = 'aaaaa'; var b = 'bbbbb'; // TODO </script> <textarea name="css"> .m-test a{color:#aaa;} .m-test b{color:#bbb;} </textarea> <textarea name="html"> <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> </textarea> <textarea name="js"> var a = 'aaaaa'; var b = 'bbbbb'; // TODO </textarea>
  • 9. Content • Modular • Module • Template • Dispatcher • Case Study • Deployment
  • 10. Template • Import Style <style> .m-test a{color:#aaa;} .m-test b{color:#bbb;} </style> <link rel="stylesheet" type="text/css" href="http://b.126.net/r/c.css"/> <textarea name="css"> .m-test a{color:#aaa;} .m-test b{color:#bbb;} </textarea> <textarea name="css" data-src="http://b.126.net/r/c.css"> </textarea> <textarea name="css" data-src="http://b.126.net/r/c.css"> .m-test a{color:#aaa;} .m-test b{color:#bbb;} </textarea>
  • 11. Template • Import Script <script> var a = 'aaaaa'; var b = 'bbbbb'; </script> <script src="http://b.126.net/r/c.js"></script> <textarea name="js"> var a = 'aaaaa'; var b = 'bbbbb'; </textarea> <textarea name="js" data-src="http://b.126.net/r/c.js"> </textarea> <textarea name="js" data-src="http://b.126.net/r/c.js"> var a = 'aaaaa'; var b = 'bbbbb'; </textarea>
  • 12. Template • Import html <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> <textarea name="txt" id="txt-test-html"> <div class="m-test"> <span class="a">aaaaaaaaaaaa</span> <span class="b">bbbbbbbbbbbb</span> </div> </textarea> <textarea name="jst" id="jst-test-html"> <div class="m-test"> <span class="a">${x.a}</span> <span class="b">${x.b}</span> </div> </textarea> <textarea name="ntp" id="ntp-test-html"> <div class="m-test"> <span class="a"></span> <span class="b"></span> </div> </textarea> <textarea name="html" data-src="/pub/module/widget.html"> </textarea>
  • 13. Template <meta charset="utf-8"/> <textarea name="txt" id="m-ifrm-module"> <div class="n-login"> <div class="iner j-flag"> <span class="cls j-flag">×</span> <span class="min j-flag">-</span> </div> <div class="cnt j-cnt"></div> </div> </textarea> <!-- @TEMPLATE --> <textarea name="js" data-src="./index.css"></textarea> <textarea name="js" data-src="./index.js"></textarea> <!-- /@TEMPLATE -->
  • 14. Content • Modular • Module • Template • Dispatcher • Case Study • Deployment
  • 16. Dispatcher • Principle Blog BlogList BlogTags Setting Account Profile EduExp Permission SystemA B C D E F G H I System Blog Setting BlogList BlogTags Account Permission Profile EduExp
  • 17. Dispatcher • UMI – Uniform Module Identifier – Format • Path of URI,e.g. /m/m0/ • Begin with “/” • Begin with“/?”if private module – Dependency • e.g. parent of “/m/m0/”and “/m/m1/”is “/m”
  • 18. m blog list tag/ setting / account permission / edu / / / / / • UMI – Split Dependency by UMI Blog BlogList BlogTags Setting Account Profile EduExp Permission System Dispatcher
  • 19. Dispatcher • UMI – Mapping UMI to Module m blog list tag/ setting / account permission / edu / / / / / System Blog Setting BlogList BlogTags Account PermissionProfile EduExp BlogList /m/blog/list/
  • 20. Dispatcher • UMI – Mapping UMI to html BlogList <style> … <html> … <script> … module.html BlogList /m/blog/list/
  • 21. Dispatcher • UMI – Mapping UMI to html m blog list tag/ setting / account permission / edu / / / / / module/frame.html module/blog/frame.html module/setting/frame.html module/blog/list.html module/setting/account/frame.html module/setting/account/edu.html
  • 22. Dispatcher • Strategy – dispatch to /m/blog/list/ • Check action • Load or Dispatch • Waiting Loaded Callback m blog list tag/ setting / account permission / edu / / / / /
  • 23. Dispatcher • Strategy – dispatch to /m/setting/account/ • Find common root • Hide : source -> common • Refresh : root -> common • Show : common -> target m blog list tag/ setting / account permission / edu / / / / /
  • 24. Dispatcher • Module Type Module-I Module-I Module-II Module-II
  • 26. Dispatcher • Message Channel – Pointer to Pointer m blog list tag/ setting / account permission / edu / / / / / this.__doSendMessage( '/m/setting/account/', {d:'ddddd',e:'eeeeee'} ); _proModuleAccountProfile.__onMessage = function(_event){ console.log( 'receive message from '+ _event.from+' and say: '+ JSON.stringify(_event.data) ); };
  • 27. Dispatcher • Message Channel – Publish and Subscribe m blog list tag/ setting / account permission / edu / / / / / this.__doPublishMessage( 'onok',{a:'aaaa',b:'bbbbb'} ); this.__doSubscribeMessage( '/m/setting/account/','onok', this.__onSubscribe._$bind(this) ); this.__doSubscribeMessage( '/m/setting/account/','onok', this.__onSubscribe._$bind(this) );
  • 28. Content • Modular • Module • Template • Dispatcher • Case Study • Deployment
  • 30. Case Study • System Decomposition Blog BlogList BlogTags Setting Account Profile EduExp Permission System m blog list tag/ setting / account permission / edu / / / / // / / / / m blog setting account
  • 31. Case Study • System Decomposition 收件箱切换 类别列表 标签列表日志列表 ? blog tag listbox / / / class / //?/blog/box//?/blog/tag//?/blog/list//?/blog/class/
  • 32. Case Study • Module Development
  • 33. Case Study • Module Development <meta charset="utf-8"/> <textarea name="txt" id="module-id-2"> <div class="mdl-2"> <div class="lbx js-flag"></div> <div class="pgr js-flag"></div> </div> </textarea> <textarea name="jst" id="jst-2-blog-list"> {list beg..end as y} {var x=xlist[y]} <div class="w-bit"> <div class="f-cb"> <p class="fl ztl"><a href="#">${x.title}</a></p> <div class="fr xat"> <a href="#">编辑</a> <a href="#">删除</a> </div> </div> <p class="inf"> <span>${x.publishTime|format:'yyyy-MM-dd HH:mm' <span>阅读(${x.accessCount})</span> <span>评论(${x.commentCount})</span> </p> </div> {/list} </textarea> <!-- @TEMPLATE --> <textarea name="css" data-src="./index.css"></textarea> <textarea name="js" data-src="./index.js"></textarea> <!-- /@TEMPLATE -->
  • 34. Case Study • Module Development _$$AbstractModule __doBuild __onShow __onHide __onRefresh /** * 构建模块 * @return {Void} */ _pro.__doBuild = function(){ this.__body = _e._$html2node( _e._$getTextTemplate('module-id-2') ); // 0 - list box // 1 - pager box var _list = _e._$getByClassName(this.__body,'js-flag'); this.__mopt = { limit:15, parent:_list[0], item:'jst-2-blog-list', cache:{klass:_d._$$CacheBlog}, pager:{clazz:'w-pager',parent:_list[1]}, onbeforelistload:this.__onLoadingShow._$bind(this), onemptylist:this.__onMessageShow._$bind(this,'没有日志列表!') }; }; /** * 显示模块触发事件,子类实现具体逻辑 * @param {Object} 事件对象 * @return {Void} */ _pro.__onShow = function(_options){ var _parent = this.__doParseParent(_options); // show and refresh module if (!!_parent&&!!this.__body) _parent.appendChild(this.__body); this.__supOnShow(_options); this.__doApplyComposite('onshow',_options); this.__onRefresh(_options); }; /** * 隐藏模块触发事件,子类实现具体逻辑 * @return {Void} */ _pro.__onHide = function(){ this.__supOnHide(); this.__doHideComposite(); _e._$removeByEC(this.__body); }; /** * 刷新模块 * @param {Object} 配置信息 * @return {Void} */ _pro.__onRefresh = (function(){ var _doParseCKey = function(_param){ if (!!_param.cid) return 'class-'+_param.cid; if (!!_param.tid) return 'tag-'+_param.tid; return 'box-'+(_param.box||1); }; return function(_options){ this.__supOnRefresh(_options); if (this.__lmdl) this.__lmdl._$recycle(); this.__mopt.cache.lkey = _doParseCKey(_options.param||_o); this.__lmdl = _t._$$ListModulePG._$allocate(this.__mopt); }; })(); _e._$regist('blog-list',_p._$$ModuleBlogList);
  • 35. Case Study • Module Test <!-- template box --> <div id="template-box" style="display:none;"> <textarea name="html" data-src="../index.html"></textarea> </div> <script> define(['{lib}util/dispatcher/test.js'], function(){ // test module document.mbody = 'module-id-0'; NEJ.P('nej.e')._$testByTemplate('template-box'); }); </script>
  • 36. Case Study • System Composition <script> define(['{lib}util/dispatcher/dispatcher.2.js'], function(){ var _ = NEJ.P; /* start up dispatcher */ _('nej.e')._$startup({ rules:{...}, modules:{...} }); }); </script> rules:{ rewrite:{ '404':'/m/blog/list/', '/m/blog/list/':'/m/blog/', '/m/setting/account/':'/m/setting/' }, title:{ '/m/blog/tag/':'日志标签', '/m/blog/list/':'日志列表', '/m/setting/permission/':'权限管理', '/m/setting/account/':'基本资料', '/m/setting/account/edu/':'教育经历' }, alias:{ 'system-tab':'/?/tab/', 'blog-tab':'/?/blog/tab/', 'blog-list-box':'/?/blog/box/', 'blog-list-tag':'/?/blog/tag/', 'blog-list-class':'/?/blog/class/', 'blog-list':'/?/blog/list/', 'setting-tab':'/?/setting/tab/', 'setting-account-tab':'/?/setting/account/tab/', 'layout-system':'/m', 'layout-blog':'/m/blog', 'layout-blog-list':'/m/blog/list/', 'layout-setting':'/m/setting', 'layout-setting-account':'/m/setting/account', 'blog-tag':'/m/blog/tag/', 'setting-edu':'/m/setting/account/edu/', 'setting-profile':'/m/setting/account/', 'setting-permission':'/m/setting/permission/' } } modules:{ '/?/tab/':'module/tab/index.html', '/?/blog/tab/':'module/blog/tab/index.html', '/?/blog/box/':'module/blog/list.box/index.html', '/?/blog/tag/':'module/blog/list.tag/index.html', '/?/blog/class/':'module/blog/list.class/index.html', '/?/blog/list/':'module/blog/list/index.html', '/?/setting/tab/':'module/setting/tab/index.html', '/?/setting/account/tab/':'module/setting/account.tab/index.h '/m':{ module:'module/layout/system/index.html', composite:{ tab:'/?/tab/' } }, '/m/blog':{ module:'module/layout/blog/index.html', composite:{ tab:'/?/blog/tab/' } }, '/m/blog/list/':{ module:'module/layout/blog.list/index.html', composite:{ box:'/?/blog/box/', tag:'/?/blog/tag/', list:'/?/blog/list/', clazz:'/?/blog/class/' } }, '/m/blog/tag/':'module/blog/tag/index.html', '/m/setting':{ module:'module/layout/setting/index.html', composite:{ tab:'/?/setting/tab/' } },
  • 37. Content • Modular • Module • Template • Dispatcher • Case Study • Deployment
  • 38. Deployment • Publisher – NodeJS – NEJ-Publisher – Project Configuration – do release
  • 39. Deployment • Performance Improvement <div id="template-box" style="display:none;"> <!-- @TEMPLATE --> <textarea name="html" data-src="module/tab/index.html"></textarea> <textarea name="html" data-src="module/blog/tab/index.html"></textarea> <textarea name="html" data-src="module/blog/list.box/index.html"></textarea> <textarea name="html" data-src="module/blog/list.tag/index.html"></textarea> <textarea name="html" data-src="module/blog/list.class/index.html"></textarea> <textarea name="html" data-src="module/layout/system/index.html"></textarea> <textarea name="html" data-src="module/layout/blog/index.html"></textarea> <textarea name="html" data-src="module/layout/blog.list/index.html"></textarea> <textarea name="html" data-src="module/layout/setting/index.html"></textarea> <textarea name="html" data-src="module/layout/setting.account/index.html"></textarea> <textarea name="html" data-src="module/blog/tag/index.html"></textarea> <textarea name="html" data-src="module/blog/list/index.html"></textarea> <textarea name="html" data-src="module/setting/tab/index.html"></textarea> <textarea name="html" data-src="module/setting/account.tab/index.html"></textarea> <!-- /@TEMPLATE --> </div>
  • 40. Deployment • Performance Improvement <div id="template-box" style="display:none;"> <!-- @MODULE --> <textarea name="html" data-src="module/tab/index.html"></textarea> <textarea name="html" data-src="module/blog/tab/index.html"></textarea> <textarea name="html" data-src="module/blog/list.box/index.html"></textarea> <textarea name="html" data-src="module/blog/list.tag/index.html"></textarea> <textarea name="html" data-src="module/blog/list.class/index.html"></textarea> <textarea name="html" data-src="module/layout/system/index.html"></textarea> <textarea name="html" data-src="module/layout/blog/index.html"></textarea> <textarea name="html" data-src="module/layout/blog.list/index.html"></textarea> <textarea name="html" data-src="module/layout/setting/index.html"></textarea> <textarea name="html" data-src="module/layout/setting.account/index.html"></textarea> <textarea name="html" data-src="module/blog/tag/index.html"></textarea> <textarea name="html" data-src="module/blog/list/index.html"></textarea> <textarea name="html" data-src="module/setting/tab/index.html"></textarea> <textarea name="html" data-src="module/setting/account.tab/index.html"></textarea> <!-- /@MODULE --> </div>
  • 41. Deployment • Performance Improvement <!-- @TEMPLATE --> <textarea name="html" data-src="./blog/tab/index.html"></textarea> <textarea name="html" data-src="./blog/tag/index.html"></textarea> <textarea name="html" data-src="./blog/list/index.html"></textarea> <textarea name="html" data-src="./blog/list.box/index.html"></textarea> <textarea name="html" data-src="./blog/list.tag/index.html"></textarea> <textarea name="html" data-src="./blog/list.class/index.html"></textarea> <!-- /@TEMPLATE --> modules:{ '/?/tab/':'module/tab/index.html', '/?/blog/tab/':'module/blog.html', '/?/blog/box/':'module/blog.html', '/?/blog/tag/':'module/blog.html', '/?/blog/class/':'module/blog.html', '/?/blog/list/':'module/blog.html', '/?/setting/tab/':'module/setting.html', '/?/setting/account/tab/':'module/setting.html',
  • 42. DEMO
  • 43. Q&A