Lit 3 アップグレードガイド

Lit 1.x から Lit 2.x への移行については、Lit 2 アップグレードガイドを参照してください。

Lit 3.0 は、Lit 2.x からの破壊的変更が非常に少ないです

  • IE11 はサポートされなくなりました。
  • Lit の npm モジュールは、ES2021 として公開されるようになりました。
  • Lit 2.x のリリースで非推奨とマークされた API は削除されました。
  • SSR ハイドレーションサポートモジュールは、@lit-labs/ssr-client パッケージに移動しました。
  • 型のみ: ReactiveElementrenderRootcreateRenderRoot() の型が更新されました。
  • Babel デコレータのバージョン "2018-09" のサポートが削除されました。
  • TypeScript の実験的デコレータと標準デコレータの間で、デコレータの動作が統一されました。
    • その結果、TypeScript を使用している場合は、両方の種類のデコレータの更新された型を取得するために、少なくとも TypeScript v5.2 にアップグレードする必要があります。

ほとんどのユーザーにとって、Lit 2 から Lit 3 へのアップグレードに必要なコード変更はありません。ほとんどのアプリとライブラリは、"^2.7.0 || ^3.0.0" のように、npm バージョン範囲を拡張して 2.x と 3.x の両方を含めることができます。

Lit 2.x と 3.0 は相互運用可能です。Lit のあるバージョンからのテンプレート、基本クラス、ディレクティブは、別のバージョンのものと連携します。

Lit 2 は ES2019 として公開され、Lit 3 は最新のブラウザとビルドツールで広くサポートされている ES2021 として公開されています。古いブラウザバージョンをサポートする必要があり、現在のツールが ES2021 を解析できない場合は、これは破壊的変更となる可能性があります。

Webpack 4 の内部パーサーは、ES2021 で導入された構文である nullish 合体演算子 (??)、論理代入 (??=)、オプションチェーン (?.) をサポートしていないため、それらに遭遇すると Module parse failed: Unexpected token をスローします。

推奨される解決策は、これらの新しい JS 構文の解析をサポートする Webpack 5 にアップグレードすることです。ただし、それができない場合は、babel-loader を使用して Lit 3 コードを変換し、Webpack 4 で動作させることができます。

Webpack 4 で Lit 3 をトランスパイルするには、次の必要な babel パッケージをインストールします

そして、次のものと同様の新しいルールを追加します(プロジェクトに応じて変更が必要になる場合があります)

JavaScript デコレータは最近、TC39 によって標準化され、4 段階の標準化プロセスのステージ 3 にあります。ステージ 3 は、VM やコンパイラなどの JavaScript 実装が安定した仕様を実装し始める段階です。TypeScript 5.2 と Babel 7.23 は最近、標準を実装しました。

つまり、標準デコレータ、TypeScript の実験的デコレータ、および Babel が実装した以前の提案(バージョン "2018-09" など)など、複数のバージョンのデコレータ API が存在します。

Lit 2 は TypeScript の実験的デコレータと Babel の "2018-09" デコレータをサポートしていましたが、Lit 3 は標準デコレータと TypeScript の実験的デコレータをサポートするようになりました。

Lit 3 のデコレータは、Lit 2 の TypeScript デコレータとほぼ下位互換性があります。- **ほとんどの場合、変更は必要ありません**。

実験的モードと標準デコレータモードの両方で Lit デコレータの動作を統一するために、いくつかの小さな破壊的変更が必要でした。

Lit 3.0 での Lit デコレータの動作の変更

Lit 2.x プロジェクトに非推奨警告がない場合は、このリストの影響を受けることはありません。

ReactiveElementUpdatingElement エイリアスを削除しました

“ReactiveElement の UpdatingElement エイリアスの削除”へのパーマリンク

UpdatingElementReactiveElement に置き換えます。これは、UpdatingElementReactiveElement のエイリアスであったため、機能的な変更ではありません。

lit-element からのデコレータの再エクスポートを削除しました

“lit-element からのデコレータの再エクスポートの削除”へのパーマリンク

Lit 3.0 のビルトインデコレータは、lit-element によってエクスポートされなくなり、代わりに lit/decorators.js からインポートする必要があります。

非推奨の queryAssignedNodes(slot: string, flatten: bool, selector: string) デコレータのシグネチャを削除しました

“非推奨の queryAssignedNodes(slot: string, flatten: bool, selector: string) デコレータのシグネチャの削除”へのパーマリンク

セレクターを受け取る queryAssignedNodes の使用を queryAssignedElements に移行します。

セレクターのない使用は、オプションオブジェクトを受け取る必要があります。

litlit-elementlit-html からサーバーサイドレンダリングの実験的なハイドレーションモジュールを削除しました

“lit、lit-element、lit-html からサーバーサイドレンダリングの実験的なハイドレーションモジュールの削除”へのパーマリンク

実験的なハイドレーションサポートは、コアライブラリから @lit-labs/ssr-client に移動しました。

[型のみ]: renderRootcreateRenderRoot() の型が更新されました

“[型のみ]: renderRoot と createRenderRoot() の型が更新されました”へのパーマリンク

これは、ランタイムへの影響のない型のみの変更です。

ReactiveElement.renderRoot の型は Element | ShadowRoot から HTMLElement | DocumentFragment に変更され、ReactiveElement.createRenderRoot() の戻り値の型は HTMLElement | ShadowRoot から HTMLElement | DocumentFragment に変更されました。これにより、それらは互換性を持つようになり、lit-html の render() とも一貫性を持つようになりました。

この変更は、単に this.renderRoot にアクセスするコードには一般的に影響を与えません。ただし、以前の型に対して明示的な型注釈があったコードは更新する必要があります。

オプション: 標準デコレータへのアップグレード

“オプション: 標準デコレータへのアップグレード”へのパーマリンク

Lit 3 は標準デコレータのサポートを追加しますが、TypeScript ユーザーは実験的デコレータを使用することをお勧めします。これは、TypeScript と Babel のコンパイラからの標準デコレータのエミットされたコードが現在非常に大きいためです。

ブラウザが標準デコレータをサポートするか、新しい Lit コンパイラでデコレータ変換サポートをリリースしたときに、本番環境で標準デコレータをお勧めします。

しかし、標準デコレータを今すぐ試すことができ、TypeScript 5.2 以降と @babel/plugin-proposal-decorators プラグインを使用する Babel 7.23 で動作します。

TypeScript 5.2以降をインストールし、`tsconfig`ファイルに` "experimentalDecorators"`の設定が存在する場合は削除してください。

Babel 7.23以降と@babel/plugin-proposal-decoratorsをインストールしてください。プラグインには"version": "2023-05"オプションを必ず渡してください。

デコレータフィールドに`accessor`キーワードを追加する

「デコレータフィールドにaccessorキーワードを追加する」へのパーマリンク

標準デコレータは、デコレートするクラスメンバーの種類を変更することはできません。ゲッターとセッターを作成する必要があるデコレータは、既存のゲッターとセッターに適用する必要があります。これをより人間工学的にするために、デコレータ標準では、クラスフィールドに適用されると「自動アクセサ」を作成するaccessorキーワードを追加しています。自動アクセサはクラスフィールドと非常によく似ていますが、プライベートストレージによってバックアップされたプロトタイプにアクセサを作成します。

@property()@state()@query()@queryAll()@queryAssignedElements()、および@queryAssignedNode()デコレータには、accessorキーワードが必要です。

標準デコレータは、直接適用されているクラスメンバーのみを置き換えることができます。Litデコレータはプロパティの設定をインターセプトする必要があるため、デコレータはセッターに適用する必要があります。これは、ゲッターにデコレータを適用するというLit 2の推奨事項とは異なります。

@property()@state()では、これは自動的に行われるため、セッター内のthis.requestUpdate()呼び出しを削除することもできます。requestUpdate()を呼び出さないようにする必要がある場合は、noAccessorプロパティオプションを使用する必要があります。

@property()@state()では、プロパティを設定するときに、古い値を取得するためにデコレータによってゲッターが呼び出されることに注意してください。これは、ゲッターとセッターの両方を定義する必要があることを意味します。

変更前

変更後