AdonisJS(アドニスJS)についてアウトプット ～概要～

業務で**AdonisJS**というフレームワークを利用する機会があったので、概要をまとめていこうと思います。

# AdonisJSとは
- **TypeScriptベース**のフルスタックWebフレームワークです
- **LaravelやRails**と似ている部分が多くあり、これらの開発に慣れている人は導入しやすい
  - Laravelのようにルーティング、コントローラ、ORMなど公式パッケージが提供されています
- **MVCパターン**を採用しています
- 2015年に**Harminder Virkさん**が作り、そこから複数人のコアチームで開発が続けられ、2025年4月現在はver6がリリースされています
- **MITライセンス**の下で配布されている
- ベンチマーク・オリンピックで勝つために**機能を削る**のではなく、**現実の問題を解決する**ことに主眼を置いて開発されたようです


# シェア
[npm trends](https://npmtrends.com/@adonisjs/core-vs-react-vs-vue)によると、ReactやVuejsと比べてまだまだ利用者は少ないようです。
調べてみてもAdonisJSについて記事を書いている方は少ないです。

[公式ドキュメント](https://docs.adonisjs.com/guides/preface/introduction)は英語ですが充実しています。

![スクリーンショット 2025-04-09 142016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/ae7a4e1a-105e-4ae5-aad6-5108dfcdfad9.png)



# 機能
AdonisJSでプロジェクトを作る際には、選択肢として以下の4つから選ぶことになります。
- **Web starter kit**：テンプレートエンジン（EdgeJS）を使った昔ながらのWeb開発を行う人向け
- **Inertia starter kit**：InertiaJSを使ってSPAを作成する人向け。フロントエンドとしてはVue3・React・Svelte・Solid.jsが利用できます
- **API starter kit**：API開発をする人向け。画面が必要な場合は、フロントエンドはVuejsやReactなど任意のものを利用する
- **Slim starter kit**：コア部分とでデフォルトのフォルダ構造のみ必要で、それ以外は自分たちで構築していく人向け


# やってみた
最後にAPIプロジェクトを作って、疎通出来るか試してみます。
前提として、**nodejsバージョン20以上**が必要になります。

## APIプロジェクト作成
プロジェクトを作成します。

APIでは以下について選択することでプロジェクトを作成できます。
- **スターターキット**：Web、Inertia、API、Slimのいずれか
- **認証**：セッション、アクセストークン、Basic認証のいずれか
- **DB**：Sqlite、PostgreSQL、Mysql、Microsoft SQL Serverのいずれか

```bash
npm init adonisjs@latest adonis-api-sample

> create-adonisjs adonis-api-sample


     _       _             _         _ ____  
    / \   __| | ___  _ __ (_)___    | / ___|
   / _ \ / _` |/ _ \| '_ \| / __|_  | \___ \
  / ___ \ (_| | (_) | | | | \__ \ |_| |___) |
 /_/   \_\__,_|\___/|_| |_|_|___/\___/|____/


> Which starter kit would you like to use ...  Press <ENTER> to select
  Slim Starter Kit A lean AdonisJS application with just the framework core
 Web Starter Kit Everything you need to build a server render app
>  API Starter Kit AdonisJS app tailored for creating JSON APIs
  Inertia Starter Kit Inertia app with a frontend framework of your choice

> Which authentication guard you want to use ...  Press <ENTER> to select
> Session Authenticate users using cookies and session
  Access Token Authenticate clients using API tokens
  Basic Auth Authenticate users using HTTP Basic Auth
  Skip I want to configure the Auth package manually

> Which database driver you want to use ...  Press <ENTER> to select
  SQLite
  LibSQL
  MySQL
> PostgreSQL
  MS SQL

> Download starter kit (1.46 s)
  Downloaded "github:adonisjs/api-starter-kit"
> Install packages
  [ wait ] installing dependencies   .
> Prepare application
> Configure Lucid
> Configure Auth

╭──────────────────────────────────────────────────────────────────╮
│    Your AdonisJS project has been created successfully!          │
│──────────────────────────────────────────────────────────────────│
│                                                                  │
│    > cd adonis-api-sample                                        │
│    > npm run dev                                                 │
│    > Open http://localhost:3333                                  │
│    >                                                             │
│    > Have any questions?                                         │
│    > Join our Discord server - https://discord.gg/vDcEjq6        │
│                                                                  │
```

ディレクトリ構成としては以下になります。
※見づらいので3階層まで表示

```bash:API Starter Kit
tree -L 3 -I node_modules*

.
|-- ace.js
|-- adonisrc.ts
|-- app
|   |-- exceptions
|   |   `-- handler.ts
|   |-- middleware
|   |   |-- auth_middleware.ts
|   |   |-- container_bindings_middleware.ts
|   |   |-- force_json_response_middleware.ts
|   |   |-- guest_middleware.ts
|   |   `-- silent_auth_middleware.ts
|   `-- models
|       `-- user.ts
|-- bin
|   |-- console.ts
|   |-- server.ts
|   `-- test.ts
|-- config
|   |-- app.ts
|   |-- auth.ts
|   |-- bodyparser.ts
|   |-- cors.ts
|   |-- database.ts
|   |-- hash.ts
|   |-- logger.ts
|   `-- session.ts
|-- database
|   `-- migrations
|       `-- 1744189966356_create_users_table.ts
|-- eslint.config.js
|-- package-lock.json
|-- package.json
|-- start
|   |-- env.ts
|   |-- kernel.ts
|   `-- routes.ts
|-- tests
|   `-- bootstrap.ts
`-- tsconfig.json
```



## 疎通確認
最後に疎通してみましょう。

以下のコマンドを実行し、AdonisJSの開発サーバを起動します。
```bash
node ace serve --hmr

[ info ] starting HTTP server...
╭─────────────────────────────────────────────────╮
│                                                 │
│    Server address: http://localhost:3333        │
│    Watch Mode: HMR                              │
│    Ready in: 1.37 s                             │
│                                                 │
╰─────────────────────────────────────────────────╯
[01:22:37.567] INFO (13960): started HTTP server on localhost:3333
```

デフォルトでHello WorldのAPIが用意されているので、リクエストしてみると正常にレスポンスが返ってきました！
導入から実行できるようにするまで、非常に簡単に出来ましたね:smile:

```
curl -X GET http://localhost:3333
{"hello":"world"}
```

# おわりに
今回はAdonisJSについての簡単な概要と、実際にAPIを叩けるようにするまでを試しました。
細かい内容については、次の記事で書いていこうと思います:smile: