今天在照着教程写代码的时候,发现在express组件里面使用partial()会有编译错误,网上一查,原来新版的ejs已经不支持partial了,取而代之的是include关键词。
而且ejs的文档还不好找,找了半天才找到“官方”的,好简单。。
https://github.com/visionmedia/ejs#includes
另外,有一些关于移植express 2.0 --> 3.0的:
https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
http://jimpravetz.com/blog/2012/08/express-3-migration-issues/
http://cnodejs.org/topic/503bb8d9f767cc9a5113eef3
http://cnodejs.org/topic/501f5d8ff767cc9a51c98165
2012-12-11: 最新发现,express.js支持partial()函数,不过需要安装express-partial组件。
EJS
Embedded JavaScript templates.
Installation
$ npm install ejs
Features
- Complies with the Express view system
- Static caching of intermediate JavaScript
-
Unbuffered code for conditionals etc
<% code %>
-
Escapes html by default with
<%= code %>
-
Unescaped buffering with
<%- code %>
- Supports tag customization
- Filter support for designer-friendly templates
- Includes
- Client-side support
-
Newline slurping with
<% code -%>
or<% -%>
or<%= code -%>
or<%- code -%>
Example
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Usage
ejs.compile(str, options);
// => Function
ejs.render(str, options);
// => str
Options
-
cache
Compiled functions are cached, requiresfilename
-
filename
Used bycache
to key caches -
scope
Function execution context -
debug
Output generated function body -
compileDebug
Whenfalse
no debug instrumentation is compiled -
client
Returns standalone compiled function -
open
Open tag, defaulting to "<%" -
close
Closing tag, defaulting to "%>" - * All others are template-local variables
Includes
Includes are relative to the template with the include
statement,
for example if you have "./views/users.ejs" and "./views/user/show.ejs" you would use <%
include user/show %>
. The included file(s) are literally included into the template, no IO
is performed after compilation, thus local variables are available to these included templates.
<ul>
<% users.forEach(function(user){ %>
<% include user/show %>
<% }) %>
</ul>
Custom delimiters
Custom delimiters can also be applied globally:
var ejs = require('ejs');
ejs.open = '{{';
ejs.close = '}}';
Which would make the following a valid template:
<h1>{{= title }}</h1>
Filters
EJS conditionally supports the concept of "filters". A "filter chain" is a designer friendly api for manipulating data, without writing JavaScript.
Filters can be applied by supplying the : modifier,
so for example if we wish to take the array[{
name: 'tj' }, { name: 'mape' }, { name: 'guillermo' }]
and output a list of names we can do this simply with filters:
Template:
<p><%=: users | map:'name' | join %></p>
Output:
<p>Tj, Mape, Guillermo</p>
Render call:
ejs.render(str, {
users: [
{ name: 'tj' },
{ name: 'mape' },
{ name: 'guillermo' }
]
});
Or perhaps capitalize the first user's name for display:
<p><%=: users | first | capitalize %></p>
Filter list
Currently these filters are available:
- first
- last
- capitalize
- downcase
- upcase
- sort
- sort_by:'prop'
- size
- length
- plus:n
- minus:n
- times:n
- divided_by:n
- join:'val'
- truncate:n
- truncate_words:n
- replace:pattern,substitution
- prepend:val
- append:val
- map:'prop'
- reverse
- get:'prop'
Adding filters
To add a filter simply add a method to the .filters
object:
ejs.filters.last = function(obj) {
return obj[obj.length - 1];
};
Layouts
Currently EJS has no notion of blocks, only compile-time include
s,
however you may still utilize this feature to implement "layouts" by simply including a header and footer like so:
<% include head %>
<h1>Title</h1>
<p>My page</p>
<% include foot %>
client-side support
include ./ejs.js
or ./ejs.min.js
and require("ejs").compile(str)
.