调试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模板

全部替换并美化后: 剩余的JavaScript

注意:这个正则表达式会在文件的开始和结尾留下剩余的HTML,所以只需手动删除它们。

链接地址: http://www.djcxy.com/p/72065.html

上一篇: debugging underscore.js templates is difficult without line numbers

下一篇: How to use underscore.js as a template engine?