LoginSignup
6

More than 3 years have passed since last update.

Node.jsとDenoをそれぞれ検出する方法 with globalThis

Posted at

UniversalなJavaScript/TypeScriptを書くなら、Node.jsとDenoそれぞれ双方で動くコードを書きたいものです。

おそらく時間はかかるけど、確実な方法は、DenoモジュールをNode.jsに移植するという力業でしょう。Node.jsやオンブラウザで動くDeno互換モジュールさえあれば解決しそうです。

ただ、それはさておいて、まずはNode.jsとDenoをそれぞれ判別するところから初めてみます。

if ("Deno" in globalThis) {
  console.log("Deno", globalThis.Deno.version.deno);
  globalThis.Deno.exit(0);
}

if ("process" in globalThis) {
  console.log("Node", globalThis.process.versions.node);
  globalThis.process.exit(0);
}

console.log("unknown environments");

このコードをDenoで動かすと

$ deno hoge.ts
Deno 0.21.0

のように、Deno 0.21.0というバージョン情報を取得できます。

$ node hoge.ts
Node 12.6.0

Node.jsの方ではTypeScriptではなくJavaScriptとして実行してますが気にしないでください。

ひとまず、globalThisといういささか気持ち悪いグローバルオブジェクトに、Denoが定義されていればDeno環境で、processが定義されていればNode.jsだと判定して良いと思います。

本当はglobalThis.process.versions.nodeまで見た方が確実ではあります。

判別したあとは、型定義があればDeno.versionprocess.versionsのように、直接それぞれのグローバルオブジェクトを触っても安全ですが、TypeScriptで、@types/nodedeno.d.tsを共存させるのは面倒なので、ここではglobalThis経由で触っています。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6