SlideShare a Scribd company logo
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 !

More Related Content

What's hot

Stripes Framework
Stripes FrameworkStripes Framework
Stripes Framework
Johannes Carlén
 
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 Stripes
Samuel Santos
 
Pfnp slides
Pfnp slidesPfnp slides
Pfnp slides
William Myers
 
Hibernate
HibernateHibernate
Hibernate
Leonardo Passos
 
Drupal Javascript for developers
Drupal Javascript for developersDrupal Javascript for developers
Drupal Javascript for developers
Dream 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_2012
ghnash
 
Insertcustomer
InsertcustomerInsertcustomer
Insertcustomer
amirthalingam m
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQL
ddiers
 
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
Laravel Poland MeetUp
 

What's hot (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 to Template-based Modular Architecture

Bootstrap
BootstrapBootstrap
Bootstrap
Sarvesh Kushwaha
 
WIT lab programs.docx
WIT lab programs.docxWIT lab programs.docx
WIT lab programs.docx
jashmithakakavakam
 
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 Websites
Kyle Cearley
 
Gaurav Jatav , BCA Third Year
Gaurav Jatav , BCA Third YearGaurav Jatav , BCA Third Year
Gaurav Jatav , BCA Third Year
Dezyneecole
 
AEM Sightly Template Language
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template Language
Gabriel 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 Iusethis
Marcus 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.js
Mark
 
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 to 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
 

Recently uploaded

GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 

Recently uploaded (20)

GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 

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