刚刚将我的 Node.js 和 Express 版本分别更新到 0.10.21 和 3.4.4,现在我在开发(和生产)中看到一些奇怪的 View 缓存。
似乎正在缓存从其他 View (或者可能是所有 View ?)中包含的 View 生成的 html。
例如:
layout.jade
doctype 5
html
head
title= title
meta(name="viewport", content="width=device-width, initial-scale=1.0")
link(rel='stylesheet', href='/stylesheets/style.css')
body
#container
include header
block content
include footer
header.jade
- var headerClass = ""
if pageVars.headerOverBackground
- headerClass = "overbackground"
#header(class=headerClass)
[snip]
somepage.jade
extends layout
block content
[snip]
我第一次调用 /somepage 时,将 pageVars.headerOverBackground 设置为 true, View 正确呈现。如果我访问不同的 URL,/someotherpage,具有相同的布局和标题,将 pageVars.headerOverBackground 设置为 false,我仍然看到 header.jade 部分呈现为就好像它在前一页上一样(#header 上有“overbackground”类),就好像 pageVars.headerOverBackground 仍然为真。
但这是错误的,我有 console.log() 来证明这一点。
我做错了什么吗?我只是非常困惑吗?我在开发和生产模式下运行 Node,甚至在我的 Express 中添加了
app.disable('view cache');
没用...
编辑:
无论我重新加载页面多少次,它都会加载缓存的 View 。 如果我重新启动 Node 并重新加载,则会出现正确的 View 。
最佳答案
好吧,我想我可能已经解决了这个问题。
其中一条路线错了
pageVars = {};
代替
var pageVars = {};
导致声明一个全局变量。哎呀!在旧版本的 Node/Express/Jade 和当前版本之间的某个地方,Jade 开始更喜欢全局变量,即使在显式传递同名本地变量时也是如此。
所以如果一条路线错误地做了
pageVars = {}; //global, oops
pageVars.headerOverBackground = true;
res.render("onepage", {pageVars:pageVars});
然后调用另一个路由
var pageVars = {}; //local
// pageVars.headerOverBackground is undefined
res.render("anotherpage", {pageVars:pageVars});
另一个页面 View 中的 Jade 将使用全局版本的 pageVars 而不是传递的局部变量,并且仍然认为 pageVars.headerOverBackground 为 true。
关于javascript - 奇怪的 Express Jade View 缓存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672617/