1

我正在使用 Sprockets 编译 Eco 模板并将它们连接为一个 JS 文件。

因此,例如,如果我有这两个模板:

模板1.jst.eco:

<b>Awesome template 1</b>

模板2.jst.eco:

<b>Awesome template 2</b>

然后我使用 Sprocketsrequire指令将它们包含在一个文件中:

# example.coffee
#= require 'templates/template1'
#= require 'templates/template2'

html = JST['templates/template1']()
moreHtml = JST['templates/template2']()

的编译/连接输出example.js是(警告,生成的长代码):

(function() {
  this.JST || (this.JST = {});
  this.JST["templates/template1"] = function(__obj) {
    if (!__obj) __obj = {};
    var __out = [], __capture = function(callback) {
      var out = __out, result;
      __out = [];
      callback.call(this);
      result = __out.join('');
      __out = out;
      return __safe(result);
    }, __sanitize = function(value) {
      if (value && value.ecoSafe) {
        return value;
      } else if (typeof value !== 'undefined' && value != null) {
        return __escape(value);
      } else {
        return '';
      }
    }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
    __safe = __obj.safe = function(value) {
      if (value && value.ecoSafe) {
        return value;
      } else {
        if (!(typeof value !== 'undefined' && value != null)) value = '';
        var result = new String(value);
        result.ecoSafe = true;
        return result;
      }
    };
    if (!__escape) {
      __escape = __obj.escape = function(value) {
        return ('' + value)
          .replace(/&/g, '&amp;')
          .replace(/</g, '&lt;')
          .replace(/>/g, '&gt;')
          .replace(/"/g, '&quot;');
      };
    }
    (function() {
      (function() {

        __out.push('<b>Awesome template 1</b>\n');

      }).call(this);

    }).call(__obj);
    __obj.safe = __objSafe, __obj.escape = __escape;
    return __out.join('');
  };
}).call(this);
(function() {
  this.JST || (this.JST = {});
  this.JST["templates/template2"] = function(__obj) {
    if (!__obj) __obj = {};
    var __out = [], __capture = function(callback) {
      var out = __out, result;
      __out = [];
      callback.call(this);
      result = __out.join('');
      __out = out;
      return __safe(result);
    }, __sanitize = function(value) {
      if (value && value.ecoSafe) {
        return value;
      } else if (typeof value !== 'undefined' && value != null) {
        return __escape(value);
      } else {
        return '';
      }
    }, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
    __safe = __obj.safe = function(value) {
      if (value && value.ecoSafe) {
        return value;
      } else {
        if (!(typeof value !== 'undefined' && value != null)) value = '';
        var result = new String(value);
        result.ecoSafe = true;
        return result;
      }
    };
    if (!__escape) {
      __escape = __obj.escape = function(value) {
        return ('' + value)
          .replace(/&/g, '&amp;')
          .replace(/</g, '&lt;')
          .replace(/>/g, '&gt;')
          .replace(/"/g, '&quot;');
      };
    }
    (function() {
      (function() {

        __out.push('\n<b>Awesome template 2</b>\n');

      }).call(this);

    }).call(__obj);
    __obj.safe = __objSafe, __obj.escape = __escape;
    return __out.join('');
  };
}).call(this);
(function() {
  var html, moreHtml;

  html = JST['templates/template1']();

  moreHtml = JST['templates/template2']();

}).call(this);

这个 JS 工作正常,但问题是它复制了 Eco 为每个包含的模板生成的所有辅助模板渲染函数。在具有少量模板的项目中,不难想象这些辅助功能的代码可以超过实际模板的代码。

有没有办法配置 Srpockets/Eco 以便它重新使用辅助功能而不是复制它们?

4

0 回答 0