【问题标题】:Using jade.compile to compile a jade template that is a mixin file or has partials included使用jade.compile 编译作为mixin 文件或包含部分的jade 模板
【发布时间】:2013-12-11 05:11:23
【问题描述】:

我正在尝试弄清楚如何做到这一点。

问题:我正在尝试为我的电子邮件活动编译一个翡翠模板,但我正在尝试编译的文件是一个包含一些部分的 mixin。

例如:

控制器/user.js:

var emailTemplate = jade.compile(fs.readFileSync('./views/emails/new_user.jade', 'utf8'), { filename: './views/emails/new_user.jade'});

  var template = emailTemplate({
      baseUrl: res.locals.baseUrl,
      confirmCode: user.confirmCode,
      siteLogo: config.siteLogo,
      name: user.username,
      email: user.email
    }); 

./views/emails/new_user.jade:

include ../mixins/emails
div(style='margin-bottom: 20px; border: 1px solid #ddd; padding: 20px; width: 50%; margin: 0 auto 20px;')
  div(style='text-align: center; border-bottom: 1px solid #EEE; padding-bottom: 10px;')
    img(src='#{siteLogo}', style='text-align: center;')
  p
    | Hi #{name},
  p
    | Please confirm your account
  div(style='background-color: #179159; border-bottom: 1px solid #16814F; display: block; float: left; margin-bottom: 20px; text-align: center;       width: 100%;') 
  mixin button('test') 

./views/emails/mixins/emails.jade:

mixin button(text)
button
  =text

不幸的是,jade.compile 中的 renderFile 似乎一次只打开一个。

https://github.com/visionmedia/jade/blob/master/jade.js#L950

有没有一种方法可以让我做我想做的事(打开 new_user.jade,其中包含 mixins)或者我必须做类似的事情:

  • 修改 renderFile 源并将其更改为接受数组
  • 对文件执行 fs.readFileSync()
  • 解析顶部的每一行,检查include
  • 然后打开每个文件
  • 将它们合并到一个 .jade 文件中

还是有些疯狂?

【问题讨论】:

    标签: javascript node.js express pug


    【解决方案1】:

    看源码

    exports.renderFile = function(path, options, fn){
      ...
      var str = options.cache
        ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8'))
        : fs.readFileSync(path, 'utf8');
      return exports.render(str, options);
    };
    

    缓存默认是disable的,所以你不应该修改renderFile

    启用缓存:

    renderFile('path/to/file.jade', {cache: true}) 
    

    我不确切知道你的问题,但你需要分开 compile-timerender-time。如果你的意思是你的jade文件在过程中被改变了,那么你需要重新编译它们。

    定义混入

    mixin button(text)
      button= text
    

    调用混入

    +button('test') 
    

    【讨论】:

    • 我的问题(你的建议无法解决)是我无法从我的控制器中渲染一个包含 mixin 的玉文件。
    • 你能编译它吗?检查你调用 mixin 的方式。
    • 你在定义mixin的时候可能会漏掉tab或者空格?
    • 我知道如何包含/调用 mixin。我收到以下错误,因为 compile() 似乎一次只打开一个文件(并且通过查看其代码,出现)...unexpected token "indent"
    • 您可能在 'mixin button(text)' 之前有空格或制表符,请将其删除,并确保仅使用制表符或仅使用空格,而不是两者都使用
    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多