闪电般快速的模板与 Web Components:lit-html 与 LitElement

宣布我们的下一代 Web 开发库正式发布。

Photo of Justin Fagnani
Justin Fagnani

今天我们很高兴地宣布我们两个 下一代 Web 开发库的首个正式版本: lit-htmlLitElement

lit-html 是一个轻量、快速、富有表现力的 HTML 模板库。LitElement 是一个用于创建带有 lit-html 模板的 Web Components 的简单基类。

如果你一直在关注这些项目,你可能已经知道 lit-html 和 LitElement 是什么了(你也可以跳到最后)。如果你是 lit-html 和 LitElement 的新手,请继续阅读以了解概述。

lit-html:一个轻量、快速的 HTML 模板库

lit-html 是一个轻量(打包、压缩和 gzip 后仅 3k 多)且快速的 JavaScript HTML 模板库。lit-html 与函数式编程方法配合良好,让你能够以声明式的方式表达应用的 UI,将其作为状态的函数。

const myTemplate = (name) => html`
<div>
Hi, my name is ${name}.
</div>
`;

渲染一个 lit-html 模板非常简单:

render(myTemplate('Ada'), document.body);

重新渲染模板时只会更新已更改的数据:

render(myTemplate('Grace'), document.body);

lit-html 是高效的、富有表现力的、可扩展的:

  • 高效。lit-html 速度极快。当数据发生变化时,lit-html 不需要进行任何 diff 操作;相反,它会记住你在模板中插入表达式的位置,并且只更新这些动态部分。

  • 富有表现力。lit-html 赋予你 JavaScript 的全部能力、声明式 UI 和函数式编程模式。lit-html 模板中的表达式就是 JavaScript,因此你不需要学习自定义语法,可以充分利用语言的所有表达能力。lit-html 原生支持多种类型的值:字符串、DOM 节点、数组等。 模板本身也是值,可以被计算、在函数之间传递,也可以嵌套。

  • 可扩展:lit-html 也是可定制和可扩展的——属于你自己的模板构建工具包。指令(directives)可以定制值的处理方式,支持异步值、高效的键控重复、错误边界等。lit-html 包含多个开箱即用的指令,并且让你可以轻松定义自己的指令。

许多库和项目已经集成了 lit-html。你可以在 GitHub 上的 awesome-lit-html 仓库中找到其中一些库的列表。

如果模板功能是你所需要的全部,你可以立即开始使用 lit-html 文档。如果你想构建可以在应用中使用或与团队共享的组件,请继续阅读以了解更多信息。

LitElement:一个轻量级的 Web Component 基类

LitElement 是一个轻量级基类,它让构建和共享 Web Components 变得比以往任何时候都更容易。

LitElement 使用 lit-html 来渲染组件,并添加了用于声明响应式属性和特性的 API。当属性发生变化时,元素会自动更新。而且它们的更新速度很快,无需 diff 操作。

这是一个简单的 LitElement 组件:

@customElement('name-tag')
class NameTag extends LitElement {
@property()
name = 'a secret';

render() {
return html`<p>Hi, my name is ${this.name}!</p>`;
}
}
class NameTag extends LitElement {
static properties = {
name: {},
};

constructor() {
super();
this.name = 'a secret';
}

render() {
return html`<p>Hi, my name is ${this.name}!</p>`;
}
}
customElements.define('name-tag', NameTag);

这会创建一个你可以在任何使用常规 HTML 元素的地方使用的元素:

<name-tag name="Ida"></name-tag>

如果你已经在使用 Web Components,你会很高兴地听到它们现在在 Chrome、Safari 和 Firefox 中已获得原生支持。Edge 的支持也即将推出,polyfill 仅在旧版浏览器中才需要。

如果你是 Web Components 的新手,你应该试一试!Web Components 让你能够以与其他库、工具和框架互操作的方式扩展 HTML。这使得它们非常适合在大型组织内共享 UI 元素、为 Web 上任何地方使用的组件发布组件,或构建像 Material Design 这样的 UI 设计系统。

你可以在任何使用 HTML 的地方使用自定义元素:在主文档中、在 CMS 中、在 Markdown 中,或在使用 React 和 Vue 等框架构建的视图中。你还可以将 LitElement 组件与其他 Web Components 混合使用,无论它们是使用原生 Web 技术编写的,还是借助 Salesforce Lightning Web Components、Ionic 的 StencilSkateJSPolymer 库等工具创建的。

开始使用

想试试 lit-html 和 LitElement?LitElement 教程是一个很好的起点:

如果你有兴趣单独使用 lit-html,或将 lit-html 模板集成到另一个项目中,请参阅 lit-html 文档:

一如既往,请告诉我们你的想法。你可以在 DiscordTwitter 上联系我们。我们的项目是开源的(当然!),你可以在 GitHub 上报告 bug、提交功能请求或建议改进:

阅读更多文章