最近在使用Express框架中的ejs页面模板趟了些许坑,仅以本文记录总结。
本文简述的均为ejs页面模板。html
ejs由是在node层调用Response的render方法渲染出来的:node
index.js:express
var renderData = {a:1}; resp.render("/aaa/bbb/ccc", renderData);
如上例,在ejs页面中就能够直接使用变量a:json
index.ejs:api
<%= a %>
在ejs页面中使用行内模板js代码来定义变量:app
index.ejs:框架
<% var a = 1; %>
还能够在ejs页面行内js代码中给locals对象新增属性定义变量:dom
index.ejs:jsonp
<% locals.a = 1; %>
index.ejs:code
<%= a %>
index.ejs:
<%= locals.a %>
使用方法3定义的变量(即页面内locals定义),能够使用这两种调用方法。
其余区别:使用在Nodejs中和页面locals中定义方法定义的变量,能够使用对locals
对象遍历,拿到全部用户定义的变量。而使用页面内var
定义的变量,不能经过遍历locals来获取,也就是不知道用户新建立了哪些变量。
如在页面模板中,尽量使用locals.xxx
的方式来定义变量,这样定义的变量的通用性最高。
settings : { env:"development" etag:"weak" jsonp callback name:"callback" port:8222 query parser:"extended" subdomain offset:2 trust proxy:false view engine:"ejs" views:"/Users/xxx/yyy/zzz" x-powered-by:true }
locals是express框架中提供的变量,用于在模板中定义,调用各类变量,同时也支持全局变量,能够跨页面在各个模板中都可调用访问。
这里的app变量是指:var app = express();
的app,即express实例。
经过给app.locals.xxx
设定新增属性来实如今全express应用中各个ejs页面中都可直接使用。如:
app.locals["CONFIG"] = "xxxx";
能够在任何ejs页面中能够使用<%= CONFIG %>
变量。
这个的resp是指express的use中间件的Response对象:
app.use(function (req, resp, next) {...}
能够经过对resp.locals.xxx
设定值来实如今当前响应中
resp.locals["UID"] = "xxx";
也能够实现与app.locals
相同的效果,令全部页面模板可直接使用。
app.locals
是全应用惟一,也是全局共享,缺点是任何人修改都会影响整全部其余用户。适用于放置一些应用配置类型的常量数据。resp.locals
是响应范围内的全局数据,使用与在对某一个Response处理的各个阶段共享的数据。适用于放置一些用户配置类型的数据,如受权信息,ID等。app.locals.**
能够被response.locals.**
的同名属性值覆盖;response.locals.**
能够被render页面的renderData.**
的同名属性覆盖。有关app.locals
的详细信息:
http://expressjs.com/en/4x/api.html#app.locals
有关resp.locals
的详细信息:
http://expressjs.com/en/4x/api.html#res.locals