如何使用 Jade / Pug 呈现内联 JavaScript?

Posted

技术标签:

【中文标题】如何使用 Jade / Pug 呈现内联 JavaScript?【英文标题】:How can I render inline JavaScript with Jade / Pug? 【发布时间】:2011-08-17 00:35:20 【问题描述】:

我正在尝试使用 Jade (http://jade-lang.com/) 让 javascript 在我的页面上呈现

我的项目是在带有 Express 的 NodeJS 中,一切都正常工作,直到我想在头脑中编写一些内联 JavaScript。即使从 Jade 文档中获取示例,我也无法让它工作我错过了什么?

翡翠模板

!!! 5
html(lang="en")
  head
    title "Test"
    script(type='text/javascript')
      if (10 == 10) 
        alert("working")
      
  body

在浏览器中渲染 HTML

<!DOCTYPE html>
<html lang="en">
<head>
  <title>"Test"</title>
  <script type="text/javascript">
    <if>(10 == 10) <alert working></alert></if>
  </script>
</head>
<body>
</body>
</html>

这里肯定有什么想法吗?

【问题讨论】:

您在(type='text/javascript') 之后缺少一个点. !!! 5 已弃用,您必须使用 doctype html 【参考方案1】:

只需使用一个“脚本”标签,后面加一个点。

script.
  var users = !JSON.stringify(users).replace(/<\//g, "<\\/")

https://github.com/pugjs/pug/blob/master/packages/pug/examples/dynamicscript.pug

【讨论】:

很好的解决方案,但它只会产生&lt;script&gt; 而不是&lt;script type="text/javascript"&gt; type="text/javascript"&lt;script&gt; 标签上type 字段的默认值。你不需要设置它。 多行代码呢?以这种方式嵌入 Jade 时,有没有办法在我的 Javascript 中进行适当的代码缩进? Jade 的策略已更改,内联脚本标签现在应该附加一个 .。所以script. 后面跟着缩进的 JS 块。 那个例子是脚本注入漏洞。见github.com/visionmedia/jade/issues/1474【参考方案2】:
script(nonce="some-nonce").
  console.log("test");

//- Workaround
<script nonce="some-nonce">console.log("test");</script>

【讨论】:

【参考方案3】:

使用指定类型的脚本标签,只需在点之前包含它:

script(type="text/javascript").
  if (10 == 10) 
    alert("working");
  

这将编译为:

<script type="text/javascript">
  if (10 == 10) 
    alert("working");
  
</script>

【讨论】:

只要script. 就可以了。【参考方案4】:

仅不使用脚本标签。

| 的解决方案:

script
  | if (10 == 10) 
  |   alert("working")
  | 

或者.:

script.
  if (10 == 10) 
    alert("working")
  

【讨论】:

我推荐.。否则你必须在每一行写|【参考方案5】:

:javascript 过滤器已在 version 7.0 中删除

您现在应该使用script 标记docs says,后跟. 字符且前面没有空格。

例子:

script.
  if (usingJade)
    console.log('you are awesome')
  else
    console.log('use jade')

将被编译为

<script>
  if (usingJade)
    console.log('you are awesome')
  else
    console.log('use jade')
</script>

【讨论】:

标签脚本后面有一个点,在所有 javascript 块中是否有任何方法可以在没有换行符的情况下呈现它? @Joaquinglez 我不知道【参考方案6】:

使用:javascript 过滤器。这将生成一个脚本标记并将脚本内容转义为 CDATA:

!!! 5
html(lang="en")
  head
    title "Test"
    :javascript
      if (10 == 10) 
        alert("working")
      
  body

【讨论】:

@aaaidan 你是对的。 Scalate 支持它(我在这里毫无问题地使用它:github.com/cb372/phone-home/blob/master/src/main/webapp/WEB-INF/…)但看起来纯 Jade 不支持它,因为它没有在此处列出:github.com/visionmedia/jade#features。太可惜了! 是的,会很好。正如最佳答案所说,script. 工作正常,并且是合法的!!! 5【参考方案7】:

对于多行内容,jade 通常使用“|”,但是:

只接受文本的标签,例如 脚本、样式和文本区域不 需要领先|人物

这就是说,我无法重现您遇到的问题。当我将该代码粘贴到玉模板中时,它会产生正确的输出并在页面加载时提示我一个警报。

【讨论】:

【参考方案8】:

我的答案的第三个版本:

这是一个内联 Jade Javascript 的多行示例。我认为不使用- 就无法编写它。这是我在部分中使用的 Flash 消息示例。希望这会有所帮助!

-if(typeof(info) !== 'undefined')
  -if (info)
    - if(info.length)
      ul
        -info.forEach(function(info)
          li= info
      -)
  -

您尝试获取的代码是否用于编译您的问题中的代码?

如果是这样,你不需要两件事:第一,你不需要声明它是Javascript/a脚本,你可以在输入-后开始编码;其次,输入-if 后,您也不需要输入。这就是让 Jade 非常可爱的原因。

-------------下面的原始答案---------------

尝试在if 前面加上-

-if(10 == 10)
  //do whatever you want here as long as it's indented two spaces from
   the `-` above

还有很多翡翠的例子:

https://github.com/visionmedia/jade/blob/master/examples/

【讨论】:

感谢约翰将其用于奇数的单行,但是我无论如何都看不到在不加“-”的情况下执行多行。 Jade 主页(link 甚至有一个我正在尝试做的示例,但它不会编译。我也在使用最新版本。 所以你问的是如何让多行 Javascript 代码低于一行? @Bluey 同样在这里,我从来没有得到这个工作。你应该在 github 问题上提问。 马克,现在已经开始使用 Sam Stephenson 的 Eco 而不是 Jade。我只是将jade用作测试的快速UI。 Jade 0.12.4 允许我在没有在 JS 下方添加 - 的情况下编写脚本()。

以上是关于如何使用 Jade / Pug 呈现内联 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

在 Jade(目前称为“Pug”)模板引擎中循环

Jade(Pug) 模板引擎使用文档

我最喜欢的模板jade(pug)学习和使用

使用 webexpress 和 pug/jade 通过 Autodesk forge 查看器提供页面

pug模板引擎(原jade)

pug学习