TypeScriptのコンパイル(トランスパイル)が爆裂に遅いことの対策を考える

Posted on Posted in 趣味的なIT・ネットの話題

Raspberry Pi上でTypescriptのコンパイルをやってみようと思い、tscを実行してみたところ、コマンドラインにもどって来ません。あれ、コンパイラが壊れているのかなと思っていたら、その後で戻ってきます。単に時間がかかっていただけのようです。tscには計測機能がついているのでコンパイル時間を計ってみるとこの通り。

なにか凄いコードをコンパイルしたとか言うわけでは無く、公式のこの5行のコードを食わせただけです。

どうもlib.d.tsというTypeScriptのライブラリのパースとチェックに時間がかかっている模様。

tsc is slow to process lib.d.ts · Issue #3298 · Microsoft/TypeScript · GitHub

たしかに先の結果でも対象行が凄い量になっています。ライブラリをくっつけずにコンパイルするとこの通り大分と早くなります。

ただライブラリを付けないと意味が無いので、ライブラリ部分のチェックだけ外してみると最初よりは大分と早くなっています。ただ開発していてストレスがかかるレベルですね。rpi2でこれなのでrpi1とかだとどうなるんだろう。

で、これではお話にならないので対策を考えることにします。rpi2に入れたnodeで動かしたいので最初からちゃんとリモートで動く環境を作りたいんです。

そもそもライブラリをチェックしたりコンパイルする必要も無いのだから、プリコンパイルしてリンクの時だけくっつけたらいいのでは無いかと思い検索したら同じ事を考えている人がいました。

How to use compiler API to hold lib.d.ts in precompiled form · Issue #2030 · Microsoft/TypeScript · GitHub

が、この方法だとソースの中身をいじる必要がありそうなのでパス。自分はそもそも今からTypeScriptを覚えようとしている段階なので、覚える前にソースをいじらないといけないというのでは順序が逆なので。

次に考えたのが、atom-typescriptにはtsの保存と同時にjsを生成する機能があるので、それを使えばいいというソリューション。自分はRemote-FTPパッケージを使っているので、もともとリモートファイルをローカルファイルの様に編集できているので、リモートのtsを編集して保存すると同時にjsができれば簡単です。が、Remote-FTPがリモートのファイルを更新してくれるのは、エディタ画面上で保存ボタンを押したときのみで、atom-typescriptが自動生成するファイルをリモートに保存してくれる訳ではありませんでした。

この延長線上で考えたのがRemote-FTPにはローカルとリモートを同期させる機能があるので、これを使うという手。しかしファイルを更新する都度syncを実行するのは面倒です。それをやっている間に3.94秒経ちそう。

でもって次に考えたのがローカルのファイル変更を検出して自動的にリモートにアップロードするという方法。調べてみるとOSXならOS標準の機能だけで実行できそうです。

OSXのLaunchAgentでホストOSのファイル監視してリモートサーバーにrsyncして同期する方法 – Qiita

が、設定ファイルを見て気が重くなったのと、ファイル変更を検知するプロセスが常駐するというのはマシンの負荷が増えそうなのが気になります。この設定をした直後はいいんですが、開発が終わったらこの設定をしたことを忘れてしまって、OSを再インストールするまで常駐しそう。

で、結局採用したのが、リモートのフォルダをそのままマウントする方法。一番ありきたりな手段に落ち着きました。

SSHFS (SSH Filesystem) – Raspberry Pi Documentation

使い方はなんてことはなくてこの通り実行するだけ。最初リモートでsshfsというサーバーが稼働するのかと思い、piの方でapt-getを実行してしまいました。これはクライアントサイドでsshをラップしてリモートをマウントしているように見せるためのものですね。

マウントするとローカルのマウントポイントの名前とアイコンが変わりました。

スクリーンショット 2016-03-05 8.11.10

マウントしてローカルのatomでtsファイルを更新したら(5行目のgreeterを康雄にしました)、リモートのjsが更新されています。

スクリーンショット 2016-03-05 8.08.47

マルチバイト文字でも問題なし。

スクリーンショット 2016-03-05 8.10.02

とりあえずこれでTypeScriptの学習を進めます。


Facebooktwittergoogle_pluspinterestlinkedinmail
納得したらすぐにシェア!