基于 virtual-dom 的前端框架
框架分为两部分
mcore
模板引擎(Core), 无依赖,支持(IE6+)mcoreApp
SPA(单页应用)框架,依赖jQuery
,mcore
支持(IE6+)
注:开发时,依赖 webpack 及 h2svd-loader
webpack 配置
//webpack.config.jsvar webpack = ;// h2svd-loader;moduleexports =...module:loaders:// 引入 html 转 mcore virtual-dom 的 loadertest: /\/tpl\/.*$/loader: 'h2svd-loader';
mcore 模板引擎
原理
渲染流程
template=>start: Template: 模板引擎 render=>operation: @render Html, scope virtualDomDefine=>operation: Html -> Virtual Dom define 依赖:h2svd-loader(开发时,通过 webpack 实现) newVirtualDomDefine=>operation: new virtual dom = (Virtual Dom define)(scope) checkOldVirtualDom=>condition: 是否存在 old virtual dom diffVirtualDom=>operation: diff VirtualDom changeNode=>end: 应用变更到 dom buildNode=>end: 生成 dom template->render->virtualDomDefine->newVirtualDomDefine->checkOldVirtualDomcheckOldVirtualDom(no)->buildNodecheckOldVirtualDom(yes)->diffVirtualDom->changeNode
component 实现流程
virtualDomDefine=>start: Virtual Dom definebuild=>operation: build Virtual DomfindNodeTagName=>condition: find Template.components[Node.tagName]buildNode=>end: 生成 dombuildComponent=>end: new Template.components[Node.tagName] virtualDomDefine->build->findNodeTagNamefindNodeTagName(yes)->buildComponentfindNodeTagName(no)->buildNode
diff VirtualDom 时,component 当成没有子树的 Node (只 diff 属性), component 的 dom 变更,由 component 自身维护
DEMO
模板中,变量都在
scope
名字空间下 (事件除外)
<!-- ./tpl/test.html -->{v.name}
# demo.coffeerequire 'mcore'# init tpltpl =# bind click event=consolelog velevent# rendertplrender require'./tpl/test.html'list:name : 'ok1'name : 'ok2'-> # rendereddocumentbodyappendChild tplrefs
binders 自定义属性
require 'mcore'=el.style.color = value
Apply
components 自定义组件
require 'mcore': ->@on 'rendered'=>setTimeout =>@set 'time'1000@render require'./tpl/tagTime.html'time:Template.components.time = Time
<!-- ./tpl/tagTime.html -->{scope.time}
formatters 过滤函数
require 'mcore'=momentvalueformNow=String value or ''
{scope.date | formNow | toString }