ページをリロードしたらtypescriptをビルドする

typescriptを書いてると毎回手動でビルドするのが面倒なので ツールを使ってコードが保存されたら勝手にビルドするようにしますが
あれ、やりすぎじゃね?
保存のたびにビルドしてたらmacがホッカホカになっちゃうよ!

実行時する直前にビルドしてくれれば十分

開発中はこまめに動作確認しながら作っていくので、ビルドは実行直前にしてくれれば十分。
なのでそうゆうスクリプトを書きました。

作った

ソースはこれ

// ビルド設定
const jsFile = './docs/js/main.js';
const buildScript = `tsc src/main.ts --outFile ${jsFile}`;

// 標準ライブラリの読み込み
const http = require('http');
const fs = require('fs');
const exec = require('child_process').exec;

function createServer(
  buildScript,
  jsFile,
  contentType, // 任意, デフォルト: 'text/javascript'
  hostname,    // 任意, デフォルト: '127.0.0.1'
  port         // 任意, デフォルト: 3000
) {
  contentType = contentType || 'text/javascript';
  hostname = hostname || '127.0.0.1';
  port = port || 3000;

  http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', contentType);

    exec(buildScript, (err, body) => {
      if(err) {// ビルド失敗
        console.log(err);
        console.log(body);

        // エラーメッセージの取得 (改行等を適当にエスケープする)
        const message = body.split('\n').join('\\n').split("'").join("\\'");
        res.end(`alert('${message}')`);
      } else {// ビルド成功
        // 生成されたjsを返す
        res.end(fs.readFileSync(jsFile, 'utf8'));
      }
    })
  })
  .listen(port, hostname, () => console.log(`Server running at http://${hostname}:${port}/`));
}

// 実行
createServer(buildScript, jsFile);

これを実行した状態でhtmlの中に

<script src=”http://localnost:3000/” />

て書いて、webページをリロードすればOK。
リロードするとビルドが実行されて、ビルド後のjsを返します。
もしもビルドエラーになったらalertでエラーメッセージが表示されます。

こりゃ便利。

やってることは
シェル実行して、指定したファイルを返すだけなので ビルド対象はtypescriptでなくても動きます。
haxeとかkotlinjsとかscalajsとか。

これでホッカホカmacから脱却できるー。