JSPM

  • Created
  • Published
  • Downloads 2869619
  • Score
    100M100P100Q190722F
  • License BSD-3-Clause

HTML templates literals in JavaScript

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

Build Status Published on npm Join our Slack Mentioned in Awesome lit-html

🚨 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 and Part 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 the webcomponents 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 a TemplateResult, which is a container for a template, and the values that should populate the template.
  • render(): A function that renders a TemplateResult 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.