调试underscore.js模板很困难,没有行号
我正在将一个相当大的php模板(包含基本逻辑的页面)转换为一个underscore.js模板。
问题在于我一直存在错误,并且在发生错误时,缩小的“编译”版本不会提供有用的信息或行号。
有没有办法在underscore.js中获得更好的模板调试(如行号)? 如果没有,有没有办法让模板终止在某一点(这样我可以缩小错误的位置)。
勘误表截至2012年4月: Underscore 1.3.2(2012年4月9日)已对_.template()
进行了更改,检查更新日志和源代码,因为此处描述的复杂内容可能已显示出来。
是和不是 - 模板首先被翻译成一串(难以阅读的)Javascript代码,并作为一个代码块执行,所以如果你正在寻找一个语法错误,你必须从模板中删除有问题的代码,重新尝试执行。
但是,如果是别的,嵌入一个<% return __p.join(''); %>
<% return __p.join(''); %>
会中断执行并返回模板的结果直到那一点(请阅读源代码以查看原因,但本质上, __p
板块的结果会一个__p
一个地放入名为__p
的数组中)。
您也可以在模板评估时进行日志记录(即,将<% console.log(<..>) %>
放入您的模板中以查看诊断信息)。对于更高级的故障诊断,还可以在您的<% debugger; %>
模板代码放入您最喜欢的调试器中虽然您将看到的代码不友好,但您可以访问评估模板范围。
如果我正在做大量的工作并需要更多的调试工具,我可能需要一份underscore.js
脚本,并将一些诊断支持代码添加到_.template()
函数本身。 例如:
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'with(obj||{}){__p.push('' +
str.replace(//g, '\')
.replace(/'/g, "'")
.replace(c.interpolate, function(match, code) {
return "'," + code.replace(/'/g, "'") + ",'";
})
.replace(c.evaluate || null, function(match, code) {
return "');" + code.replace(/'/g, "'")
.replace(/[rnt]/g, ' ') + "__p.push('";
})
.replace(/r/g, 'r')
.replace(/n/g, 'n')
.replace(/t/g, 't')
+ "');}return __p.join('');";
console.log(tmpl.replace(/;/g, 'n')); // <- dump compiled code to console before evaluating
var func = new Function('obj', tmpl);
return data ? func(data) : func;
};
在Backbone Eye(Firebug扩展)中,您可以调试下划线模板 - 就像它们是常规的JavaScript文件一样。 模板标识(如果指定的话)出现在Firefox的脚本窗口中,您可以选择它(就像常规脚本文件一样),放置断点并观察模板的增量构建。 关于如何做到这一点的更多细节在http://dhruvaray.github.io/spa-eye/#views。 这应该可以帮助您轻松缩小错误的来源。
[免责声明:我是Backbone Eye的作者]
如果你在一个长模板里面有一个javascript语法错误,有时候它很难找到,因为linter不会理解<%%>里面的javascript,
使用您的编辑器替换功能并替换:
找:
%>[sS]*?<%[=-]?
更换:
n//htmln
它将删除您的JavaScript之间的任何HTML,然后您可以使用linter或http://esprima.org/demo/validate.html来查找语法错误。
全部替换并美化后:
注意:这个正则表达式会在文件的开始和结尾留下剩余的HTML,所以只需手动删除它们。
链接地址: http://www.djcxy.com/p/72065.html上一篇: debugging underscore.js templates is difficult without line numbers