過去のJS相互運用
このページでは、レガシーと見なされるDartのJS相互運用の以前のバージョンについて説明します。まだ非推奨ではありませんが、将来的には非推奨になる可能性があります。したがって、今後 はdart:js_interop
を使用し、可能であれば古い相互運用ライブラリの使用を移行することをお勧めします。dart:html
や他のWebライブラリは密接に関連していますが、package:web
ページで説明しています。
dart:js
#dart:js
は、JSオブジェクトと相互運用するための具体的なオブジェクトラッパー
を公開しました。このラッパーには、ラップされたJSオブジェクトのプロパティを動的に取得、設定、および呼び出すための文字列ベースのメソッドが含まれていました。ラッピングコストのためパフォーマンスが低下し、人間工学的に使いにくいものでした。たとえば、相互運用メンバーを宣言できず、文字列に依存していたため、コード補完はできませんでした。allowInterop
など、dart:js
で公開されている機能の多くは、後に他の相互運用ライブラリを通じて再公開されました。
このライブラリは、package:js
とdart:js_util
がリリースされて以来、レガシーとなっています。おそらく最初に非推奨になるでしょう。
package:js
#package:js
は、相互運用型とメンバーを宣言する機能を導入しました。これにより、ユーザーは相互運用拡張型ではなく相互運用クラスを作成できました。実行時には、これらのクラスはdart:js_interop
のJSObject
に似た型に消去されました。
@JS()
class JSType {}
package:js
のユーザーは、dart:js_interop
の構文とセマンティクスに精通しているでしょう。多くの場合、クラス定義を拡張型に置き換えることで、dart:js_interop
に移行できる可能性があります。
ただし、大きな違いがいくつかあります。
package:js
型は、ブラウザAPIとの相互運用に使用できませんでした。dart:js_interop
型は使用できます。package:js
は動的ディスパッチを許可していました。つまり、package:js
型をdynamic
にキャストして相互運用メンバーを呼び出すと、正しいメンバーに転送されます。これは、dart:js_interop
ではできなくなりました。package:js
の@JS
は、external
メンバーの戻り値の型がチェックされないため、健全性を保証しません。dart:js_interop
は健全です。package:js
型は、インスタンスメンバーの名前を変更したり、external
以外のメンバーを持つことができませんでした。package:js
型は、相互運用以外のクラスのサブタイプになり、スーパータイプになる可能性がありました。これはモックによく使用されました。dart:js_interop
では、JSオブジェクトを代わりに置き換えることによってモックが行われます。モックに関するチュートリアルを参照してください。@anonymous
型は、オブジェクトリテラルコンストラクタを使用して相互運用型を宣言する方法でした。dart:js_interop
はこの方法で型を区別せず、external
名前付き引数コンストラクタはオブジェクトリテラルコンストラクタです。
@staticInterop
#@JS
と@anonymous
に加えて、package:js
は後に@staticInterop
を公開しました。これは、相互運用拡張型のプロトタイプでした。これは、dart:js_interop
と同じくらい表現豊かで制限的であり、拡張型が利用可能になるまでの一時的な構文となることを意図していました。
@staticInterop
型は暗黙的にJSObject
に消去されました。静的セマンティクスのみを使用できるように、ユーザーはすべてのインスタンスメンバーを拡張で宣言する必要があり、より強力な健全性保証がありました。ユーザーはこれを使用してブラウザAPIと対話することができ、名前の変更やexternal
以外のメンバーなども許可されていました。相互運用拡張型と同様に、動的ディスパッチはサポートされていませんでした。
@staticInterop
クラスは、ほとんどの場合、クラスを拡張型に変更し、アノテーションを削除するだけで、相互運用拡張型に移行できます。
dart:js_interop
は、拡張型が言語に追加されるまで静的相互運用セマンティクスをサポートするために、@staticInterop
(および@anonymous
。ただし、@staticInterop
も使用されている場合のみ)を公開しました。このような型はすべて、拡張型に移行する必要があります。
dart:js_util
#dart:js_util
は、package:js
型で宣言できなかった、または値をやり取りするために必要な多くのユーティリティ関数を提 供しました。これには、次のようなメンバーが含まれていました。
allowInterop
(現在はFunction.toJS
)getProperty
/setProperty
/callMethod
/callConstructor
(現在はdart:js_interop_unsafe
にあります)- さまざまなJS演算子
- 型チェックヘルパー
- モックのサポート
- その他。
dart:js_interop
とdart:js_interop_unsafe
には、これらのヘルパーが、場合によっては別の構文で含まれています。
特に明記されていない限り、このサイトのドキュメントはDart 3.5.3を反映しています。ページの最終更新日:2024年5月13日。 ソースを表示 または 問題を報告する.