【问题标题】:DOM tree based JavaScript template engines基于 DOM 树的 JavaScript 模板引擎
【发布时间】:2012-03-06 03:23:34
【问题描述】:

我正在寻找一个新的 Javascript 模板引擎来替换旧的 jQuery 模板以满足我的客户端模板需求。

我更喜欢模板引擎处理 DOM 树而不是文本字符串,然后将熟字符串的内容转储到 innerHTML 的方法。这是更好的性能,我发现 DOM 操作更适合构建更多 DOM 树。

对于直接创建 DOM 树而不是基于文本的引擎的 Javascript 模板引擎,我有哪些选择?我喜欢 Mustache.js 的无逻辑方法,但它似乎只对字符串进行操作。原生 jQuery 集成也是一个不错的功能。

【问题讨论】:

  • 谢谢。我正在寻找一个潜在的解决方案,而不是尊重 =)
  • @qwertymk:习惯它,因为三年后每个人都会在浏览器中做模板。
  • 恕我直言...在生成大型模板的情况下...我认为生成文本字符串与随后调用文档以创建 dom 元素并添加数据/类名/id 相比会非常快元素......或者这些透明度,纯等还有其他方式吗?
  • @MikkoOhtamaa 不好意思再次打扰你...但是 react.js、秘银、骨干等是 mvc FRAMEWORKS....我正在寻找模板引擎..

标签: javascript jquery templates dom mustache


【解决方案1】:

【讨论】:

  • 我审查了所有 4 个,但似乎没有一个得到积极维护(我错了吗?)。 Pure 有一个最近的提交,但它很小。 Transparency.js 超过 7 个月没有看到提交(并且有大量未解决的问题)。 Plates and Weld 似乎更不活跃。你有什么推荐的?
  • AFAIK 保持透明度。它现在非常稳定,所以维护者 pyykkis 可能没有考虑添加新功能。这家伙在 IRC,据了解该项目还没有死。
  • 请注意,任何人如何找到这个答案:这是十年前写的。现在我们有 Svelte、React、Vue 和 Angular。
【解决方案2】:

【讨论】:

    【解决方案3】:

    soma-template 是一个新的。

    纯 DOM 操作,许多特性,自然语法,可与其他库完全扩展,例如 underscore.string,带参数的函数调用,帮助程序,观察程序。能够在需要时仅更新某些节点,DOM 本身内的模板。

    http://soundstep.github.com/soma-template/

    【讨论】:

    • 哇,这个看起来不错。与 AngularJS 类似,但 API 更易于理解。
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      我最近创建了受 PURE 和透明度启发的 DOM 模板引擎。

      它支持循环、条件等等。

      查看文档:http://code.meta-platform.com/metajs/components/template/

      别害怕 MetaJS 是大库,模板库可以独立使用。

      简短示例:

      HTML:

      <div id="tpl">
          <ul id="tasks">
              <li>
                  <span class="task"></span>
                  <span class="due-date"></span>
              </li>
          </ul>
      </div>
      

      定义模板:

      var tpl = Meta.Template(document.getElementById('tpl'), {
          "ul#tasks li": $__repeat("tasks", {
              ".task":        "task",
              ".due-date":    $__date("d. m. Y", "due_date"),
              "@":            $__attrIf("completed", "complete")
          })
      });
      

      渲染模板:

      tpl({
          tasks: [
              {
                  task: "Write concept",
                  due_date: new Date(2015, 3, 22, 0, 0, 0, 0),
                  complete: true
              }, {
                  task: "Consult with customer",
                  due_date: new Date(2015, 3, 25, 0, 0, 0, 0),
                  complete: false
              }
          ]
      });
      

      结果:

      <div id="tpl">
      
          <ul id="tasks">
              <li>
                  <span class="task" completed>Write concept</span>
                  <span class="due-date">22. 3. 2015</span>
              </li>
              <li>
                  <span class="task">Consult with customer</span>
                  <span class="due-date">25. 3. 2015</span>
              </li>
          </ul>
      
      </div>
      

      【讨论】:

        【解决方案6】:

        看看Monkberry DOM template engine

        它真的很小(压缩后只有 1.5kB)、无依赖库、服务器编译、单向数据绑定,而且速度非常快!

        这里是模板和生成代码的例子:

        <div>
          <h1>{{ title }}</h1>
          <p>
            {{ text }}
          </p>
        </div>
        

        将生成:

        var div = document.createElement('div');
        var h1 = document.createElement('h1');
        var p = document.createElement('p');
        
        div.appendChild(h1);
        div.appendChild(p);
        
           ...
        
        view.update = function (data) {
          h1.textContent = data.title;
          p.textContent = data.text;
        };
        

        Monkberry 支持iffor 和自定义标签。并且有很多渲染优化。 可以使用webpackbrowserifycli 在服务器上呈现模板。

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
        • 好的,谢谢!顺便说一句,monkberry 的文档将很快推出。深入研究;)
        【解决方案7】:

        dna.js 是一个模板引擎,可以克隆 DOM 元素 (https://dnajs.org)。

        一本书的示例模板:

        <h1>Featured Books</h1>
        <div id=book class=dna-template>
           <div>Title:  <span>{{title}}</span></div>
           <div>Author: <cite>{{author}}</cite></div>
        </div>
        

        调用以将模板的副本插入 DOM:

        dna.clone('book', { title: 'The DOM', author: 'Jan' });
        

        生成的 HTML:

        <h1>Featured Books</h1>
        <div class=book>
           <div>Title:  <span>The DOM</span></div>
           <div>Author: <cite>Jan</cite></div>
        </div>
        

        摆弄一个示例“待办事项应用程序”
        https://jsfiddle.net/uLrc7kmp

        dna.js 的创建正是为了避免构建和传递字符串模板(我是 project 维护者)。

        【讨论】:

          【解决方案8】:

          具有超能力的免费 MIT 许可 jQuery DNA Template(您可以将更改的数据重新应用到相同的 HTML 结构中,以便在任何数据更改时更新 UI...)

          https://github.com/webdevelopers-eu/jquery-dna-template/

          【讨论】:

            【解决方案9】:

            您要寻找哪种糖?原始 DOM api 对我来说总是很好用。如果您真的接受模板引擎在性能方面不好的想法,如果您想有效地构建 DOM 树,请不要使用 innerHTML。我倾向于做的只是使用 document.createElement 手动创建元素。我的模板是通过编写帮助函数创建的,这些函数创建节点集合并通过设置 .innerText 属性用数据填充它们。然后我可以缓存对我希望经常引用的节点的引用,这样我就不必遍历 DOM 树来再次找到这些节点。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-31
              • 2021-12-16
              • 1970-01-01
              相关资源
              最近更新 更多