TypeScript を使うと JavaScript のコードに型を導入することができ、コードの安全性や生産性を高めることができます。いっぽうで TypeScript は JavaScript にコンパイルしてから実行する必要があり、ちょっとしたコードの確認をするにしても一手間かかります。
そこで検証を簡単にするため、プロジェクト内のファイル変更を監視し、ファイルの変更があったら自動的に再コンパイル&実行してくれる環境を作ります。
TypeScript では、ちょっとしたコードを試したいときでもtsc
でコンパイルしてnode
で実行してと、コンソールでの作業が必要となります。コードの動きを試したかったり、ネットで見つけたおもしろいコードを動かしたいといっただけでも手間がかかります。
今回は TypeScript 用のサンドボックス・プロジェクトを用意して、手軽にコードを試せるようにします。(サンドボックスというとセキュリティモデル的な感じもしますが、今回はお砂場遊び的な感覚。最近はプレイグラウンドと言う?)
環境
本記事の開発環境は以下となります。
- Windows 10 64bit + WSL Ubuntu 18.04.1 LTS
- Visual Studio Code
- Node.js 12.2.0
- Yarn 1.15.2
- TypeScript 3.4.5
TypeScript プロジェクトの作成
いろいろなモジュールが組み合わさるので、順を追って作っていきます。
まずは基本となる TypeScript プロジェクトを作成します。
プロジェクトのディレクトリを作成し/package.json
ファイルを作ります。(今回はsandbox
という名前のディレクトリ)
devDependencies
は、常に最新版のモジュールを使いたいためにバージョンは"*"
としています。scripts: clean
は、最新のモジュールを使いやすいようにnode_modules
などを削除します。OS に依存しないようnpx rimraf
で削除しています。1
2
3
4
5
6
7
8
9
10
11
12
13{
"name": "sandbox",
"private": true,
"dependencies": {},
"devDependencies": {
"@types/node": "*",
"typescript": "*"
},
"scripts": {
"clean": "npx rimraf yarn.lock node_modules dist",
"setup": "yarn clean && yarn install --ignore-optional"
}
}
同じくプロジェクト直下にtsconfig.json
を作ります。
こちらは普段使う TypeScript の設定に合わせておくとよいでしょう。今回はesnext
で最新仕様を使い、"strict": true
でチェックを厳しくしています。
1 | { |
これで/src
ディレクトリ以下の TypeScript ファイルをコンパイルして実行する環境ができました。/src/index.ts
1 | console.debug('Hello World !'); |
コンパイルして実行。
1 | yarn tsc -p . |
ts-node で TypeScript を直接実行
コンパイルの手間をなくして、TypeScript をコンソールから直接実行できるようにします。
1 | yarn add -D ts-node@* tsconfig-paths@* |
/package.json
に以下のstart
スクリプトを追加します。(scripts
のみ抜粋)
ts-node
でsrc/index.ts
を実行。(以降、プログラム実行の起点はindex.ts
になります)- TypeScript の alias path を
ts-node
で使えるように-r tsconfig-paths/register
を登録します。1
2
3
4
5
6
7{
"scripts": {
"clean": "npx rimraf yarn.lock node_modules dist",
"setup": "yarn clean && yarn install --ignore-optional",
"start": "ts-node -r tsconfig-paths/register src/index.ts"
}
}
実行!新たに1行追加しましたがtsc
なしで動作します。また先ほど作られたdist
ディレクトリは削除して大丈夫です。/src/index.ts
1 | console.debug('Hello World !'); |
1 | yarn start |
nodemon でファイルの変更を検知して TypeScript を直接実行
さらにファイルの変更を検出して、自動的にts-node
を実行できるようにします。
1 | yarn add -D nodemon@* |
/package.json
のstart
スクリプトを修正します。(scripts
のみ抜粋)
nodemon -w src
で、nodemon
から起動しsrc
ディレクトリを監視します-x ts-node
で、nodemon
から実行するプログラムts-node
を指定しています1
2
3
4
5
6
7{
"scripts": {
"clean": "npx rimraf yarn.lock node_modules dist",
"setup": "yarn clean && yarn install --ignore-optional",
"start": "nodemon -w src -x ts-node -r tsconfig-paths/register src/index.ts"
}
}
実行!今回はyarn start
から先に始めます。
先ほどまでの Hello World, TypeScript がコンソールに表示され、その後にnodemon
が変更待ちをしている状態になります。
1 | yarn start |
ここで/src/index.ts
を変更し、保存します。
1 | console.debug('Hello World !'); |
するとファイルの変更を検知して、コンソールに新しい結果が自動的に出力されます。
1 | ...(省略) |
コードの検証で利用
実際にコードの検証で使ってみます。
最近気になったのが、こちらソート可能なUUID互換のulidが便利そう - Qiitaの記事。
よく UUID v4 でランダムな ID 発行を使っています。それに対してソート可能なランダムな ID 発行できるというのは興味深いです。記事は Python ですが Node.js/TypeScript にもulid/javascriptモジュールがあります。
モジュールを導入し、サンドボックス・プロジェクトを起動しておきます。
1 | yarn add uuid ulid |
単なるコンソール出力ですがコードを書いて保存するだけで結果が見れます。
1 | import { ulid } from 'ulid'; |
ランダムな値を生成するので保存するたびに変わるのがわかります。
“また UUID との 128 ビット互換性” ですが、表現方法は異なるようです。ソートの必要があるかはシステム次第ですが、文字数が詰まるのは良さそうです。また TypeScript 対応されているのも Good!
1 | ULID: 01DB2S8RCY1EM7XBJG6P6A2KFE |
もうひとつ、こちら日付時刻操作ライブラリをmomentからdayjsへ乗り換えた - Qiitaの記事。
普段、日時を扱う場合には Moment.js を使っていますが、もっと軽量のiamkun/dayjsがあるとのこと。
サーバサイドの開発では軽量に越したことはありませんがシビアに考えることは少ないですが、フロントでは大事なポイントです。
さっそくモジュールを導入し、サンドボックス・プロジェクトを起動しておきます。
1 | yarn add dayjs moment |
ここではコードをまとめて書いていますが、保存しながら書き足している感じで作業しています。コーディングしながらCtrl + S
して、コンソールが流れている間に次のコードといった感じです。
デフォルトのタイムゾーンとフォーマットが異なるものの、通常は ISO 文字列で使ったり、フォーマットのテンプレートを指定したりするので問題はないでしょう。2KB の軽さは魅力的です。
1 | import dayjs from 'dayjs'; |
徐々にコンソール出力が増えていくのを確認しながら、動きの差異などを確認しています。
1 | Day.js: Fri, 17 May 2019 13:52:02 GMT |
以上、ちょっとしたコードの検証に使えるサンドボックス、お砂場プロジェクトでした。
このようなプロジェクトを1つ作っておくと、TypeScript で型を調べたり、新しいライブラリの使い方を確認したりといった際に便利です。
nodemon まで入ったところで Git にコミットしておくと、散らかってもクリーンな環境へ簡単に戻せます。
私は AWS Lambda で環境変数を使うことが多いので、さらにmotdotla/dotenvも追加しています。また、TSLint もかけています。また Strict なコーディングの確認や練習のためにTSLintも設定しています。(ESLint へ引っ越さないと💦)
ソースはこちらlulzneko/sandbox