Crowi 2.0 開発日記 #0
Crowi の 2.0 を開発していこうと思います。
背景
Crowi は株式会社クロコス (Crocos) の社内Wikiとして2012年から開発していて、その後2014年にオープンソースとして公開しました。
で、その後メルカリ社内でも使ったりして(先日全サーバー停止したらしいです、お疲れ様でした)、ちまちま開発を続けてきたのですが、2019年に出した v1.7.9 を最後にアップデートが止まったままになっていました。
それから、何度か React や node のアップデートに追従したり機能追加しようと思ったりしてちょこちょこいじったりしたこともあったのですが、すぐに忙しくなったりしてしばらく触らないうちに、また周辺ライブラリのバージョンや戦力図が変わったりしてやり直しになったりするのを繰り返し笑、2025年になってしまいました。
今更、Wikiシステムの開発してもねえ、と思うかもしれませんが、まあこれは趣味と愛の話なのでヨシとしてください。
で、ずっと開発をやり直したい気持ちはあったんですが、まあ他にもっと開発しないといけないものがあり開発の時間を割くならばそっちにフルベットしないとと思っていたのですが(そりゃまあ自分のプロダクトを作っているので)、とにかく生成AIの登場で自分の単位時間あたりにかけるコードの量が爆発的に増加したので、やる気が湧いてきて、思い切って再開することにしたのでした。
それから、生成AI系のAPIとつなぎこむことで、ドキュメントサービスはもっと面白くできるな、と思っているので、そのあたりまでもっていけるといいなぁ〜〜と、結構モチベーションがあがっているというのもあります。作りたいんだ!
というわけで「すぐに忙しくなったりしてしばらく触らないうちに」を繰り返さないためにw、そして忘れないために記録を残していくことにします。
現状調査
作業途中のブランチとかはもう何もかも覚えていないので、一旦なかったことにして、mainブランチからみていきます。
- Node.js v12
- React v16
- TypeScript v4.0.8
- MongoDB v3.6
その他細かいものも大量に色々あるんですが、まあ、一旦見なかったことにします。
あとなんか全体的なことを結構忘れているのでまあ書き出していこうと思います。
- そもそも最初のアーキテクチャはSSR (というかいわゆるExpressでのサーバーアプリケーション)
- Routingは完全にExpressでしている
- view!! Swig でレンダリングしている
- 一部フロントエンドのコンポネントをReactに移行していた
- 2012年の開発当初は、基本実装が Swig の HTML + JQuery (!) で Web 画面を作っていた
- 途中から React の登場でクライアントサイドの動的な挙動はそちらに移行しはじめていた
- 基本的には、サーバー側から Hydration 用のデータを渡したものを元に、React componentを初期化してDOMにマウントするという割とプリミティブな方法で
- TypeScript 移行
- こちらも一部は移行しつつサーバーサイドはほとんどJSのまま動作している状態
まあ2019年ならこれでよかったよねーという感じなんですが、さすがに2025年はこれではいけないと思うのでなのとかしていきましょう
方針
サーバー
まず、サーバーに関しては、基本、過去のデータを持つ Crowi サーバーと互換性のある状態にしたいと思っています。
要件としては、
- Node.js v20 で動作するようにする
- 既存のデータを読み込むことができる
- ただし MongoDB のバージョンが最新になることにより過去データが読めなくなる可能性もあるので、その場合 migration を考える (まだ調査してない)
- その他の依存パッケージは最新のバージョンに合わせる(可能な限り)
まずは、ハードルを上げすぎないように、このあたりを目標にします。
ここまで済んだら、次の段階として、
- Express からの移行 (なにに、は決まっていないが Hono とかがいいなぁ)
- MongoDB どうするか
- まあ別に MongoDB 好きだけど
- PostgreSQL とかに移行したい気持ちはあります
というところですがこのへんはまだ何も決めてません!まずはフロントエンドからかなぁ。
フロントエンド
フロントエンドが問題で、前述の通りサーバーサイドでのレンダリング、React との自作Hydrationが入り交じる状況になっていて、これは結構移行が難しいと判断しました。
したがって、フロントエンドは作り直します。今までのフロントエンドはさようならします。
なので、そのための要件として、
- まず、サーバーとの切り離しを行う
- viewとしてHTMLを返さずサーバーサイドは API を返すだけに変更していく
- 一部ReactのSSRを行っていた部分を引き剥がし、フロントエンドコンポネントをすべて削除
- その後、フロントエンドのみのSPAアプリケーションとして作り直す
- とはいえ、このあたりはNext.jsなどを使うかもしれず、その場合結局SSRになったりするかもしれない
- いずれにせよ、Expressでのviewからの引き剥がしを行い、既存のフロントエンドは除去、新しいフロントエンドアプリケーションとして作成する
正直、手が慣れているという点ではNext.jsなんですが、ここ最近のApp Routerの黒魔術感があまり好きではないので、せっかくの趣味アプリならもう少しライトウェイトなフレームワークを使っても良いかなぁ、と思いつつまだ悩んではいます。あ、Reactは使います。
その他構成
パッケージが古くなりすぎている、あるいはフロントエンド関連で React 前提とするなら何か他の選択肢がある、というものは対応そのものをザクザク切っていきたいと思います。
例えばスライドショーモードでつかっているRevealなど。
あとはフロントエンドのアプリケーションの切り分けを行ったうえで、monorepoにしたかったんですが、普通にturborepoもNode.js v18以降しか使えなかったのでw、一旦サーバー側のバージョンアップが終わったら考えます。
バージョンが古いとあらゆる連鎖でこういう事が起こるんだよな(ため息
というわけで
一旦方針だけ書いて、ここまで。
次回からは進捗をなにか書いていけるといいかもしれません。
Discordでワイワイしていきたいと思っているので(以前コミッターミーティングに使っていましたが)、興味本位でも、冷やかしでも、アドバイスでも、お手伝いでも大歓迎ですので、ぜひ遊びに来てください。
Discussion