ts-nodeを使ってnode –requireする方法

2021.07.21

吉川@広島です。

アプリケーションの可変の設定値を環境変数で管理している場合、ローカル開発時に環境変数をセットする方法は

  • 端末自体に環境変数をセットする
  • アプリケーションをDockerコンテナ上で動かし、その中に環境変数をセットする
  • direnvを利用する
  • dotenvライブラリを利用する

のような選択肢があります。個人的にはdotenvを利用するのが楽と感じており、こちらを採用することが多いです。

ただ、開発時にしか利用しないdotenvを本番ソースに含みたくないという場合があるかと思います。このような場合は、nodeコマンドの--requireオプションを利用することでスマートに実現できるようです。

プログラム内でdotenvを読み込むのをやめた話 | WEB EGG

# dotenvロードを実行してからmain.jsを実行
node --require dotenv/config main.js

例に出しているmainプログラムがJavaScriptファイルならこれで良いのですが、

  • TypeScriptを採用している
  • ts-nodeを使って実行する

という場合は、どのようにすると良いのか調べてみました。

環境

  • Node.js v15.14.0
  • typescript v4.3.2
  • ts-node v10.0.0
  • dotenv v10.0.0

方法1 ts-nodeの--requireオプションを使う

ドキュメントによると、ts-node自体に--requireオプションがありました。

-r, --require [path] Require a node module before execution

というわけで下記のように実行できます。

# dotenvロードを実行してからmain.tsを実行
ts-node --require dotenv/config ./main.ts

方法2 ts-node/register APIを使う

こちらはts-nodeのregister APIを呼び出してnodeコマンドで実行する方法です。

ts-nodeでTypeScriptのコードを直接実行 & デバッグ - わくわくBank

下記のような config.js を書きます。

// ./config.js

require('source-map-support').install() // デバッグ用にあると便利
require('ts-node').register() // ts-node設定
require('dotenv').config() // dotenvロード

あとは、nodeコマンドの--requireで読み込んで実行します。

node --require ./config ./main.ts

まとめ

第一選択肢は方法1となるのではないかと思います(単純に楽なので)。

より細かい設定が必要になる場合は方法2の方が適しているのかもしれません。自分はそのシチュエーションにまだ出くわしていないのですが、調べていて方法2を発見した後、方法1(ts-node自体に--requireがあること)の存在に気づいたという経緯があるので、念のため両方紹介させて頂きました。

以上、参考になれば幸いです。

本文紹介以外の参考ページ