Open5

次のフロントエンドプロジェクトの技術スタック - 2024 Autumn

@iktakahiro / Takahiro Ikeuchi@iktakahiro / Takahiro Ikeuchi

フロントエンドフレームワークは SolidJS + SolidStart

https://www.solidjs.com

https://start.solidjs.com

軽量・高速で学習コスト低い。SolidStart が v1 になり CSR、SSR、SSG をカバーする選択肢の1つになっている。

ファイル・ディレクトリベースのルーティングもかなり柔軟に作れる

https://docs.solidjs.com/solid-start/reference/routing/file-routes

状態管理は Signals

SolidJS を使うと状態管理は標準で Signals になるがこれがよいと思う。

https://docs.solidjs.com/concepts/signals

UI コンポーネントキット・CSS周りは ParkUI(Ark UI + Panda CSS)

https://park-ui.com

https://ark-ui.com

https://panda-css.com

Ark UI は Radix UI のレイヤー。shadcn 的なものが Park UI。shadcn のスタイリングは Tailwind だが、Park UI は Panda CSS を採用している。(以前は Panda CSS / Tailwind の両対応だったがPandaに1本化された経緯がある)

スタイリングにコストをかけられる場合は Park をはさまずに Ark UI + Panda CSS でも良さそう。

Tailwind 論争に疲れたあなたにもお勧め(?)

参考 :

https://zenn.dev/cybozu_frontend/articles/panda-is-coming

Panda CSS は Chakura UI チームが正式に管理するライブラリだが、Park UI はそうではない点を気にしておく必要はありそう。

@iktakahiro / Takahiro Ikeuchi@iktakahiro / Takahiro Ikeuchi

ビルドツールは Vite

SolidStart を採用すると Vinxi を使うことになる。

https://vinxi.vercel.app

Vinx は Vite や Nitro をよしなに扱ってくれるもの(という理解

https://vitejs.dev

https://nitro.unjs.io

テストツールは Vitest と Playwright

Vite を使うし Jest ではなく Vitest が良さそう。

https://vitest.dev

E2E テストは Playwright(で良いですかね)

https://playwright.dev

Formatter / Linter は Biome

https://biomejs.dev

@iktakahiro / Takahiro Ikeuchi@iktakahiro / Takahiro Ikeuchi

DI コンテナは inversify

https://inversify.io

TSyringe を好んで使っていたけど、API もほとんど変わらないし、より型安全にし易いので inversify を推す(どちらでもよい)

@iktakahiro / Takahiro Ikeuchi@iktakahiro / Takahiro Ikeuchi

急に具体だが デコレーター使えるようにするのに沼ったのでメモ。Babel 周辺は触らなくても大丈夫だった

vite.config.ts
import typescript from '@rollup/plugin-typescript';
import { defineConfig } from '@solidjs/start/config';
import tsconfigPaths from 'vite-tsconfig-paths';

export default defineConfig({
  vite: {
    plugins: [typescript(), tsconfigPaths({ root: './' })],
  },
});
tsconfig.json
{
    "target": "ESNext",
    "module": "ESNext",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
}