前提条件
以下手順を実施済み
1. パッケージのインストール
typescript
本体と、typescript
での開発をサポートするパッケージをインストールします。
> npm i -D typescript ts-node @types/node
-
ts-node
:.ts
ファイルを、コマンドライン上で直接実行できるようにするモジュール。 -
@types/node
: Nodejs の型定義ファイル。Nodejs のモジュールを使用する場合に必要。
コマンドラインで実行する場合は、以下のようにします。
> npx tsc -v
Version 4.7.4
2. 設定ファイルの作成
以下コマンドを実行することで、プロジェクトルート直下にtsconfig.json
ファイルが作成されます。
> npx tsc --init
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
各オプションのより詳しい内容は、公式のドキュメントで確認できます。
3. コンパイラオプションの修正
作成したtsconfig.json
ファイルを修正します。
{
"compilerOptions": {
"baseUrl": ".", // 非絶対モジュール名を解決するためのベースディレクトリを設定
"target": "es6", // サポートするJS機能の設定
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true, // 大文字と小文字を区別
"strict": true,
"types": ["node"],
"outDir": "dist"
},
"include": ["src"]
}
これは、src
ディレクトリ内の*.ts
ファイルをコンパイルして、dist
ディレクトリへCommonJS
形式のモジュールとして出力するようにした設定です。
4. スクリプトの追加
typescript
でのビルド実行を容易にするため、スクリプトを追加します。
{
...,
"scripts": {
"prebuild": "rimraf dist",
"build": "tsc"
}
}
これで、npm run build
コマンドの発行でビルドが行えるようになります。
5. Typescript ファイルの用意
ここまでで基本的なtypescript
実行環境が整ったので、試しに.ts
ファイルを用意して実行してみます。
まず、コンパイラオプションのinclude
でsrc
を指定しているため、プロジェクトルート直下にsrc
ディレクトリを作成します。
> mkdir src
次に、作成したsrc
ディレクトリ内に任意のファイル名で.ts
ファイルを作成し、以下のように記述します。
この例では、index.ts
とします。
export function hello(v: string): void {
console.log(`Hello ${v}`);
}
これは、コンソールにHello <引数>
と出力するだけの関数をhello
という名前でエクスポートしています。
名前付きエクスポートなので、例えば以下のような実行スクリプトを用意して使用することができます。
import { hello } from './src';
hello('World!');
このファイルはコンパイルに含めない為、src
ディレクトリ内に作成する必要はありません。
ここでは、プロジェクトルート直下に作成しています。
6. ts-node
で実行する
作成した実行スクリプトを、コマンドラインで実行します。
> npx ts-node temp.ts
Hello World!
コンソールにHello World!
と表示されていれば成功です。
7. コンパイルの実行と動作確認
tsc
コマンドを使用することで、.ts
ファイルをコンパイルできます。
ここまでの手順で既に準備は整っているので、npm run build
コマンドを実行するだけです。
> npm run build
プロジェクトルート直下にdist
ディレクトリが作成され、その中にindex.js
ファイルが作成されていれば成功です。
試しに、以下のような実行スクリプトを作成して動作を確認してみます。
const { hello } = require('./dist');
hello('World!');
> node temp.ts
Hello World!
8. ESM
(ESM Modules システム)形式で出力
ここまででNodejs
環境で利用できるライブラリを作成できるようになりましたが、このままでは esm
(ES Modules システム)から利用することができません。
これを解決する為、ビルドを実行する際にESM
形式のファイルを同時に出力するよう設定を追加します。
tsconfig.json
の修正と、CommonJS
用の設定ファイル追加
ESM
出力用の設定ファイルを追加する前に、tsconfig.json
の設定が共通項目のみとなるよう修正して、CommonJS
出力用のtsconfig.cjs.json
ファイルを別途追加します。
{
"compilerOptions": {
"baseUrl": ".", // 非絶対モジュール名を解決するためのベースディレクトリを設定
"target": "es6", // サポートするJS機能の設定
"moduleResolution": "node",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true, // 大文字と小文字を区別
"strict": true,
"types": ["node"]
},
"include": ["src"]
}
{
"extends": ".",
"compilerOptions": {
"module": "CommonJS",
"outDir": "dist/cjs"
}
}
ESM
出力用の設定ファイルを追加
プロジェクトルート直下に、tsconfig.esm.json
ファイルを作成します。
{
"extends": ".",
"compilerOptions": {
"declaration": true,
"declarationMap": true,
"module": "es6",
"outDir": "dist/esm"
}
}
NPM スクリプトの修正
package.json
のscripts
を修正します。
{
...,
"scripts": {
"prebuild": "rimraf dist",
"build": "run-p build:*",
"build:cjs": "tsc -p tsconfig.cjs.json",
"build:esm": "tsc -p tsconfig.esm.json"
},
}
これで、npm run build
を実行すると、ESM
形式のファイルが同時に出力されるようになります。
また、出力先は以下のようになります。
-
dist/cjs/index.js
: CommonJS -
dist/esm/index.js
: ESModules
9. ESM
形式での実行と動作確認
通常、Nodejs
はCommonJS
形式で動作しますが、package.json
のtype
フィールドで、JSファイルのモジュール形式を指定できます。
{
"type": "module"
}
この状態でtemp.js
ファイルを以下のように書き換えて、node
コマンドで実行してみます。
import { hello } from './dist/esm/index.js'
hello('World!');
> node temp.js
Hello World!
Hello World!
と表示されていれば成功です。