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.version
やprocess.versions
のように、直接それぞれのグローバルオブジェクトを触っても安全ですが、TypeScriptで、@types/node
とdeno.d.ts
を共存させるのは面倒なので、ここではglobalThis
経由で触っています。