Package Exports
- lit-html
- lit-html/async-directive.js
- lit-html/directive-helpers.js
- lit-html/directive.js
- lit-html/directives/async-append.d.ts
- lit-html/directives/async-append.d.ts.map
- lit-html/directives/async-append.js
- lit-html/directives/async-append.js.map
- lit-html/directives/async-replace.d.ts
- lit-html/directives/async-replace.d.ts.map
- lit-html/directives/async-replace.js
- lit-html/directives/async-replace.js.map
- lit-html/directives/cache.d.ts
- lit-html/directives/cache.d.ts.map
- lit-html/directives/cache.js
- lit-html/directives/cache.js.map
- lit-html/directives/class-map.d.ts
- lit-html/directives/class-map.d.ts.map
- lit-html/directives/class-map.js
- lit-html/directives/class-map.js.map
- lit-html/directives/guard.d.ts
- lit-html/directives/guard.d.ts.map
- lit-html/directives/guard.js
- lit-html/directives/guard.js.map
- lit-html/directives/if-defined.d.ts
- lit-html/directives/if-defined.d.ts.map
- lit-html/directives/if-defined.js
- lit-html/directives/if-defined.js.map
- lit-html/directives/live.d.ts
- lit-html/directives/live.d.ts.map
- lit-html/directives/live.js
- lit-html/directives/live.js.map
- lit-html/directives/ref.d.ts
- lit-html/directives/ref.d.ts.map
- lit-html/directives/ref.js
- lit-html/directives/ref.js.map
- lit-html/directives/repeat.d.ts
- lit-html/directives/repeat.d.ts.map
- lit-html/directives/repeat.js
- lit-html/directives/repeat.js.map
- lit-html/directives/style-map.d.ts
- lit-html/directives/style-map.d.ts.map
- lit-html/directives/style-map.js
- lit-html/directives/style-map.js.map
- lit-html/directives/template-content.d.ts
- lit-html/directives/template-content.d.ts.map
- lit-html/directives/template-content.js
- lit-html/directives/template-content.js.map
- lit-html/directives/unsafe-html.d.ts
- lit-html/directives/unsafe-html.d.ts.map
- lit-html/directives/unsafe-html.js
- lit-html/directives/unsafe-html.js.map
- lit-html/directives/unsafe-svg.d.ts
- lit-html/directives/unsafe-svg.d.ts.map
- lit-html/directives/unsafe-svg.js
- lit-html/directives/unsafe-svg.js.map
- lit-html/directives/until.d.ts
- lit-html/directives/until.d.ts.map
- lit-html/directives/until.js
- lit-html/directives/until.js.map
- lit-html/hydrate.js
- lit-html/polyfill-support.js
- lit-html/private-ssr-support.js
- lit-html/static.js
Readme
lit-html 2.0 Pre-release
Efficient, Expressive, Extensible HTML templates in JavaScript
🚨 About this pre-release
This is a major version pre-release of lit-html 2.0. See issue #1182 for the full list of changes planned/considered for this release.
This pre-release is not yet feature complete or API stable. Please note the breaking changes, known issues, and limitations below, and use at your risk until the stable release is available. Issues are welcome for unexpected changes not noted below or in the changelog.
🚨 Breaking changes
While lit-html
2.0 is intended to be a backward-compatible change for the
majority of 1.x users, please be aware of the following notable breaking
changes:
- New
directive
andPart
API (see below for migration info) render()
no longer clears its container on first render- Custom
templateFactory
,TemplateProcessor
, and custom tag functions are no longer supported - The
polyfill-support.js
file must be loaded when using thewebcomponents
polyfills
See the full changelog for more details on these and other minor breaking changes.
🚨 Migrating directives
While the API for using directives should be 100% backward-compatible with
1.x, there is a breaking change to how custom directives are authored. The API
change improves ergonomics around making stateful directives while providing a
clear pattern for SSR-compatible directives: only render
will be called on the
server, while update
will not be.
Expand here for details on migrating directives.
Overview of directive API changes
1.x API | 2.0 API | |
---|---|---|
Code idiom for directive | function that takes directive arguments, and returns function that takes part and returns value |
class with update & render methods which accept directive arguments |
Where to do declarative rendering | pass value to part.setValue() |
return value from render() method |
Where to do imperative DOM/part manipulation | directive function | update() method |
Where state is stored between renders | WeakMap keyed on part |
class instance fields |
How part validation is done | instanceof check on part in every render |
part.type check in constructor |
Example directive migration
Below is an example of a lit-html 1.x directive, and how to migrate it to the new API:
1.x Directive API:
import {directive, NodePart, html} from 'lit-html';
// State stored in WeakMap
const previousState = new WeakMap();
// Functional-based directive API
export const renderCounter = directive((initialValue) => (part) => {
// When necessary, validate part type each render using `instanceof`
if (!(part instanceof NodePart)) {
throw new Error('renderCounter only supports NodePart');
}
// Retrieve value from previous state
let value = previousState.get(part);
// Update state
if (previous === undefined) {
value = initialValue;
} else {
value++;
}
// Store state
previousState.set(part, value);
// Update part with new rendering
part.setValue(html`<p>${value}</p>`);
});
2.0 Directive API:
import {html} from 'lit-html';
import {directive, Directive, PartType} from 'lit-html/directive.js';
// Class-based directive API
export const renderCounter = directive(
class extends Directive {
// State stored in class field
value = undefined;
constructor(partInfo: PartInfo, index?: number) {
super(partInfo, index);
// When necessary, validate part in constructor using `part.type`
if (partInfo.type !== PartType.CHILD) {
throw new Error('renderCounter only supports child expressions');
}
}
// Any imperative updates to DOM/parts would go here
update(part, [initialValue]) {
// ...
}
// Do SSR-compatible rendering (arguments are passed from call site)
render(initialValue) {
// Previous state available on class field
if (this.value === undefined) {
this.value = initialValue;
} else {
this.value++;
}
return html`<p>${this.value}</p>`;
}
}
);
lit-html
Overview
lit-html
lets you write HTML templates in JavaScript with template literals.
lit-html templates are plain JavaScript and combine the familiarity of writing HTML with the power of JavaScript. lit-html takes care of efficiently rendering templates to DOM, including efficiently updating the DOM with new values.
import {html, render} from 'lit-html';
// This is a lit-html template function. It returns a lit-html template.
const helloTemplate = (name) => html`<div>Hello ${name}!</div>`;
// This renders <div>Hello Steve!</div> to the document body
render(helloTemplate('Steve'), document.body);
// This updates to <div>Hello Kevin!</div>, but only updates the ${name} part
render(helloTemplate('Kevin'), document.body);
lit-html
provides two main exports:
html
: A JavaScript template tag used to produce aTemplateResult
, which is a container for a template, and the values that should populate the template.render()
: A function that renders aTemplateResult
to a DOM container, such as an element or shadow root.
Installation
$ npm install lit-html
Development mode
lit-html includes a development mode which adds additional checks that are reported in the console.
To enable development mode, add the development
exports condition to your node
resolve configuration.
@web/dev-server
{
nodeResolve: {
exportConditions: ['development'],
}
}
Rollup
{
plugins: [
nodeResolve({
exportConditions: ['development'],
}),
],
}
Webpack
NOTE: Requires Webpack v5
{
resolve: {
conditionNames: ['development'],
}
}
Contributing
Please see CONTRIBUTING.md.