~ Express 模板引擎
模板引擎,是一个将页面模板和要显示的数据结合起来,生成 HTML 页面的工具。
可以这么理解,如果说 Express 中的路由控制方法是 MVC 中的控制器的话,那么 模板引擎就是 MVC 中的视图。
EJS
「 基本用法 」EJS 是一种简洁、高效的模板语言,其语法结构,与 JSP 相似。
它可以配合 express 使用,在众多 Node.js 模板引擎中,相对较为简单;也可以,把它看作是一个 JavaScript 库,直接在浏览器运行环境或 Node.js 运行环境中使用;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="div1"></div> <script src="ejs.min.js"></script> <script> var html = ejs.render('<%=123 %>',''); document.getElementById('div1').innerHTML = html; </script> </body> </html>
[1] 常用方法
- ejs.compile(str,[option]) 编译字符串,得到模板函数
- str 需要解析的字符串模板
- option 配置选项
var template = ejs.compile('<%=123 %>'); var result = template(); console.log(result);//123
- ejs.render(str,data,[option]) 直接渲染字符串,并生成 HTML
- str 需要解析的字符串模板
- data 数据
- option 配置选项
var result = ejs.render('<%=123 %>'); console.log(result);//123
两个函数包括的配置选项参数 options 如下( 了解 ):
cache 缓存编译后的函数(ejs.compile(..) ,需要 filename参数作为缓存的key filename 用于缓存的key,和include context 函数的执行上下文 compileDebug 输出compile的信息来跟踪调试 client 返回编译后的函数 delimiter <% .. %> 指这里的% debug 输出ejs.compile()得到函数的函数体 strict ejs.compile()返回的函数是否执行在严格模式 _with 是否使用 with(){..} 来访问本地变量 localsName 保存本地变量的对象名,默认为locals rmWhitespace 移除多余空格
[2] 常用标签
- js
所有使用 <% %> 括起来的内容都会被编译成 Javascript,可以在模版文件中像写 js 一样 coding
//test.ejs <% var a = 123 %> <% console.log(a); %> //test.js var ejs = require('ejs'); var fs = require('fs'); var data = fs.readFileSync('test.ejs'); var result = ejs.render(data.toString()); console.log(result); // 123 或者,可以写成这样: var ejs = require('ejs'); var result = ejs.render('<% var a = 123 %><%console.log(a); %>'); console.log(result); // 123
- 变量
用 <%=...%> 输出变量,变量若包含 '<' '>' '&'等字符会被转义
var ejs = require('ejs'); var result = ejs.render('<%=a%>',{a:'<div>123</div>'}); console.log(result); // <div>123</div>如果不希望变量值的内容被转义,那就这么用 <%-... %> 输出变量
var ejs = require('ejs'); var result = ejs.render('<%-a%>',{a:'<div>123</div>'}); console.log(result); // <div>123</div>
- 注释
用 <%# some comments %> 来注释,不执行不输出
- include
include 可以引用绝对路径或相对路径的模板文件。需说明的是:使用相对路径时,必须设置'filename'选项
// test.ejs <% var a = 123 %> <% console.log(a); %> // test.js var ejs = require('ejs');var result = ejs.render('<% include test.ejs %>',{filename:'test.ejs'}); console.log(result);//123
在 express 中使用 EJS
// 安装 ejs npm install ejs --save
// 代码示例:项目实际中,可以搭配 Bigpipe 技术,优化 ejs 模板引擎的渲染过程
// app.js const express = require('express'); const app = express(); // 引入并实例化 express // ejs 基本设置 app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); app.use(express.static(path.join(__dirname, 'views/static'))); // 静态资源 // 使用bigpipe技术 var bigpipe = require('express-middleware-bigpipe') app.use(bigpipe({ // use bigpipe basedir: __dirname + '/views/' // 设定 bigpipe 的 pagelet 的 basdir 路径 })); // 模板引擎路由处理 var viewsRouter = require('./views/api/v.js'); app.use('/v',viewsRouter);
// view/api/v.js var express = require('express'); var router = express.Router(); // 模板引擎渲染(bigpipe技术) const pipeRender = require('../render/render.js'); router.get('/',pipeRender.index); // 首页 module.exports = router;
// views/render/render.js let async = require('async'); var bigpipe = require('express-middleware-bigpipe') // 配置对象 let exportObj = { index }; module.exports = exportObj; function index(req, res) { // 创建一个async任务 let tasks = { query: cb => { cb(null, '测试内111容') } } // 让async自动控制任务执行 async.auto(tasks, function(err, result) { res.bigpipe.render('index.ejs', { title:'biaotiiii', info: result['query'] }) res.bigpipe.render('sec1.ejs', { dddd: result['query'] }) }) }
// views/index.ejs <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><%= title %></title> <link rel="stylesheet" href="/css/index.css"> </head> <body> <h1 class="col"><%= info %></h1> </body> </html>
