今回はオープンソースのヘッドレスCMS Strapi の入門として、インストール等のセットアップを行っていきます。またリッチテキストエディタとしてCKEditor5プラグインも導入していきます。
はじめに
ヘッドレスCMSとは
ヘッドレスCMSは、WordPressに代表される従来のモノリシックCMSとは異なり、コンテンツ管理機能(バックエンド)とコンテンツ表示機能(フロントエンド)を完全に分離したアーキテクチャを採用しています。
モノリシックCMS(WordPress)の構成
ヘッドレスCMSの構成
上の図のように、ヘッドレスCMSはコンテンツ管理とコンテンツ提供を行うAPIサーバーの役割のみを守備範囲としており、フロントエンド部分は持ちません。ヘッドレスCMSを採用する場合、フロントエンド部分は別途実装が必要になります。
しかしこの分離アーキテクチャによって、WordPressのような従来のモノリシックCMSと比較して以下のメリットが得られます。
- 技術選択の自由度: React、Vue.js、Next.jsなど好みのフレームワークでフロントエンドを構築できます
- マルチプラットフォーム対応: WebサイトだけでなくモバイルアプリやIoTデバイスなど複数のクライアントから同一のAPIを利用可能です
- パフォーマンスと運用面: フロントエンドをCDNで配信したり、それぞれのレイヤーを独立してスケールできるため、高いパフォーマンスと柔軟な運用を実現できます
- セキュリティの強化: フロントエンドとバックエンドが分離されているため攻撃対象領域が限定され、WordPressでよく見られるプラグインの脆弱性やテーマの脆弱性による攻撃を回避できます。またAPI経由でのデータアクセスにより、より細かな権限制御とアクセス管理が可能になります
Strapiとは
Strapiは「API creation made simple, secure and fast(シンプル、セキュア、高速なAPI作成)」をコンセプトとするオープンソースのヘッドレスCMSです。Node.jsで構築されており、開発者が直感的にAPIを作成し、コンテンツを管理できるよう設計されています。
Strapiの主要な特徴
1. 完全なデータ制御
- セルフホスト可能。または専用クラウド環境(Strapi Cloud)も利用できる。完全な所有権を維持
- ベンダーロックインのリスクがなく、いつでもデータを移行可能
2. データベースの柔軟性
- PostgreSQL、MySQL、MariaDB、SQLiteなど主要なSQLデータベースに対応
- プロジェクトの規模や要件に応じてデータベースを選択可能
3. 高度なカスタマイゼーション
- REST APIとGraphQL APIの両方を標準サポート
- カスタムルートやミドルウェアの実装が容易
- プラグインシステムによる機能拡張
4. スケーラビリティ
- AWS、Netlify、Heroku等の主要クラウドプラットフォームでの展開に対応
- マイクロサービスアーキテクチャとの親和性が高い
5. 開発者フレンドリー
- 直感的な管理画面(Strapi Admin)
- 豊富なドキュメントとアクティブなコミュニティ
- TypeScriptサポートとモダンなJavaScript開発環境
インストール
事前準備
環境
- OS: macOS Sonoma 14.7.8
- CPU: Apple M2 Pro
ランタイムであるNode.jsが必要です。npm以外のパッケージマネージャーを使う人はpnpmやyarnも準備してください。今回はpnpmを使っていきます。
- Node.js (必須)
- LTS版しか対応していないので注意(ActiveかMaintenanceのみ)
- 2025-09時点では20か22のみ
- 今回は22.19.0を使用
- LTS版しか対応していないので注意(ActiveかMaintenanceのみ)
- pnpm (任意)
- npmやyarnでも問題ない
- 今回は10.16.1を使用
Strapiのインストール
まずは親フォルダ内でpnpm create strapi
を実行します。プロジェクト名はmy-strapi-project
にしました。いくつか質問されますが、以下のように回答しました。
pnpm create strapi
? What is the name of your project? my-strapi-project
🚀 Welcome to Strapi! Ready to bring your project to life?
? Please log in or sign up. Skip
? Do you want to use the default database (sqlite) ? Yes
? Start with an example structure & data? Yes
? Start with Typescript? Yes
? Install dependencies with pnpm? Yes
? Initialize a git repository? Yes
? Participate in anonymous A/B testing (to improve Strapi)? No
ここで、DBの初期化コマンド(Seed)が実行されますが、pnpm環境では、ライブラリのpostinstallがデフォルトでブロックされるため、エラーが発生する可能性があります。これは次のステップで解決します。
Strapiプロジェクトの初期設定
プロジェクトルートに移動し、pnpmのpostinstallを許可します。そうするとSeedが成功します。
cd my-strapi-project
pnpm approve-builds
# aを押してEnterですべて許可する
pnpm seed:example
# Seedが成功する
Strapi管理画面の起動
管理画面サーバーを起動します。
pnpm dev
localhost:1337 にアクセスすると管理者を初期登録する画面が表示されます。以下のように登録しました。
これでStrapiのバックエンド部分の構築が完了です。ちなみに今回使用しているStrapiのバージョンは5.23.5です。
Strapiでは、コンテンツの型を定義し、その定義に沿ってコンテンツを追加、編集、削除します。
コンテンツ型の定義は左メニューのContent-Type Builder
で行います。
またコンテンツ管理は左メニューのContent Manager
で行います。
デフォルトリッチテキストエディタの問題点
リッチテキストエディタとは、フォントの種類や色、サイズ、太字、斜体、下線、画像、ハイパーリンクなど、さまざまな書式設定を適用できるテキスト形式で記述できるエディタです。
StrapiでのContent-Type Builderでは、コンテンツ型のフィールドの一種としてRich Textというものを選択できます。たとえば、Restaurant
というコンテンツ型にDescription
というRich Textフィールドを追加します。
この内容で型を定義し、Content Managerで新しいRestaurant型のコンテンツを作成します。
日本語入力がおかしい
コンテンツ作成画面で、Descriptionフィールドにテキストを日本語で入力すると次のような現象になります。
日本語文字を入力してEnterを押して改行すると同じ行が重複して入力されてしまいます。別の場所に入力した文字をコピー&ペーストすれば発生しませんが、これではあまりにも使い勝手が悪いです。
Strapi標準のリッチテキストエディタは内部的にSlate.jsを使用しており、IMEとの相性が悪いようです。(#2368,#2944,#1710,#2149など)
ちなみに筆者の環境ではGoogleの日本語入力IMEを使っています。
CKEditor5プラグイン
そこで代替ツールを探します。いくつかあるようですが、CKEditor5というプラグインがよく使用されるようなので、これを使っていきます。
Strapi用のCKEditorプラグインは複数ありますが、今回は以下のプラグインを使用します。
プラグインのインストール
以下のようにパッケージマネージャでインストールするだけです。インストール後、ビルドが必要なのでビルドし直します。
pnpm install @_sh/strapi-plugin-ckeditor
pnpm build
Content-Type Builderを開いて、新しいフィールドを追加する画面でCUSTOM
タブを選択すると表示されていると思います。
Preset
のところはDefault HTML editor
を選択します。
Content Managerを開いて入力すると今度は正常に入力できました。
まとめ
今回はヘッドレスCMS Strapiのセットアップから、CKEditor5プラグインの導入まで一通り実施しました。
Strapiの導入で得られるメリット
- 技術選択の自由度: フロントエンドは好みのフレームワークで構築可能
- マルチプラットフォーム対応: WebサイトだけでなくモバイルアプリやIoTデバイスからも同一APIを利用
- 高いパフォーマンス: CDN配信や独立したスケーリングによる柔軟な運用
- 強化されたセキュリティ: 分離アーキテクチャによる攻撃対象領域の限定
日本語環境でのリッチテキストエディタ問題の解決
Strapiデフォルトのリッチテキストエディタ(Slate.js)は日本語IMEとの相性が悪く、改行時に文字が重複する不具合がありました。CKEditor5プラグイン(@_sh/strapi-plugin-ckeditor
)を導入することで、この問題を解決し、日本語環境でも快適にリッチテキスト編集が可能になりました。