如何从 Handlebars 模板中获取零件

How to get partials from a Handlebars template

我希望能够从 Handlebars 模板中提取引用到其中的所有部分。

像这样:

var template = Handlebars.compile('<p>Hello {{> mypartial}}</p>');
console.log(template.partials); // <- i want to print ['mypartial']

我搜索了一段时间才找到那个 awnser,但它在 handlebars 文档的深处: https://github.com/handlebars-lang/handlebars.js/blob/master/docs/compiler-api.md#ast-visitor

如果您创建 class ImportScanner 来重载 PartialStatement,如文档中所示:

var Visitor = Handlebars.Visitor;

function ImportScanner() {this.partials = [];}
ImportScanner.prototype = new Visitor();

ImportScanner.prototype.PartialStatement = function(partial) {
  this.partials.push(partial.name.original);
  Visitor.prototype.PartialStatement.call(this, partial);
};

然后您可以使用它从已解析的模板中获取所有部分:

var ast = Handlebars.parse('<p>Hello {{> mypartial}}</p>');
var scanner = new ImportScanner();
scanner.accept(ast);
console.log(scanner.partials); // <= print ['mypartial']

但它只适用于第一级部分。如果 'mypartial' 包含其他部分,您将找不到它。