7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【覚書】ts-node で Node.js のバッチを書く

Last updated at Posted at 2021-05-28

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"
  }
}
7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?