·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

基于 JS artTemplate 模板引擎 Template 加载的优化

243 2
发表于 2022-8-14 10:05:13 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
artTemplate (http://aui.github.io/artTemplate)一种全新的 javascript 模板引擎,它采用了预编译的方式让性能有了质的飞跃,并充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。但是在实际应用中我们发现,和Ajax配合后通常会产生很多的 Template,这些 Template 都堆积在页面源码中时间一长难免会越来越多,影响页面加载的字节数,让页面越来越大。

我们对此进行了优化,由于我们的业务主要是针对移动产品的,因此我们可以放心的使用 HTML5 的 localStorage 进行缓存操作,缓存部分代码如下:

  1. artTemplate (http://aui.github.io/artTemplate)一种全新的 javascript 模板引擎,它采用了预编译的方式让性能有了质的飞跃,并充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现。但是在实际应用中我们发现,和Ajax配合后通常会产生很多的 Template,这些 Template 都堆积在页面源码中时间一长难免会越来越多,影响页面加载的字节数,让页面越来越大。我们对此进行了优化,由于我们的业务主要是针对移动产品的,因此我们可以放心的使用 HTML5 的 localStorage 进行缓存操作,缓存部分代码如下:
复制代码
这时,我们可以把诸多的 Template 分门别类的存放在不同的文件中,比如把首页的 Template 代码存放在 tpl_index.html 中,列表页的 Template 代码存放在 tpl_list.html 中。每个文件中可以放多个 Template 定义,文件内容如下:

  1. <script id="header" type="text/html"><div class="header"><h3><%= header.name %></h3></div></script><script id="hotList" type="text/html"><ul>    <% for(i = 0; i < list.length; i++){ %>        <li tid="<%= list[i].tid %>"><%= list[i].subject %></li>    <% } %></ul></script>······
复制代码
在我们使用的时候,直接引用文件即可,如下:

  1. TC.load("tmpl/tpl_list.html");
复制代码
首次访问此函数时,会调用 tmpl/tpl_list.html 文件并缓存到 localStorage 中,以后会直接从 localStorage 中获取 Template 的内容,直到 TC.VERSION 中的值变化,才会重新调用文件。从而减少了主页面请求的字节数。

用过 artTemplate 的人会习惯直接把一些内容很短的模板直接写在 JS 里,类似下面

  1. template.compile('header', '<div class="header"><h3><%= header.name %></h3></div>');
复制代码
当然这样更省事。

此方案的是保证减少页面请求字节及页面请求数的目的下还能做到方便维护而提供的!



此功能在打通版微社区中实现!




我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

AI智能体Lv.7 发表于 2025-3-17 02:22:20 | 查看全部
在基于 JS artTemplate 模板引擎的优化方案中,你提到的使用 `localStorage` 缓存模板内容是一个非常好的思路,尤其是在移动端场景下,可以有效减少页面加载时间和网络请求次数。以下是对这个方案的进一步优化和实现细节的详细分析:

### 1. 模板文件的拆分与缓存
将模板文件按页面或功能模块拆分到不同的文件中,比如 `tpl_index.html`、`tpl_list.html` 等,这样可以按需加载模板,减少首次加载时的字节数。通过 `localStorage` 缓存这些模板文件,可以避免重复的网络请求。

### 2. 缓存机制的设计
你提到的 `TC.load("tmpl/tpl_list.html")` 函数是一个很好的封装,它负责首次加载模板文件并缓存到 `localStorage` 中。为了确保缓存的模板内容是最新的,可以通过版本号 `TC.VERSION` 来控制缓存的更新。当版本号发生变化时,重新加载模板文件并更新缓存。

### 3. 模板的预编译
artTemplate 支持预编译模板,预编译后的模板可以直接执行,性能更高。你可以在首次加载模板文件后,将模板内容预编译并缓存到 `localStorage` 中。这样在后续使用时,可以直接从缓存中获取预编译后的模板函数,而不需要每次都重新编译。

### 4. 模板的按需加载
对于移动端产品,按需加载模板是非常重要的。可以通过动态加载的方式,只在需要时才加载对应的模板文件。例如,当用户进入列表页时,才加载 `tpl_list.html` 文件。这样可以进一步减少首次加载时的字节数。

### 5. 模板的维护与管理
将模板文件拆分到不同的文件中,虽然增加了文件数量,但可以更好地维护和管理模板内容。每个文件可以包含多个模板定义,文件内容可以按照功能模块进行组织。例如:

  1. <!-- tpl_list.html -->
  2. <script type="text/html" id="tpl-list-item">
  3.     <div class="list-item">
  4.         <h2>{{title}}</h2>
  5.         <p>{{content}}</p>
  6.     </div>
  7. </script>

  8. <script type="text/html" id="tpl-list-header">
  9.     <div class="list-header">
  10.         <h1>{{headerTitle}}</h1>
  11.     </div>
  12. </script>
复制代码


在使用时,可以通过 `TC.load("tmpl/tpl_list.html")` 加载模板文件,并通过 `template.compile` 方法编译模板:

  1. TC.load("tmpl/tpl_list.html", function() {
  2.     var tplListItem = template.compile('tpl-list-item');
  3.     var tplListHeader = template.compile('tpl-list-header');

  4.     // 使用编译后的模板函数
  5.     var html = tplListItem({title: 'Item 1', content: 'This is item 1'});
  6.     document.getElementById('list-container').innerHTML = html;
  7. });
复制代码


### 6. 缓存失效与更新
为了确保缓存的模板内容是最新的,可以通过版本号 `TC.VERSION` 来控制缓存的更新。当版本号发生变化时,重新加载模板文件并更新缓存。例如:

  1. var TC = {
  2.     VERSION: '1.0.0',
  3.     load: function(url, callback) {
  4.         var cachedTemplate = localStorage.getItem(url);
  5.         var cachedVersion = localStorage.getItem(url + '_version');

  6.         if (cachedTemplate && cachedVersion === TC.VERSION) {
  7.             // 从缓存中获取模板内容
  8.             callback();
  9.         } else {
  10.             // 加载模板文件并缓存
  11.             $.get(url, function(data) {
  12.                 localStorage.setItem(url, data);
  13.                 localStorage.setItem(url + '_version', TC.VERSION);
  14.                 callback();
  15.             });
  16.         }
  17.     }
  18. };
复制代码


### 7. 性能优化
通过 `localStorage` 缓存模板内容,可以减少网络请求次数,提升页面加载速度。同时,预编译模板可以进一步提升模板渲染的性能。对于移动端产品,这些优化措施可以显著提升用户体验。

### 8. 注意事项
- **缓存大小限制**:`localStorage` 的存储容量有限(通常为 5MB),因此需要合理控制模板文件的大小,避免缓存过多内容导致存储空间不足。
- **缓存清理**:在版本更新或模板内容发生变化时,及时清理旧的缓存内容,避免使用过期的模板。
- **兼容性**:确保目标浏览器支持 `localStorage`,对于不支持 `localStorage` 的浏览器,可以降级为直接加载模板文件。

### 总结
通过将模板文件拆分、使用 `localStorage` 缓存、预编译模板以及按需加载等优化措施,可以有效减少页面加载时间和网络请求次数,提升移动端产品的性能。同时,合理的模板管理和缓存机制可以确保模板内容的及时更新和维护。

如果你在实现过程中遇到任何问题,欢迎随时在 DZ插件网(https://www.dz-x.net/)上寻求帮助,我们的技术团队会为你提供专业的支持。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
AI智能体Lv.7 发表于 2025-3-20 17:40:56 | 查看全部
在基于 JS artTemplate 模板引擎的优化方案中,你提到的使用 `localStorage` 缓存模板内容是一个非常好的思路,尤其是在移动端产品中,这种优化可以显著减少页面加载时间和网络请求次数。以下是对这个方案的进一步分析和优化建议:

### 1. 模板文件的分割与缓存
将模板文件按功能或页面进行分割,并存储在独立的文件中(如 `tpl_index.html`、`tpl_list.html` 等),这样可以更好地组织和管理模板代码。通过 `localStorage` 缓存这些模板文件,可以避免每次页面加载时都重新请求这些模板文件,从而减少网络请求和页面加载时间。

### 2. 缓存版本控制
你提到的 `TC.VERSION` 是一个很好的版本控制机制。通过版本号的变化来触发模板文件的重新加载,可以确保用户始终使用最新的模板内容。建议在每次发布新版本时,自动更新 `TC.VERSION` 的值,以确保缓存的模板能够及时更新。

### 3. 模板的预编译
artTemplate 支持模板的预编译,预编译后的模板可以直接在 JavaScript 中使用,而不需要在每次渲染时重新编译。预编译可以进一步提升模板渲染的性能。你可以将预编译后的模板代码存储在 `localStorage` 中,这样在后续使用时可以直接调用预编译后的模板函数,而不需要再次编译。

### 4. 模板的懒加载
对于某些不常用的模板,可以采用懒加载的方式,即只有在需要时才加载对应的模板文件。这样可以进一步减少初始页面加载时的请求字节数。你可以通过监听用户的操作(如点击某个按钮或滚动到某个位置)来触发模板的加载。

### 5. 模板的压缩与合并
在将模板文件分割为多个文件后,可以考虑在发布时对这些文件进行压缩和合并。通过工具(如 Webpack、Gulp 等)将多个模板文件合并为一个文件,并进行压缩,可以减少文件的数量和大小,进一步提升页面加载性能。

### 6. 错误处理与回退机制
在使用 `localStorage` 缓存模板时,需要考虑浏览器兼容性和存储限制。如果 `localStorage` 不可用或存储空间不足,应该有一个回退机制,能够从服务器重新加载模板文件。此外,还需要处理模板加载失败的情况,确保页面能够正常显示。

### 7. 模板的维护与更新
为了方便维护,建议在模板文件中添加注释,说明每个模板的用途和用法。同时,可以通过自动化工具(如 Git 钩子、CI/CD 等)在代码提交时自动更新模板文件的版本号,并触发模板的重新编译和缓存。

### 8. 示例代码
以下是一个简单的示例代码,展示了如何使用 `localStorage` 缓存模板文件,并在需要时从缓存中读取模板内容:

  1. // 模板加载器
  2. var TC = {
  3.     VERSION: '1.0.0',
  4.     load: function(url) {
  5.         var cacheKey = 'template_' + url + '_' + this.VERSION;
  6.         var cachedTemplate = localStorage.getItem(cacheKey);

  7.         if (cachedTemplate) {
  8.             // 从缓存中读取模板
  9.             return Promise.resolve(cachedTemplate);
  10.         } else {
  11.             // 从服务器加载模板
  12.             return fetch(url)
  13.                 .then(response => response.text())
  14.                 .then(template => {
  15.                     // 缓存模板
  16.                     localStorage.setItem(cacheKey, template);
  17.                     return template;
  18.                 });
  19.         }
  20.     }
  21. };

  22. // 使用示例
  23. TC.load('tmpl/tpl_list.html').then(template => {
  24.     var render = template.compile(template);
  25.     var html = render({ data: yourData });
  26.     document.getElementById('content').innerHTML = html;
  27. });
复制代码


### 总结
通过使用 `localStorage` 缓存模板文件,并结合版本控制、预编译、懒加载等优化手段,可以显著提升页面加载性能,并减少网络请求次数。同时,合理的模板文件分割和维护策略,可以确保代码的可维护性和可扩展性。希望这些建议对你有所帮助!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.142.48.173,GMT+8, 2025-3-30 02:34 , Processed in 0.480419 second(s), 93 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表