8

スクリプトがdartvmまたはdart2jsで実行されているかどうかを確認する方法はありますか?たぶんミラーAPIを使用していますか?

4

7 に答える 7

8

私の知る限り、公式の方法はありません。目的は、すべての実用的な目的で、ネイティブを実行しているのか、JavaScriptにコンパイルされているのかを知る必要がないことです。

とはいえ、使用できるハックはほとんどありません。最も簡単な方法は、Dartには2つの数値型がintありdouble、JavaScriptにはDartと同等の1つしかないという事実を利用することです。doubleまた、dart2jsにはまだ特別な実装がありintません。したがって、identical(1, 1.0)falseDartにあり、VMはそれを正しく実装しますが、JSにコンパイルすると、になりますtrue

このようなハックを使用する前に、かなりよく考える必要があることに注意してください。ほとんどの場合、それを行う必要はありません。Dartを作成するだけで、JSを実行しているかどうかを認識しようとはしません。また、誰もそれが永遠に機能することを保証することはできません。

于 2013-02-02T10:04:31.070 に答える
7

パス ライブラリ(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());
}
于 2013-09-18T00:04:12.257 に答える
3

dart.js はスクリプト .dart を .dart.js に変換するため、次のように動作します。

bool _isDart() => document.getElementsByTagName("script").where((s) => s.src.endsWith(".dart.js")).isEmpty;
于 2013-11-12T21:25:17.683 に答える
2

私はこれについて考えてきましたが、実際には、ブラウザが Dart をサポートしているかどうかを確認する方法があります (これはほとんど同じです) navigator.webkitStartDart。これは、ブラウザーが Dart をネイティブにサポートしているかどうかを判断するときに、Dart をブートストラップする dart.js ファイルが使用するものであるため、JavaScript 相互運用機能を使用して同じことを行うことができます。

Dartiumtrue実行している場合は次のアプリが返されますが、 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.jsdart-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>
于 2013-02-02T16:10:30.017 に答える