This article mainly introduces the quick start learning of EJS templates. The editor thinks it is quite good. Now I will share it with you and give it as a reference. Let’s follow the editor and take a look.
Node There are many options for open source templates, but it is recommended for old people like me to use EJS. There are Classic ASP/PHP /JSP Experience It is indeed very natural to use EJS, that is to say, you can arrange JavaScript code in <%...%> blocks and use the most traditional The method <%=output variable%> (in addition, <%-output variable will not escape symbols such as &). Installation The EJS command is as follows:
npm install ejs
JS call
There are two main methods for JS call:
ejs.compile(str, options); // => Function ejs.render(str, options); // => str
In fact, EJS can be free Used independently of Express, for example:
var ejs = require(''), str = require('fs').readFileSync(dirname + '/list.ejs', 'utf8'); var ret = ejs.render(str, { names: ['foo', 'bar', 'baz'] }); console.log(ret);
See ejs.render(), the first parameter is the string of the template, the template is as follows.
<% if (names.length) { %> <ul> <% names.forEach(function(name){ %> <li foo='<%= name + "'" %>'><%= name %></li> <% }) %> </ul> <% } %>
names become local variables.
Option parameters
The second parameter is data, usually an object. This object can be regarded as an option, which means that the data and selection are both in the same object.
If you don’t want to save the disk every time, you need to cache the template and set options.filename. For example:
var ejs = require('../') , fs = require('fs') , path = dirname + '/functions.ejs' , str = fs.readFileSync(path, 'utf8'); var users = []; users.push({ name: 'Tobi', age: 2, species: 'ferret' }) users.push({ name: 'Loki', age: 2, species: 'ferret' }) users.push({ name: 'Jane', age: 6, species: 'ferret' }) var ret = ejs.render(str, { users: users, filename: path }); console.log(ret);
The relevant options are as follows:
cache Compiled functions are cached, requires filename
filename Cache key name
scope FunctionExecution scope
debug Output generated function body
compileDebug When false no debug instrumentation is compiled
client Returns standalone compiled function
inculde command
Furthermore, if you want to insert a public template like
<ul> <% users.forEach(function(user){ %> <% include user/show %> <% }) %> </ul>
, that is, introduce a file, you must set the filename option The include feature must be enabled, otherwise include will not know the directory.
Template:
<h1>Users</h1> <% function user(user) { %> <li><strong><%= user.name %></strong> is a <%= user.age %> year old <%= user.species %>.</li> <% } %> <ul> <% users.map(user) %> </ul>
EJS supports compiled templates. After template compilation, there will be no IO operations, it will be very fast, and local variables can be shared. The following example user/show ignores the ejs extension:
<ul> <% users.forEach(function(user){ %> <% include user/show %> <% }) %> </ul>
Customized CLOSE TOKEN
If you plan to use
var ejs = require('ejs'); ejs.open = '{{'; ejs.close = '}}';
Formatted output is also ok.
ejs.filters.last = function(obj) { return obj[obj.length - 1]; };
Calling
<p><%=: users | last %></p>
EJS also supports browser environments.
<html> <head> <script src="../ejs.js"></script> <script id="users" type="text/template"> <% if (names.length) { %> <ul> <% names.forEach(function(name){ %> <li><%= name %></li> <% }) %> </ul> <% } %> </script> <script> onload = function(){ var users = document.getElementById('users').innerHTML; var names = ['loki', 'tobi', 'jane']; var html = ejs.render(users, { names: names }); document.body.innerHTML = html; } </script> </head> <body> </body> </html>
I wonder if EJS can output multi-layer JSON objects?
By the way, some netizens broke the news that jQ master John wrote a 20-line template a few years ago. It was similar to EJS but short and concise!
Simple and practical jstemplate engine
A js template engine with less than 50 lines, supporting various js syntax:
<script id="test_list" type="text/html"> <%= for(var i = 0, l = p.list.length; i < l; i++){ var stu = p.list[i]; =%> <tr> <td<%=if(i==0){=%> class="first"<%=}=%>><%==stu.name=%></td> <td><%==stu.age=%></td> <td><%==(stu.address || '')=%></td> <tr> <%= } =%> </script>
"<%= xxx =%>" contains js logic code, "<%== xxx =%>" contains variables for direct output, similar to PHP's echo role. "p" is the k-v object parameter when calling the build method below. It can also be set to another parameter name when calling "new JTemp"
Call:
$(function(){ var temp = new JTemp('test_list'), html = temp.build( {list:[ {name:'张三', age:13, address:'北京'}, {name:'李四', age:17, address:'天津'}, {name:'王五', age:13} ]}); $('table').html(html); });
After the above temp is generated, the build method can be called multiple times to generate html. The following is the code of the template engine:
var JTemp = function(){ function Temp(htmlId, p){ p = p || {};//配置信息,大部分情况可以缺省 this.htmlId = htmlId; this.fun; this.oName = p.oName || 'p'; this.TEMP_S = p.tempS || '<%='; this.TEMP_E = p.tempE || '=%>'; this.getFun(); } Temp.prototype = { getFun : function(){ var _ = this, str = $('#' + _.htmlId).html(); if(!str) _.err('error: no temp!!'); var str_ = 'var ' + _.oName + '=this,f=\'\';', s = str.indexOf(_.TEMP_S), e = -1, p, sl = _.TEMP_S.length, el = _.TEMP_E.length; for(;s >= 0;){ e = str.indexOf(_.TEMP_E); if(e < s) alert(':( ERROR!!'); str_ += 'f+=\'' + str.substring(0, s) + '\';'; p = _.trim(str.substring(s+sl, e)); if(p.indexOf('=') !== 0){//js语句 str_ += p; }else{//普通语句 str_ += 'f+=' + p.substring(1) + ';'; } str = str.substring(e + el); s = str.indexOf(_.TEMP_S); } str_ += 'f+=\'' + str + '\';'; str_ = str_.replace(/\n/g, '');//处理换行 var fs = str_ + 'return f;'; this.fun = Function(fs); }, build : function(p){ return this.fun.call(p); }, err : function(s){ alert(s); }, trim : function(s){ return s.trim?s.trim():s.replace(/(^\s*)|(\s*$)/g,""); } }; return Temp; }();
The core is to convert the template code into a function that splices strings, and call this function every time you get data.
Because it is mainly used for mobile phones (webkit), the efficiency of string splicing is not considered. If it needs to be used for IE, it is best to change the string splicing method to Array. push() form.
Attachment: An example of connect + ejs.
var Step = require('../../libs/step'), _c = require('./utils/utils'), fs = require('fs'), ejs = require('ejs'), connect = require('connect'); exports.loadSite = function(request, response){ var siteRoot = 'C:/代码存档/sites/a.com.cn'; // _c.log(request.headers.host); var url = request.url; // 如果有 html 的则是动态网页,否则为静态内容 if(url == '/' || ~url.indexOf('/?') || url.indexOf('.asp') != -1 || url[url.length - 1] == '/'){ var tplPath; if(url == '/' || ~url.indexOf('/?') || url[url.length - 1] == '/'){ // 默认 index.html tplPath = siteRoot + request.url + 'default.asp'; }else{ tplPath = siteRoot + request.url.replace(/\?.*$/i,''); // 只需要文件名 } // 从文件加载模板 Step(function(){ _c.log('加载模板:' + tplPath); fs.exists(tplPath, this); }, function(path_exists){ if(path_exists === true)fs.readFile(tplPath, "utf8", this); else if(path_exists === false) response.end404(request.url); else response.end500('文件系统异常', ''); },function(err, tpl){ var bigfootUrl, cssUrl, projectState = 0; // 0 = localhot/ 1 = Test Server / 2 = Deployed switch(projectState){ case 0: bigfootUrl = "http://127.0.0.1/bigfoot/"; cssUrl = "http://127.0.0.1/lessService/?isdebug=true"; break; case 1: bigfootUrl = "http://112.124.13.85:8080/static/"; cssUrl = "/asset/style/"; break; case 2: bigfootUrl = "http://localhost:8080/bigfoot/"; break; } var sitePath = request.getLevelByUrl(require(siteRoot + '/public/struct')), first = sitePath[0]; var htmlResult = ejs.render(tpl, { filename : tplPath, bigfootUrl: bigfootUrl, cssUrl : cssUrl, projectState: projectState, query_request: request.toJSON(), request: request, config: require(siteRoot + '/public/config'), struct: require(siteRoot + '/public/struct'), sitePath : sitePath, firstLevel : first }); // _c.log(first.children.length) response.end200(htmlResult); }); }else{ connect.static(siteRoot)(request, response, function(){ // if not found... response.writeHead(404, {'Content-Type': 'text/html'}); response.end('404'); }); } }
【Related recommendations】
1. Free js online video tutorial
2. JavaScript Chinese Reference Manual
3. php.cn Dugu Jiujian (3) - JavaScript video tutorial
The above is the detailed content of Tutorial on using EJS templates in node.js. For more information, please follow other related articles on the PHP Chinese website!