Nodejs 客户端模板引擎的选择
Nodejs 客户端模板引擎的选择
参考:http://engineering.linkedin.com/frontend/client-side-templating-throwdown-mustache-handlebars-dustjs-and-more
主要的客户端模板引擎
1、允许嵌入JavaScript的模板引擎:可嵌入任何JavaScript代码
- underscore.js
- Jade
- haml-js
- jQote2
- doT
- Stencil
- Parrot
- Eco
- EJS
- jQuery templates
- node-asyncEJS
2、无逻辑的模板引擎:只有一些简单的循环、判断逻辑,并且使用的是模板语法而不是JS语法
- mustache
- dust.js
- handlebars
- Google Closure Templates
- Nun
- Mu
- kite
如何选择模板引擎##
如果要严格执行业务逻辑和表现分类的原则,则不要选择可嵌入JS的模板引擎,从机制上避免越界的可能性。此外,选择模板引擎还应考虑以下因素:
- 是否可以同时在客户端和服务器端执行渲染;
- 是否支持表现层逻辑,即根据数据内容,选择性渲染样式或内容;
- 是否支持文本格式化,例如是否可以将JSON字符串中的\n替换成《br/》;
Linkedin公司经过比较,选择dust.js作为其客户端模板技术,主要基于以下考虑:
- 缓存:与服务器端模板相比,客户端模板可以通过内容分发网络CDN提供,以降低延迟和带宽占用。另外模板文件可在浏览器端缓存,因此一旦模板初次加载后,服务器只需要提供动态数据(例如JSON),这样效率非常高;
- 性能:dust.js可以被预编译为高效的JavaScript函数;
- 浓缩:模板可以分解为小片段,HTML标记和渲染逻辑可重用,即便后台采用不同的技术堆栈(Java Ruby等);
- 解耦:dust.js模板鼓励表现层和应用层、业务逻辑分离;
- 跨浏览器、跨库:dust.js和所有现代浏览器兼容,可以和各种JS类库同时使用,例如YUI 和 jQuery。它默认禁止一些不合适的用法,帮助我们预防XSS攻击;
- 服务器端支持:如果你有一个客户端不能运行JavaScript,例如搜索引擎爬虫,那么页面必须在服务器端渲染。dust.js模板不仅支持客户端渲染,也可以通过 node.js 或 Rhino在服务器端渲染;
- 渐进渲染:dust.js模板支持同步或异步渲染,因此可将耗时的操作放在背后进行,其他事情可以先完成。当在服务器端渲染时,同样可将某些内容优先渲染,这样用户很快就能看到一些东西;
- 简单、强大、开放:dust.js模板语法易于学习和扩展。Linkedin开发了dust helpers类库,以清晰的方式实现格式化、国际化、表现层逻辑等功能;
Nodejs 客户端模板引擎的选择
在前端开发中,选择一个合适的客户端模板引擎对于提升开发效率和用户体验至关重要。本文将介绍几种常见的客户端模板引擎,并分析如何根据具体需求进行选择。
主要的客户端模板引擎
根据功能复杂度和灵活性,客户端模板引擎大致可以分为两类:
-
允许嵌入JavaScript的模板引擎:这类模板引擎允许你嵌入任意复杂的JavaScript代码。
- Underscore.js:
<script type="text/template" id="item-template"> <div class="title"><%= title %></div> <div class="body"><%- body %></div> </script>
- Jade:
div.title= title div.body!= body
- EJS:
<script type="text/template" id="item-template"> <div class="title"><%= title %></div> <div class="body"><%- body %></div> </script>
- Underscore.js:
-
无逻辑的模板引擎:这类模板引擎仅支持基本的循环和条件判断,通常使用特定的模板语法而非直接的JavaScript代码。
- Mustache:
<script type="text/template" id="item-template"> <div class="title">{{title}}</div> <div class="body">{{{body}}}</div> </script>
- Handlebars:
<script type="text/template" id="item-template"> <div class="title">{{title}}</div> <div class="body">{{{body}}}</div> </script>
- Dust.js:
<script type="text/template" id="item-template"> <div class="title">{title}</div> <div class="body">{body}</div> </script>
- Mustache:
如何选择模板引擎
选择合适的模板引擎需要综合考虑多个因素:
- 跨平台支持:是否可以在客户端和服务器端同时使用?
- 表现层逻辑支持:是否可以根据数据内容选择性渲染样式或内容?
- 文本格式化支持:是否支持文本格式化操作,如将换行符替换为HTML
<br>
标签?
LinkedIn 的选择:Dust.js
LinkedIn 经过对比选择了 Dust.js 作为其客户端模板引擎,主要原因包括:
- 缓存:Dust.js 模板可以通过 CDN 缓存,减少首次加载时间。一旦模板被加载,后续只需发送动态数据(如 JSON),提高效率。
- 性能:Dust.js 模板可以预编译为高效的 JavaScript 函数,加快渲染速度。
- 浓缩:模板可以分解成小片段,便于复用和维护。
- 解耦:Dust.js 鼓励表现层和业务逻辑分离,提高代码的可维护性和可读性。
- 跨浏览器兼容性:Dust.js 与所有现代浏览器兼容,支持多种 JS 类库。
- 服务器端支持:Dust.js 不仅支持客户端渲染,还可以通过 Node.js 在服务器端渲染。
- 渐进渲染:支持同步和异步渲染,使用户能够更快地看到页面的一部分内容。
示例代码:Dust.js 渲染
// 定义模板
var template = dust.compile('<div class="title">{title}</div><div class="body">{body}</div>', 'item-template');
dust.loadSource(template);
// 数据
var data = {
title: "Hello World",
body: "This is a test."
};
// 渲染
dust.render('item-template', data, function(err, out) {
if (err) {
console.error(err);
} else {
document.getElementById('output').innerHTML = out;
}
});
以上就是关于 Node.js 客户端模板引擎选择的一些关键点和示例代码。希望这些信息能帮助你在实际项目中做出合适的选择。
单枪匹马的话,还是jade舒服~
学习了,有机会用用看。
已经2年没有更新了
Linkedin 公司的开发团队接过了dustjs的维护,目前项目非常活跃,大家可参考: https://github.com/linkedin/dustjs
还有一些dustjs的扩展项目,请参考 https://github.com/linkedin
条件允许的话,自己写个模板也无妨。
Node.js 客户端模板引擎的选择
选择合适的客户端模板引擎对于前端开发非常重要。LinkedIn 公司在经过比较后选择了 dust.js
作为其客户端模板技术。以下是选择 dust.js
的主要原因:
缓存
客户端模板可以通过 CDN 提供,这降低了延迟和带宽占用。一旦模板初次加载后,后续请求只需提供动态数据(如 JSON),从而提高效率。
性能
dust.js
可以被预编译为高效的 JavaScript 函数,提升了渲染速度。
浓缩
模板可以分解为小片段,HTML 标记和渲染逻辑可以重用,即使后台采用不同的技术堆栈(如 Java, Ruby 等)也能保持一致。
解耦
dust.js
模板鼓励表现层和应用层、业务逻辑的分离,使得代码更清晰、维护更容易。
跨浏览器、跨库
dust.js
与所有现代浏览器兼容,并且可以与各种 JS 类库(如 YUI, jQuery)一起使用。它默认禁止一些不合适的用法,帮助预防 XSS 攻击。
服务器端支持
如果客户端不能运行 JavaScript(如搜索引擎爬虫),页面可以在服务器端渲染。dust.js
不仅支持客户端渲染,还可以通过 Node.js 或 Rhino 在服务器端渲染。
渐进渲染
dust.js
模板支持同步或异步渲染,可以将耗时的操作放在后台进行,这样用户可以更快地看到一些内容。
简单、强大、开放
dust.js
模板语法易于学习和扩展。LinkedIn 开发了 dust helpers
类库,实现了格式化、国际化、表现层逻辑等功能。
示例代码
// 安装 dust.js
npm install dustjs-linkedin
// 引入 dust.js
const dust = require('dustjs-linkedin');
require('dustjs-helpers'); // 引入 dustjs helpers
// 编译模板
dust.loadSource(dust.compile('<p>Hello, {name}!</p>', 'hello'));
// 渲染模板
dust.render('hello', {name: 'World'}, function(err, out) {
console.log(out); // 输出: <p>Hello, World!</p>
});
总结
在选择客户端模板引擎时,dust.js
是一个值得考虑的选择,尤其是在需要高性能、良好的缓存机制以及跨平台兼容性的项目中。