链轮:连接Eco模板并删除重复的辅助功能

时间:2012-05-09 19:05:49

标签: javascript coffeescript sprockets eco

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

所以,例如,如果我有这两个模板:

template1.jst.eco:

<b>Awesome template 1</b>

template2.jst.eco:

<b>Awesome template 2</b>

然后我使用Sprockets require指令将它们包含在文件中:

# 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,以便重新使用辅助功能而不是复制它们?

0 个答案:

没有答案