now.sh で Koa + TypeScript

2019/11/10 13:19:032020/06/03 00:53:20

日報書きまくってるテナントと同時にブログが成立するのかというやつで、とりあえず知見があるやつを1記事書いてみる。
追記: Vercelになった。この記事はもう古くなってるかもしれません

まえおき
now.sh というサービスがある。構成ファイルをちょといと書いてコマンド打つだけでデプロイしてアプリとして公開してくれるすぐれものである。無料枠もかなり寛容で、非常に便利に使わせてもらっている。
同類のサービスとして glitch というのもあるが、これはまた色々方向性やできることが違うので、これもまた気が向いたら別の記事として書き起こしたいと思う。関連記事: /ci7lus/glitch
今回は公式ドキュメントに記載があったようななかったような感じがする Koa + TypeScript のような構成でパシッとアプリをデプロイしてみよう〜という記事である。内容的にはペラッペラなので、そこらへんは勘弁してほしい。

設定ファイル
実際に該当の構成で運用しているものに拙作の tobiuo というアプリがある。ソースコードは こちら で公開している。
  • このサービスは webpush のサーバサイドデコードという珍しい(?)処理を行っているので、これに関しての簡易な解説記事でもう1記事書けそうではあるのだが、今は置いておく。
TypeScript アプリとしては src にメインのコードを持って dist に js を吐き出すタイプのメジャーな構成である。
最近の now.sh は zero-config を謳い始めていて、簡易な静的ホスティング用途であれば本当に設定ファイルが不要なようなのだが(かなり限られたシチュエーションを決め打ちしている気もする…)、TypeScript でアプリをデプロイしてほしい場合、これは now.json の用に設定ファイルをルートディレクトリに要求する。
以下が上記レポジトリに公開されているのと同じ設定ファイルである。

now.json
{ 
    "version": 2, 
    "name": "tobiuo", 
    "routes": [{ 
        "src": "/(.*)", 
        "dest": "src/index.ts" 
    }], 
    "builds": [{ 
        "src": "src/**/*.ts", 
        "use": "@now/node@canary", 
        "config": { 
            "maxLambdaSize": "25mb" 
        } 
    }, { 
        "src": "src/**/*.pug", 
        "use": "@now/static" 
    }], 
    "env": { 
        "IS_NOW": "true", 
        "ENDPOINT": "@tobiuo-endpoint", 
        "SECRET_KEY": "@tobiuo-secret-key", 
        "BRANCA_KEY": "@tobiuo-branca-key", 
        "CLIENT_ID": "@tobiuo-client-id", 
        "CLIENT_SECRET": "@tobiuo-secret" 
    } 
}
now.sh の変わったところとしては、デプロイ指定として dist や package.json での build などの記述を要求しない。
builds に src 以下の ts 拡張子のファイルを @now/node@canary でデプロイするように指定し、routes に dist ではなく ts ファイルに対し直接 dest を指定する。
また、pug を用いている部分に関しては static で保持を指定しないと捨てられてしまうので注意。

アプリの渡し方
また、サービスサイドに対してアプリを渡す方法について、index.ts より抜粋してみる。

index.ts
const run = async () { 
    const port = process.env.PORT || 5000 
    app.listen(port, () => { 
    	console.log(`started on http://localhost:${port}`) 
    }) 
} 
 
run()
フロートしては、default export として app.callback() を送出し、env をみて IS_NOW でなければアプリを listen しない処理となっている。
  • ただし、この記述に関してはかなり自信がないので(実は普通に listen しても聞いてくれないか?)、実はそうじゃないよ〜って場合は著者 Twitter などにリプライを寄越してほしい。
  • 現在は普通に listen すれば拾ってくれます!(2020/02/13)

おわりに
永遠にちゃんとした文章にならないので「公開」があるブログは継続が難しいが、常に下書き状態を公開してしまうような感覚の[/ 要出典] Scrapbox ならまあ中途半端な状態でもいっかという感じでどうにか心をもたせて書いてみた。
完走した感想としては、文章を書くのがやっぱり苦手ということがよーくわかったのでしばらく書きたくないという感じです(お仕事で書かなければなりませんが…)。
おわり。


著者の画像

ci7lus

@ci7lus

Caramelize - Made withCaramelizeand / Privacy