您知道在新的 JavaScript 中那些超级酷的 反引号字符串 吗?
let emotion = `happy`;
let sentence = `Chris is feeling ${emotion}`;
除了其中的变量插值非常方便之外,它们还可以完美地处理多行字符串,使它们非常适合用于 HTML 代码块。
const some_html = `
<div class="module">
<h2>${data.title}</h2>
<p>${data.content}</p>
</div>
`;
看起来与 JSX 没有太大区别,对吧?!也许我们会将其作为 React 组件来使用。
class MyModule extends React.Component {
render() {
return
<div class="module">
<h2>{this.props.title}</h2>
<p>{this.props.content}</p>
</div>;
}
}
但是,如果我们真的不需要 React 或任何其他相当庞大的 JavaScript 框架呢?
如果我们**唯一想要**的是渲染 HTML 模板以及在需要时**高效地重新渲染它们**的能力,就像 React 所知的那样呢?
据我了解,这就是像 lit-html 这样的项目存在的意义。在我撰写本文时,它是 Google 和 Polymer 团队的一个相当新的库。
它允许您使用常规模板字面量定义 HTML 模板,如下所示。
import { html, render } from './lit-html.js';
const helloTemplate = (data) => html`
<div class="module">
<h2>Hello ${data.name}!</h2>
<p>${data.content}</p>
</div>
`;
然后,您调用 render 函数,将该模板、数据以及您希望渲染的位置传递给它。
let data = {
name: "Chris",
content: "Just trying to figure stuff out."
}
render(helloTemplate(data), document.body);
然后假设数据发生变化……您再次调用 render。
data.name = "Sammy";
render(helloTemplate(data), document.body);
这就是 lit-html 闪耀的地方。它足够聪明,可以**仅**更新 DOM 中需要更新的部分。
这里有一个小对比,其中一些数据发生了变化,然后模板重新渲染。如果我们使用 innerHTML 渲染整个内容,那么整个 DOM 都会发生变化。使用 lit-html,它只会更改较小的内部部分。
这是一个简短的视频,您可以看到 DOM 更新的差异。
还有一个类似的项目。我不太了解它,但它有点旧,而且我相信它更加健壮。它被称为 HyperHTML。
HyperHTML 也允许您创建模板并渲染它们。最重要的是,可以**高效地重新渲染**它们。
这是一个演示,其中数据来自 Quotes on Design API 并插入到模板中。
查看 Chris Coyier 在 CodePen 上创建的笔 尝试 HyperHTML (@chriscoyier)。
这些小型库的存在确实很酷,它们可以为我们做一些有用的事情,因此当出现这种情况时,我们希望某个大型库具有的功能,但又不想使用整个大型库,我们就可以选择更小的方案。
相关:https://twitter.com/ebidel/status/763843570327441409
这是在 Polymer 峰会上介绍 lit-html 的视频:https://www.youtube.com/watch?v=ruql541T7gc&feature=youtu.be
非常感谢 Chris 的这篇文章,很高兴看到 hyperhtml 和 lit-html 每天都越来越受关注!
如果我可以建议对您的 hyper 示例进行一个小改动,
<a href=${data.link}>(link)</a>
实际上是渲染该链接所需的一切(属性不需要数组,也不需要引号)。我还创建了一个 hyper 与 lit 的对比,尽管 lit-html 仍处于早期阶段,可能还没有完全更新,但至少开发人员可以更好地了解使用一个微型库或另一个微型库可以实现的功能。
最后但并非最不重要的一点是,如果您想将此模式与大多数著名的框架进行比较,有一个页面可以做到这一点,它完全由模板字面量到 DOM 驱动 ;-)
我在 Google 演示文稿中的示例中注意到了这一点。您能否解释为什么不需要引号?如果用户数据中最终出现在 data.link 值中的属性中存在空格或其他字符,会发生什么情况,这会导致属性中断?
如果您愿意,可以使用引号,尽管 React 用户通常不会为属性加引号。
无论如何,文档 解释了您想知道的关于 hyperHTML 属性的几乎所有内容。
此外,请不要将 hyperHTML 与 Google lit-html 混淆,因为 hyperHTML 诞生于 7 个月前,它不是 Google 库。
您是否真的提供了证据证明一种方法比另一种方法更有效?我没有看到任何数据来对比两者。
仅仅因为更新了更多/更少的 DOM 似乎并不能证明效率。可能有一个潜在的假设,即所有 DOM 更新都比您可以执行的任何其他操作都效率低下。
此外,由于引号中更新的文本没有包装元素,因此它并不能清楚地表明仅更新了文本而不是整个元素。它只显示浏览器以这种方式突出显示它。
我还要质疑,即使存在性能差异,成本是多少?通常(非常频繁)追求性能对项目有害,直到最后阶段,我认为这可能为时已晚,无法更改库/代码库以实现目标。
好的,我看了这个视频(Chris 在评论中链接了它)。
在这个视频中,他将 lit-html 称为“实验”、“抢先体验/预览”,并且它是“非常非常实验性的,并且正在开发中”。叹息
当 Google 将其从测试版中发布出来时,请告诉我。然后,我将采用最好的想法,并自己动手。我现在对框架感到焦虑。我过去 20 年中构建的所有使用框架的系统都不得不进行更新,仅仅因为框架进行了更新。原生 JS,我来了。在我看来,Google 在支持其库、API、服务等的方面,拥有任何科技公司中**最差**的记录。毫无疑问。Lit-html 最好的想法最终会出现在其他地方,我不会用我敌人最糟糕的键盘和文本编辑器去碰它。
他吹捧 JavaScript 字符串字面量,我同意,这是模板的未来。也许胡须和字面量之间会以某种方式结合起来?(或类似的东西)
他说 Lit-html 的主要目标是在更新 DOM 时提高性能。我预测这最终会变得不那么重要,因为从该系统(以及他提到的许多其他类似系统)中提出的任何新功能都将添加到 JS 或浏览器中,或者浏览器本身只会使 DOM 更新更快、更高效。就像 jQuery 的选择器系统被吸收到 JS/CSS 的核心一样。(querySelector() 和 querySelectorAll() 有人用吗?)
(终于从这个视频中了解了 React JSX 的工作原理……它不是真正的 js 或 html,它是由预处理器渲染的,恶心。我不确定它为什么会如此流行,也许我老了,但我认为所有这些东西都是昙花一现。)
我认为使用模板字面量的任何示例都没有正确转义 HTML。不应该使用转义吗?在这个例子中,我使用的是
lodash.escape
hyperHTML 会自动转义,除非您通过数组或通过
{html: content}
选择作为 HTML。我认为 Chris 故意将插值保留在数组中,让您进行操作,但 lit-html 和 hyperHTML 默认情况下都是安全/转义的。
您可以在这两个项目的文档中找到更多信息。无需使用 lo-dash(hyperHTML 也会提供转义功能,如果您出于某种原因确实需要它)。
好吧,React 有 Redux 或 MobX,一个存储,更轻松地与后端交互的方式,但我明白了这种精神。
不确定它有多容易,但 viperHTML 在 NodeJS 上提供了 1:1 兼容的 API。
当前最快的 HNPWA (hnpwa.com) 确实由后端的 viperHTML 提供支持,作为 100% 的 SSR,并在客户端稍后获取,共享完全相同的模板,通过 hyperHTML。
hyperHTML 项目值得更多关注。我期待尝试一下。它看起来很有希望!
非常有趣,对我来说最重要的一点是……简单!
您还可以使用 FetchAPI 而不是 axios。
我喜欢 JSRender,它是另一个类似的项目——由 jQuery Templates 的创建者开发,可以追溯到过去。
https://www.jsviews.com/#jsrplaying
这又是另一种需要记住的模板语法,这里的区别在于您使用的是原生模板字面量插值:无需学习任何新东西 ;-)
嘿,又一个
https://github.com/stasm/innerself