ゆるふわ技術日誌

エンジニア見習いの悪戦苦闘日記

Webフレームワーク調査 Express編 #200

12月の目標

12月の目標を決めました。

Webサービスを作る上で使えそうなライブラリの調査をしていきます。

もちろん調べるだけじゃなくて実際に使ってみて、どんな思想で作られているかとか、そのライブラリを使うメリット・デメリットについてもちゃんと考えることにします。

コレに決めた理由はまぁいろいろあるのですが書くと長いのでまぁ機会があれば語ります。

Express

Express - Node.js web application framework

これです。多分Node.jsのWebフレームワークでは一番有名?でしょうか。Star数は35000以上。

とにかくミニマルなフレームワークというのが特徴のようです。

どのくらいミニマルかというと

  • 認証
  • DBとの接続
  • 設計に関する規約

このへんが何もなくて、本当にルーティングなどの最低限の機能だけを持っていて、必要な機能は自分で用意するというスタイル。

最低限、何かのリクエストに対してレスポンスを返すというだけであれば

const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(3000, () => console.log('Example app listening on port 3000!'))

(公式より引用)

これで/にアクセスするとHello World!が返ってくるはず。

エンドポイントごとにファイルを分けたいみたいな感じなら、こうなる

これがエントリのファイル。

const PORT =3000;
const app = require('express')();
const users = require('./routes/users')

app.get('/', (req, res) => {
  res.send('Hello, express!');
});

app.use('/users', users);

app.listen(PORT, () => {
  console.log(`Listening on port ${PORT}.`);
});

で、routes/users.js

const router = require('express').Router();

// /users/に対するgetリクエストがココに来る
router.get('/', (req, res) => {
  // 実際はDBへのアクセスなどをする。
  // その部分も分離したいね。
  res.json([
    {
      id: 1,
      name: '保登心愛'
    }
  ])
});

module.exports = router;

こういう感じで超シンプル。

ただ、↑のやつみたいにルーティングしてるところでDBへのアクセスとかやり始めたら最後、崩壊する未来が見えるので、その辺の設計をちゃんとやってやらないといけないのがおもしろくもあり、大変なポイントなんだろうと。

メリット

仕様が究極なまでにシンプルなので、自分のやりかた・設計がある人にとってはフレームワークにとらわれずに実装に移せるというのがいいところなのかなと。

ソースコードにでてくるapp.get()とかapp.use() の中の関数のことをExpressではmiddlewareと呼んでいるみたいで、ソースコードを上から順番に実行していって条件にかかったミドルウェアを実行することで各機能を実現するというやり方らしい。

もちろんミドルウェアを自分で書くこともできて、認証機能などをつけたいときは、ミドルウェアで実装することになる。ミドルウェアは内部でnext()が呼ばれると次のミドルウェアに処理を渡すこともできるし、その場でレスポンスを返すこともできる。

このシンプルさ、素敵かもしれない。

デメリット

どう書いても動く反面、ちゃんとした設計とかがないと密結合なメンテナビリティの低いコードが生まれそう。

結論

結論が出せるほど触れる時間がなかったので保留で。

雑談

ライブラリ調査、何を試すのがそのライブラリの良さとかを理解するのに都合がいいのだろうか。