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経由で触っています。