{"id":19916880,"url":"https://github.com/rubylouvre/mmtemplate","last_synced_at":"2025-10-18T10:23:54.854Z","repository":{"id":4313732,"uuid":"5447020","full_name":"RubyLouvre/mmTemplate","owner":"RubyLouvre","description":"我的前后端通用模板，既可以自动变成jQuery插件,也可以单独为一个前端模板,亦可以是独立的node.js模板","archived":false,"fork":false,"pushed_at":"2013-07-26T00:04:39.000Z","size":267,"stargazers_count":13,"open_issues_count":0,"forks_count":18,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-07T11:51:26.005Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RubyLouvre.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-08-17T02:08:33.000Z","updated_at":"2019-08-13T15:07:48.000Z","dependencies_parsed_at":"2022-08-29T17:10:22.761Z","dependency_job_id":null,"html_url":"https://github.com/RubyLouvre/mmTemplate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RubyLouvre%2FmmTemplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RubyLouvre%2FmmTemplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RubyLouvre%2FmmTemplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RubyLouvre%2FmmTemplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RubyLouvre","download_url":"https://codeload.github.com/RubyLouvre/mmTemplate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252154732,"owners_count":21702982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T21:47:53.933Z","updated_at":"2025-10-18T10:23:54.796Z","avatar_url":"https://github.com/RubyLouvre.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"mmTemplate\n===\n\n我的前后端通用模板，既可以自动变成jQuery插件,也可以单独为一个前端模板,亦可以是独立的node.js模板\n\n前端默认是使用\u003c\u0026 \u0026\u003e做定界符\n后端默认是使用\u003c% %\u003e做定界符\n\n\u003cstrong\u003e过滤器的使用\u003c/strong\u003e，它只能出现\u003c%= \u003c\u0026这样的左定界符内，操作对象是字符串，数组等， 我们在它后面跟一个“|”当分隔符，后面跟过滤器的名字。\n过滤器都定义在ejs.filters之内，现在已赠送escape，unescape这两个处理字符串的过滤器，相实就我是我的lang模块的\n$.String.escapeHTML与$.String.unescapeHTML。\n\u003cpre\u003e\n\u0026lt;\u0026= \"\u0026lt;aaaa\u0026gt;\" | escape  \u0026\u0026gt;\n\u003c/pre\u003e\n\n\u003cstrong\u003e视图helper的使用\u003c/strong\u003e，它相当于一种独立的函数，但它通常由框架提供的与action紧密相连的辅助方法。目的是将大量的业务代码移出模板，实现重用。它会在编译时一起写进模板中\n\n如\n\u003cpre\u003e\nvar set_link = function(text, url){\n  return '\u0026lt;a href=\"'+url+'\"\u0026gt;'+text +'\u0026lt;/a\u0026gt;';\n}\n\nvar fn = ejs.compile(source, {\n  helpers:{\n      set_link: set_link\n   }\n})\n\u003c/pre\u003e\n那么我们就可以直接在模板中使用此方法\n\u003cpre\u003e\n\u0026lt;\u0026= set_link(\"rubylouvre\",\"http://www.cnblogs.com/rubylouvre/\") %\u0026gt;\n\u003c/pre\u003e\n\u003ch3\u003e \"-\"操作符的使用\u003c/h3\u003e\n\u003cp\u003e见下面模板\u003c/p\u003e\n\u003cpre\u003e\n\u0026lt;%- for(var i=0, tl = @trs.length, tr; i \u0026lt; tl; i++){ -%\u0026gt;\n   \u0026lt;- tr = @trs[i] -\u0026gt;\n   \u0026lt;tr\u0026gt;\n     \u0026lt;td\u0026gt;\u0026lt;%= tr.name %\u0026gt;\u0026lt;/td\u0026gt;\u0026lt;td\u0026gt;\u0026lt;%= tr.sex %\u0026gt;\u0026lt;/td\u0026gt;\u0026lt;td\u0026gt;\u0026lt;%= tr.date %\u0026gt;\u0026lt;/td\u0026gt;\n   \u0026lt;/tr\u0026gt;\n\u0026lt;%- } -%\u0026gt;\n\u003c/pre\u003e\n\u003cp\u003e如果不使用-操作符,那么生成的HTML会在原\u003c% %\u003e之间的地方出现大块的空白,用了它就会削掉它们,保证HTML的干净,这是从rails的ERB模块引入的语法.\u003c/p\u003e\n\n\u003ch3\u003e模板的编译函数的缓存\u003c/h3\u003e\n\u003cp\u003e在前端我们可以通过选择器来缓存模板,比如\u003c/p\u003e\n\u003cpre\u003e\nvar html = ejs(\"#js_tmpl\", {\n   aaa:\"xxx\",\n   bbb:[1,2,3,4]\n})\n\u003c/pre\u003e\n\u003cp\u003e它的第一个参数是CSS选择器，如果你是用jQuery或mass Framework，你可以使用jQuery的任意表达式(mass Framework完全兼容jQuery的自定义伪类)，\n如果你没有使用框架，它会尝试用querySelectorAll来寻找元素，否则它使用getElementById找元素，当然它在这之前会去掉最前的#\u003c/p\u003e\n\u003cp\u003e总之，在前端它是使用第一个参数做模板的键，与编译好的函数作为一个键值对放在ejs.cache中\u003c/p\u003e\n\u003cp\u003e在后端，我们可以利用第三个参数的tid作为模板的键\u003c/p\u003e\n\u003cpre\u003e\nvar html = ejs(source, {\n   aaa:\"xxx\",\n   bbb:[1,2,3,4]\n},{tid:\"first_tmpl\"})\n\u003c/pre\u003e\n\n\u003ch3\u003e子模板的使用或layout的指定\u003ch3\u003e\n\u003cp\u003e它们都是使用视图helper实现的，比如我们用include函数作为引入子模板的函数\u003c/p\u003e\n\u003cpre\u003e\nvar fn = ejs(source, data, {\n  helpers:{\n     include: ejs\n   }\n})\n\u003c/pre\u003e\n\u003cp\u003e至于指定layout,可以详看我的newlandjs的set_layout方法与位于/app/views/...中的使用示例\u003c/p\u003e\n\n\n\n\u003cp\u003e吸收Tj大神的ejs模块的全部优点（向Tj致敬），如准确定位错误与模板套嵌。本模板不使用with与eval！\u003c/p\u003e\n\u003cp\u003e本模板最先在博客园公布，版本迭代已到v10，并有一批C#的忠实用户在使用，我也长期用于任职公司的内部使用，历经考验。\u003c/p\u003e\n\n\n\n具体见 http://www.cnblogs.com/rubylouvre/archive/2012/08/06/2624970.html","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frubylouvre%2Fmmtemplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frubylouvre%2Fmmtemplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frubylouvre%2Fmmtemplate/lists"}