◆ Node.js より良くなってそうで興味あるけど TypeScript なのが一番の欠点

TypeScript ……なんですよね

少し前 jsConf で deno というツールの紹介があったようです

https://www.youtube.com/watch?v=M3BM9TB-8yA

英語何言ってるのかわからないし スライドもコピペで翻訳に書けられないので読むも辛いですね
日本語で紹介してくれているスライドがありました
https://speakerdeck.com/yosuke_furukawa/denofalsehua

Node.js を作った人が Node.js の良くなかった部分を改善して作った新しいツールのようです

Node.js の module がわかりづらいのはすごく納得です
ESModules が使えるようになったと言っても これまでのわかりづらいのは残りますからね
どうせなら node_modules フォルダが依存の山で異常に重くなるのもどうにかなったら良いのにと思いますが 依存バージョンの違いや同じ目的でも違うツールを使うライブラリが多いので同しようもない気がします
HTTP リクエストするだけでも request, superagent, node-fetch, axios など
いくつか必要なツールを入れたらそれらが全部中で別のを使っていたり同じだけど互換性がないバージョンだったりで同じようなツールがいっぱい入るんですよね

gyp は最近 N-API を使ったときに使ったのですが自分で gyp についていじることもなく C++ コード書いたくらいだったのでデメリットは特に感じてません
ただ python2 って書いてたので 使う時に python2 入れないといけないのは手間なので新しいツールのほうが良いと思います
N-API 使ってみたときの環境にはすでに入ってたのか特にインストールした覚えはないですけど

Promise は promisify が標準ツールであったり fs が promise 対応になるとか言ってますが 未だにコールバック式なところは多いです
2009 年というもう 10 年も前に Node.js を Promise 化しようとしたことがあるというのは私も最近知ったのですが この頃に Promise 化されていれば あの頃にコールバック地獄で苦しむことはなかったのかな とか思います

deno ではそういった色々な Node.js の問題点を解決したものだそうです
セキュアという部分が強調されてるようですが Node.js でこれと言って困ってないので私はそこはどっちでもいいです
私が良いと感じた部分は top level await があったりブラウザとの互換性重視というところです
この一文がすでに矛盾してる気もしますけど

Node.js はバージョンが頻繁に上がって 互換性なくなることは比較的多めに思いますが それでも実用されるようになってきているので大きな変更はそうそうありません
新しいものなら Node.js だと変えるのが難しいところでも 良くなるのなら変更してくれそうですし 新しく作るならでは良さがありそうです
それに作ってる人も Node.js 作った人というのですから信頼もできます


ただ 一番の問題点が TypeScript なところです
エラーがわかりづらいというのはすごく同感ですが ブラウザなら他の多くの言語よりもすぐに原因みつけて修正できるので開発環境とか Node.js 内部の問題が大きいと思います
ときどき内部のコード部分のエラーと言われて stacktrace にも役立つ情報がなくてこれどうしろと?って思うことはあります
ライブラリ使うときは 型が明示されてるほうが使う側は楽ですが 変更が多いものを作るときには面倒さのほうが増すんですよね

あとコードの読みづらさもです
最近だと TypeScript で書かれたツールを使うことも多くなってソースを見ることもあります
読んでいて思うのがゴチャゴチャし過ぎで見づらいってことです
変換後の JavaScript 見たほうがシンプルでさっと読めます
ちゃんとした想定する型を知りたいときだけ TypeScript を読む感じです
コメント部分に書いておいてくれればそれで十分なレベルです

ちゃんと構文とすることで静的にチェックができる利点はあるのですが デコレータで定義するとか m  もともとの JavaScript コードとは離してほしかったです

elm の

plus1 : Int -> Int
plus1 x = x + 1

みたいに実際の関数定義とは離されていれば苦もなく読めるのですけどね


TypeScript は JavaScript のスーパーセットなので JavaScript は TypeScript の構文としては正しいはずです
なので 実際には JavaScript 書いて使ってみるのもありかなと考えましたが 構文的には正しくて JavaScript としてはエラーもなく動くコードなのに型のある静的言語であるために コンパイル時にエラーとなるケースがあるようです

それに TypeScript ってあくまで altJS で JavaScript に変換して使うもののはずです
変換せず直接動かせるものを作ったのかなと思ったのですが v8 上で動くランタイムだそうです
やっぱり Node.js 作った人が悪かった部分を改善したツールというだけあって Node.js に近くて Node.js を置き換えるようなものです
ただ v8 って JavaScript のエンジンなのでやっぱり JavaScript に変換してるように思うのですがどうなんでしょう
それなら変換部分をスキップして v8 にコードを渡せないのでしょうか
と思ったものの v8 で動かすなら top level await みたいな JavaScript と異なる部分は変換の過程で対応してそうなので スキップしてしまったらただの JavaScript で Node.js と変わらないことになってしまう気もします

とりあえず様子見で TypeScript を使う辛さより deno の便利さが増しそうなら使ってみようかと思います