TypeScript でバッチを書いたり簡易サーバー立てたりしたいと思ったけど、
あんまり余計なものを入れないでやりたいので、その方法を調べた。
基本
まず ts-node を入れる。
npm i typescript ts-node @types/node
tsconfig.json はこうする。
{
"compilerOptions": {
"module": "ESNext"
}
}
package.json は以下の内容を追記する。
--experimental-loader=ts-node/esm
することで ts-node 経由で実行され、
--es-module-specifier-resolution=node
することで import 時の拡張子省略が許容される。
こうしないと、ERR_UNKNOWN_FILE_EXTENSION
だの ERR_MODULE_NOT_FOUND
だの
ERR_UNSUPPORTED_DIR_IMPORT
だの言われる。
{
"scripts": {
"start": "node --experimental-loader=ts-node/esm --es-module-specifier-resolution=node path/to/index.ts"
}
}
Cannot use import statement outside a module
対策
Cannot use import statement outside a module
と怒られたら、
package.json に { "type": "modules" }
を追記する。
もしルートの package.json に"type": "modules"
を書きたくない場合は、
作業ディレクトリを分けて、その中に { "type": "modules" }
とだけ書いた package.json を置けばいい。
./
+- package.json (書き換えたくない)
`- path/to/
+- index.ts
`- package.json (これを追加する)
ホットリロードに対応する
nodemon を入れる。
npm i nodemon
以下の serve を追記する。
{
"scripts": {
"serve": "nodemon -x \"npm start\" -w path/to/**/* -e ts,json"
}
}
これで path/to/**/*
の ts, json ファイルが変更された時、npm start が実行される。
まとめ
npm i typescript ts-node @types/node nodemon
{
"type": "module",
"scripts": {
"start": "node --experimental-loader=ts-node/esm --es-module-specifier-resolution=node path/to/index.ts",
"watch": "nodemon -x \"npm start\" -w path/to/**/* -e ts,json"
}
}
{
"compilerOptions": {
"module": "ESNext"
}
}