目次

過去のJS相互運用

このページでは、レガシーと見なされるDartのJS相互運用の以前のバージョンについて説明します。まだ非推奨ではありませんが、将来的には非推奨になる可能性があります。したがって、今後 はdart:js_interopを使用し、可能であれば古い相互運用ライブラリの使用を移行することをお勧めします。dart:htmlや他のWebライブラリは密接に関連していますが、package:webページで説明しています。

dart:js

#

dart:jsは、JSオブジェクトと相互運用するための具体的なオブジェクトラッパーを公開しました。このラッパーには、ラップされたJSオブジェクトのプロパティを動的に取得、設定、および呼び出すための文字列ベースのメソッドが含まれていました。ラッピングコストのためパフォーマンスが低下し、人間工学的に使いにくいものでした。たとえば、相互運用メンバーを宣言できず、文字列に依存していたため、コード補完はできませんでした。allowInteropなど、dart:jsで公開されている機能の多くは、後に他の相互運用ライブラリを通じて再公開されました。

このライブラリは、package:jsdart:js_utilがリリースされて以来、レガシーとなっています。おそらく最初に非推奨になるでしょう。

package:js

#

package:jsは、相互運用型とメンバーを宣言する機能を導入しました。これにより、ユーザーは相互運用拡張型ではなく相互運用クラスを作成できました。実行時には、これらのクラスはdart:js_interopJSObjectに似た型に消去されました。

dart
@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_interopdart:js_interop_unsafeには、これらのヘルパーが、場合によっては別の構文で含まれています。