TypeScript のプロジェクトを作成する
何をできるようにするか?
ここでは、Node.js はインストール済みであるという前提で、次のようなことを行える TypeScript 環境を整えます。
npm run build
でsrc
ディレクトリ以下の.ts
ファイルをコンパイルする
(.js
ファイルがbuild
ディレクトリ以下に出力される)npm start
でコンパイルされたbuild/main.js
を起動する
下記のセットアップ手順の 詳しい意味はこちらを参照 していただくとして、ここでは一気にセットアップを終わらせてしまいます。
セットアップ
# アプリ用のディレクトリを作成
$ mkdir myapp
$ cd myapp
# Node.js アプリの設定ファイル (package.json) を生成
$ npm init -y
# TypeScript および Node 型情報をインストール
$ npm install typescript -D
$ npm install @types/node -D
# TypeScript の設定ファイル (tsconfig.json) を生成
$ npx tsc --init
package.json
を次のような感じで修正します。
主に scripts
の定義です。
{
"name": "myapp",
"version": "1.0.0",
"scripts": {
"start": "node build/main.js",
"build": "tsc",
"build:watch": "tsc --watch"
},
"devDependencies": {
"@types/node": "^14.14.31",
"typescript": "^4.2.2"
}
}
tsconfig.json
を次のような感じで修正します。
主に、outDir
と include
の調整です。
{
"compilerOptions": {
"target": "ES2018",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./build",
},
"include": ["./src/**/*"]
}
これで、基本的な環境構築は完了です。
動作確認
TypeScript で HelloWorld を実行してテストします。
src
ディレクトリ以下に次のような main.ts
ファイルを作成してください。
console.log('Hello World');
次のようにビルドして、起動できることを確認します。
$ npm run build
$ npm start
build/main.js
が実行されて、Hello World
と表示できれば成功です。
あとは、必要に応じて AWS SDK のパッケージをインストールして、TypeScript でプログラムを作成していきます。 例えば、S3 や DynamoDB サービスを使うプログラムを作成するのであれば、次のようにライブラリをインストールします。
$ npm install @aws-sdk/client-s3
$ npm install @aws-sdk/client-dynamodb
npm install
で NPM パッケージをインストールするとき、実行時に必要なものは --save
で、開発時のみ必要なものは --save-dev
でインストールします。
この考え方からすると、AWS SDK (@aws-sdk
) は --save
オプションでインストールするのが自然なのですが、Lambda 関数用のプロジェクトではちょっと事情が違ってきます。
なぜなら、AWS の Lambda 実行環境にはデフォルトで AWS SDK がインストールされているからです。
AWS SDK を --save
と --save-dev
のどちらでインストールすべきかは、そのプロジェクトでデプロイ用の ZIP パッケージをどう作成するかによっても変わってきます(パッケージングするときに @aws-sdk
パッケージを含めないようにするのであれば、--save
でインストールしても問題ない)。
よく分からないときは、ZIP パッケージの肥大化を防ぐため、AWS SDK はとりあえず --save-dev
でインストールしておくのがよいと思います。
(おまけ)AWS SDK Version 2 ではなく Version 3 を使う
Node.js 用の AWS SDK は 2020年12月に Version 3 が公開されました。 世の中には Version 2 のコードがあふれていますが、Version 3 には次のような利点があります。
- 使用する AWS サービスのパッケージだけを個別にインストール/インポートできる
- Version 2 では、
aws-sdk
パッケージでたくさんのパッケージを丸ごとインポートしていた - Version 3 では、例えば DynamoDB だけを使うのであれば、
@aws-sdk/client-dynamodb
だけインポートする → バンドルサイズを小さくでき、インポート時のオーバーヘッドも減らせる
- Version 2 では、
- ミドルウェアの仕組みを利用できる
- 例えば、全てのリクエストをフックして、任意のヘッダを付加することができる
- デフォルトで TypeScript に対応
- 例えば、TypeScript コードから
@aws-sdk/client-s3
をインポートすると、型付けされた S3 用クラスを扱える
- 例えば、TypeScript コードから
Version 2 と 3 では、パッケージのインポート方法も次のように異なっています。
Version 3 のパッケージ名には、先頭に @
が付くので簡単に判別できます(@aws-sdk
というプレフィックスは、AWS SDK チームが開発したパッケージであることを示しています)。
// SDK 全体のインポート
import * as AWS from 'aws-sdk';
// モジュールを個別にインポート
import { DynamoDB } from 'aws-sdk';
// DynamoDB クライアントを使用する(V3 のコマンドベースの API (send) を使う場合)
import { DynamoDBClient, ListTablesCommand } from '@aws-sdk/client-dynamodb';
// DynamoDB を使用する(V2 のような API を使う場合)
import { DynamoDB } from '@aws-sdk/client-dynamodb';
今から AWS SDK for JavaScript (Node.js) を使う場合は、余計なオーバーヘッドを防ぐためにも、Version 3 の方を使い、XxxxClient
のようなクラスを個別にインポートする 方法をお勧めします。
さらに、デフォルトで TypeScript の型情報が提供されているので、できるだけ TypeScript でコーディングするようにしましょう。