自己用 art-template 有些年头了,最近在培养团队学习 art-template 使用,发现有一个痛点比较难解决。

  比如有一个模版,我们可以直接写在页面中,像这样:

<script id="appbtnTemp" type="text/html">
<div id="<%=id%>" class="appbtn" title="<%=title%>" appid="<%=appid%>" realappid="<%=realappid%>" type="<%=type%>">
<img src="<%=imgsrc%>" alt="<%=title%>" style="width:<%=appsize%>px;height:<%=appsize%>px;">
<span style="width:<%=appsize+10%>px;"><%=title%></span>
</div>
</script>

  但如果这是个公用的模版,在很多页面需要用到,那就不能直接写在页面中了,不然就得复制很多份了,那就只能写到 js 文件里,做为一个公用函数。

var appbtn = template.compile(
'<div id="<%=id%>" class="appbtn" title="<%=title%>" appid="<%=appid%>" realappid="<%=realappid%>" type="<%=type%>">'+
'<img src="<%=imgsrc%>" alt="<%=title%>" style="width:<%=appsize%>px;height:<%=appsize%>px;">'+
'<span style="width:<%=appsize+10%>px;"><%=title%></span>'+
'</div>'
);

  这样子虽然解决了公用的问题,但代码就变得难以维护了,毕竟是在 js 文件里写 html 代码,代码高亮提示没了,而且都是字符串拼接,如果模版有修改,将会是一个可怕的问题。

  那有没有什么解决办法呢?我的第一个想法是把每个模版都写到独立的文件里,但在官网文档里看到浏览器版本不支持文件路径读取模版,那就自己改造下吧,让浏览器版本也支持文件加载读取模版。

  这里我的大致思路是通过 jquery 的 $.ajax() 去获取模版,读取到模版然后用 template.compile() 把模版编译成函数并储存好,如果再次调用模版,则不用重新去获取模版。

$(function(){
var cache = {};
var renderFile = function(path, data){
var html;
if(cache.hasOwnProperty(path)){
html = cache[path](data);
}else{
$.ajax({
type: 'GET',
url: path,
dataType: 'text',
async: false
}).done(function(cb){
var render = template.compile(cb);
html = render(data);
cache[path] = render;
});
}
return html;
}
renderFile('test.art', {title: '测试1'});
});

  下面是 test.art 文件

<div>
<h1><%=title%></h1>
</div>

  代码实现整体还是很 easy 的,这样修改之后,模版文件也可以统一管理了,既不会和页面混在一起,也不会和 js 混在一起。

  后续:

  在和 art-template 的作者交流后,作者给出两点解决方案:

1、如果用 webpack 结合 art-template-loader 就解决了这个问题了,它可以根据需要自动打包模板(而且是编译好的代码,不包含模板引擎)

2、我建议你使用 es6,至少模板这里可以用 es6 书写这样可以轻松的写多行字符串

从 art-template 模版维护到动态加载的思考的更多相关文章

  1. [AngularJS] 使用AngularCSS动态加载CSS

    [AngularJS] 使用AngularCSS动态加载CSS 前言 使用AngularAMD动态加载Controller 使用AngularAMD动态加载Service 上列两篇文章里,介绍了如何如 ...

  2. [AngularJS] 使用AngularAMD动态加载Service

    [AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...

  3. [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>() 及 静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()

    转自:http://aigo.iteye.com/blog/2281558 动态加载UObject和动态加载UClass分别用LoadObject<T>(),和LoadClass<T ...

  4. [UE4]C++实现动态加载的问题:LoadClass()和LoadObject()

    http://aigo.iteye.com/blog/2281558 原文作者:@玄冬Wong 相关内容:C++静态加载问题:ConstructorHelpers::FClassFinder()和FO ...

  5. Vue动态加载异步组件

    背景: 目前我们项目都是按组件划分的,然后各个组件之间封装成产品.目前都是采用iframe直接嵌套页面.项目中我们还是会碰到一些通用的组件跟业务之间有通信,这种情况下iframe并不是最好的选择,if ...

  6. Ext动态加载Toolbar

    在使用Ext的GridPanel时候,有时候需要面板不用重新加载而去更新Store或者Toolbar,Store的方法有很多,例如官方api给我们提供的Store.load(),Store.reLoa ...

  7. [转载] Android动态加载Dex机制解析

    本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...

  8. [AngularJS] 使用AngularAMD动态加载Controller

    [AngularJS] 使用AngularAMD动态加载Controller 前言 使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularU ...

  9. Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载

    在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的 ...

随机推荐

  1. 构造器和多态(Chapter8.3)

    构造器不具有多态性(它们是static方法,只不过该static声明是隐式的),但还是非常有必要理解构造器怎样通过多态在复杂的层次结构中运作,这一理解将有助于大家避免一些令人不快的困扰. 在main中 ...

  2. Java线程池使用和分析(二) - execute()原理

    相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...

  3. 在阿里云Linux服务器上安装MySQL

    申请阿里云Linux服务器 昨天在阿里云申请了一个免费试用5天的Linux云服务器. 操作系统:Red Hat Enterprise Linux Server 5.4 64位. CPU:1核 内存:5 ...

  4. metools,不花一分钱就能拥有自己的工具站点?

    需要[加密/解密][编码/解码][生成二维码]的时候不用再进百度点广告~ 也不需要去收藏夹找网址~ 我的目的大概就是如此. 项目地址:https://github.com/yimogit/metool ...

  5. 记因PHP的内存溢出导致的事故之解决

    如果对您有用记得关注,更多干货. 今天上午刚到公司,就有同事在公司群里反映某个计划任务出现问题了.我就怀着刨根问底的心,去查看了log.发现挺有意思的一个问题,PHP内存溢出导致脚本执行失败.那就一起 ...

  6. Map的迭代

    public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Int ...

  7. php 启动过程 - reqeust RINIT 过程

    php 启动过程 - reqeust RINIT 过程 概述 apache 接收到请求之后, 交给 php 处理 php 模块在接收到请求后, 会对请求进行初始化, 及 RINIT 过程 调用触发 a ...

  8. servlet:从入门到实战学习(1)---全·环境配置

    最近公司忙加班学习,学校忙助教工作,博客鸽了好久,后端学习工作过程中学了好多东西,趁着工作之余得空补补博客,算是整理下学习的东西. javaweb的后端研发需要学习的是tomcat+servlet+j ...

  9. 记录一个NPE问题

    昨天在做公司项目时,我在一处地方加了一个逻辑校验,之后测了下发现在方法调用深处有一处NPE,来源于另一个同事的代码. 其实NPE本应该是个Java编程中老掉牙的问题,但我觉得这一处错误还是比较典型的, ...

  10. Swift try try! try?使用和区别

    Swift try try! try?使用和区别 一.异常处理try catch的使用 1. swift异常处理 历史由来 Swift1.0版本 Cocoa Touch 的 NSError ,Swif ...