2016-04-22 7 views
1

私はJVMとScalaJSの両方でコンパイルするライブラリ用のScalaコードをいくつか持っています。Scala.JSには、実行中のプラットフォームを取得するための呼び出しがありますか?

今私はjsとjvmプロジェクトに特別なコードがない "純粋な"プロジェクトを持っています。私はintellijの統合と他のいくつかの要因のためにそのように保ちたいと思います。

しかし、私はJVMかJSかに基づいて変更する必要がある小さなコード(1-2行)を持っています。これを達成する簡単な方法が私のプロジェクト構造全体を変更する必要はありません。

基本的には、JavaScriptを使用している場合はtrueを返し、それ以外の場合はfalseを返すようにしたいと思います。

答えて

5

Scala.jsではできないAPIをJVM上で拡張する必要があるため、標準はありません。

小さなobject Platformで、js/サブプロジェクトとjvm/サブプロジェクトの2つの異なる実装で簡単に構築できます。たとえば、JSの場合、次のようになります。

object Platform { 
    final val isJS = true 
    final val isJVM = false 
} 

もちろん、非純粋である必要があります。あなたは、その機能だけを提供する小さなライブラリでそれを抽象化することもできます。例えばcatalystsplatformプロジェクトがそうです。

あなたは完全に純粋で、依存関係のない保持したい場合は、あなたがハックに頼る必要があります:

val isJS = 1.0.toString == "1" 

これはJVM上、1.0.toStringリターン"1.0"、ために動作しますが、JSの上に、それは"1"を返します。あなたが行うことができます

+0

おかげで、のtoStringハックは、私が望んでいたまさにです。私がもっと必要とするならば、私はプロジェクトの構造を変えて行くでしょうが、これは私が今必要な小さなもののために完全に動作します。 –

1

val isJS = System.getProperty("java.vm.name") == "Scala.js" 
+1

これは簡単で信頼できる方法ですが、 'java.util'パッケージの重要な部分を.jsファイルに持ち込むので、コードサイズが大きくなることに注意してください。 (既に他の場所で 'java.util.Map'を使っているのであれば大したことではありませんが、そうでなければ大きな違いができます) – sjrd

関連する問題