[Node.js] Express を TypeScript で書く - 環境整備まで

# 背景

backendをexpress、frontendをreactでシステムを構築するための練習として、
簡単なblogシステムを作ろうかなと思い、手を出してみました。

言語は typescript が好きなのでそれを活かしたプロジェクト作りをしていきたい。

この記録は環境構築の手順とか設計から製造までの記録を残してこうかなと。

# 前提とか

環境は以下を前提としてます。

- Windows 10
- Node.js 10.10.0
- Express 4.16.3
- TypeScript 3.0.3
- Visual Studio Code 1.26.1

# 準備とか

## パッケージのインストール

`npm` はインストール済みであることを前提。

フォルダを作り、まずはいつもの `npm init` (たまに忘れる)

```bash
npm init
```

パッケージのインストール

```bash
npm install --save express
```

```bash
npm install --save-dev @types/express
npm install --save-dev typescrpt
npm install --save-dev tslint tslint-config-airbnb
npm install --save-dev awesome-typescript-loader source-map-loader
npm install --save-dev webpack-node-externals
```

webpackを使うのでまだインストールしてない人はこちらもやる。

```
npm install -g webpack webpack-cli
```

## フォルダ構成

```
(root)
- /dist
- /node_modules
- /src
  - server.ts (エントリーポイント)
- package-lock.json
- package.json
- tsconfig.json
- tslint.json
- webpack.config.js
```


## 設定ファイル書き書き

とりあえず最低限のもののみ。必要になったら更新します。

```json:package.json(一部抜粋)
{
    "scripts": {
        "start": "node dist/server.js"
    },
}
```

```json:tsconfig.json
{
    "compilerOptions": {
        "outDir": "./dist",
        "sourceMap": true,
        "module": "es6",
        "target": "es5",
        "moduleResolution": "node",
        "removeComments": true
    },
    "include": [
        "./src/**/*"
    ]
}
```

```json:tslint.json
{
    "extends": ["tslint-config-airbnb"],
    "rules": {
        "ter-indent": [true, 4]
    }
}
```

```js:webpack.config.js
const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
    mode: 'production',

    entry: './src/server.ts',

    output: {
        filename: 'server.js',
        path: path.join(__dirname, 'dist')
    },

    devtool: 'source-map',

    resolve: {
        extensions: ['.ts', '.js', '.json']
    },

    module: {
        rules: [
            {
                test: /\.ts$/,
                loader: 'awesome-typescript-loader'
            },
            {
                enforce: 'pre',
                test: /\.js$/,
                loader: 'source-map-loader'
            }
        ]
    },

    externals: [
        nodeExternals()
    ]
}
```

webpackの書き方は Typescript公式に乗ってるものを参考に少し書き換えた。
[React & Webpack - Typesciprt](https://www.typescriptlang.org/docs/handbook/react-&-webpack.html)

# 動作テスト用サンプルコード

```ts:src/server.ts
import * as Express from 'express';

const app = Express();

app.get('/', (req: Express.Request, res: Express.Response, next: Express.NextFunction) => {
    return res.send('Hello Nyanko.');
});

app.listen(3000, () => {
    console.log('Listen on port 3000.');
});

export default app;
```

expressの知識は初心者なので文法的にこれでいいのかとかは今は置いておく。
今日は動けばよい。

# ビルドと実行

## ビルド

```bash
webpack
```

## 実行

```bash
npm start
```

## テスト

ブラウザでテストしてもいいのだけど、今後の事を考えて Chrome拡張の ARC(Advenced REST Client) を利用してます。GUIで出来るだけでなく、送信するヘッダや本文などを編集できたり履歴を残したりできるのでAPI開発には便利だとおもいます。

[Advenced REST Client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=ja)

![chrome_2018-09-04_11-14-45.png](https://qiita-image-store.s3.amazonaws.com/0/81478/a1d01718-f3c7-10f5-2ce4-240ff56c82b5.png)

`http://localhost:3000/` にアクセスし、 `Hello Nyanko` が帰ってきたのでOK。

次はexpressをつかったルートマッピングとかそこらへん。

[[Node.js] Express を TypeScript で書く - ルーティング編](https://qiita.com/kuroneko8960/items/1e6dcd0d897b42567319)