スクリプトがdartvmまたはdart2jsで実行されているかどうかを確認する方法はありますか?たぶんミラーAPIを使用していますか?
7 に答える
私の知る限り、公式の方法はありません。目的は、すべての実用的な目的で、ネイティブを実行しているのか、JavaScriptにコンパイルされているのかを知る必要がないことです。
とはいえ、使用できるハックはほとんどありません。最も簡単な方法は、Dartには2つの数値型がint
ありdouble
、JavaScriptにはDartと同等の1つしかないという事実を利用することです。double
また、dart2jsにはまだ特別な実装がありint
ません。したがって、identical(1, 1.0)
はfalse
Dartにあり、VMはそれを正しく実装しますが、JSにコンパイルすると、になりますtrue
。
このようなハックを使用する前に、かなりよく考える必要があることに注意してください。ほとんどの場合、それを行う必要はありません。Dartを作成するだけで、JSを実行しているかどうかを認識しようとはしません。また、誰もそれが永遠に機能することを保証することはできません。
パス ライブラリ(Dart v0.7.2)にあるコード フラグメントに基づく:
import 'dart:mirrors';
/// Value indicating that the VM is Dart on server-side.
const int DART_SERVER=1;
/// Value indicating that the VM is Dart on client-side.
const int DART_CLIENT=2;
/// Value indicating that the VM is JavaScript on client-side (e.g. dart2js).
const int JS_CLIENT=3;
/// Returns the type of the current virtual machine.
int vmType() {
Map<Uri, LibraryMirror> libraries=currentMirrorSystem().libraries;
if(libraries[Uri.parse('dart:io')]!=null) return DART_SERVER;
if(libraries[Uri.parse('dart:html')]!=null) return DART_CLIENT;
return JS_CLIENT;
}
/// Application entry point.
void main() {
print(vmType());
}
dart.js はスクリプト .dart を .dart.js に変換するため、次のように動作します。
bool _isDart() => document.getElementsByTagName("script").where((s) => s.src.endsWith(".dart.js")).isEmpty;
私はこれについて考えてきましたが、実際には、ブラウザが Dart をサポートしているかどうかを確認する方法があります (これはほとんど同じです) navigator.webkitStartDart
。これは、ブラウザーが Dart をネイティブにサポートしているかどうかを判断するときに、Dart をブートストラップする dart.js ファイルが使用するものであるため、JavaScript 相互運用機能を使用して同じことを行うことができます。
Dartiumでtrue
実行している場合は次のアプリが返されますが、 ChromeまたはFirefoxで実行している場合は次のようになります。false
import 'dart:html';
import 'package:js/js.dart' as js;
void main() {
print("Is Dart? = ${isDart()}");
}
bool isDart() => js.scoped(() {
try {
// will throw exception if it doesn't exist
var dartExists = js.context.navigator.webkitStartDart;
return true;
}
on NoSuchMethodError {
return false;
}
});
pubspec は次のようにする必要があります。
name: webkitstart
description: A sample web application
dependencies:
browser: any
js: any
ただし、別の回答に関する@Ladicekの警告は引き続き有効です。
ほとんどの場合、それを行う必要はありません。Dart を記述するだけで、JS を実行しているかどうかを認識しようとはしません。
更新- このソリューションでは、スクリプトがブラウザベースの dartvm で実行されているかどうかは実際にはわかりません。dartvm がブラウザで使用できることだけがわかります。ただし、- を含む標準のスクリプト タグを使用してアプリをデプロイすると、ブラウザにpackages/browser/dart.js
dart-vm があれば、確実に dart-vm でアプリが開始されます。アプリの .dart.js バージョンのみを明示的にリンクし、dart.js スクリプトへの参照を削除した場合にのみ、JavaScript でアプリを実行できます。
すなわち、これ:
<!-- will use dart-vm if available, fallback to JS if not -->
<script type="application/dart" src="example.dart"></script>
<script src="packages/browser/dart.js"></script>
これに対して:
<!-- will only use JS, even if dart vm is available -->
<script type="application/dart" src="example.dart.js"></script>