Tách app trong một repo
Ba cách cho một nhóm tính năng muốn deploy độc lập. Bảng so sánh lấy từ harness.nemo12.com (Nemo12 chọn Cách 3 ngày 18.10.2026), áp vào Conan.
| Cách 1: một app | Cách 2: subdomain, repo riêng | Cách 3: app riêng, cùng repo, cùng tên miền | |
|---|---|---|---|
| Ví dụ | tokyo.conan.school/books | books.conan.school | tokyo.conan.school/books, Worker riêng |
| Deploy độc lập | Không | Có | Có |
| Đăng nhập | Một lần | Phải làm SSO giữa subdomain | Một lần, cùng cookie |
| Database, API | Chung | Câu hỏi khó: tách dữ liệu hay sửa hai repo | Chung |
| Code dùng chung | Import trực tiếp | Package có version cho mỗi repo | Import trực tiếp |
| SEO | Gom về một tên miền | Mỗi subdomain xây lại uy tín | Như Cách 1 |
| Phiên AI song song | Dễ đụng nhau | Tách hẳn | Mỗi phiên một thư mục app |
Cách 2 chỉ hợp với phần không chung dữ liệu hay đăng nhập, như conan-web và các site video. Cách 3 hợp với phần dùng chung tài khoản, D1 và API, như các khu lớn của tokyo.
Định tuyến của Cách 3
- Route của Cloudflare thắng custom domain trên cùng hostname; route cụ thể hơn thắng route chung.
- App vỏ giữ hostname (trang chủ, hồ sơ, redirect); mỗi khu một Worker với route
<host>/<khu>và<host>/<khu>/*. - Mỗi app build với
base: "/<khu>/", asset không đụng nhau. - Cookie phiên ở
.conan.school: đăng nhập giữ nguyên khi đi giữa các app. - Link sang app khác là tải lại trang, không chuyển trang trong SPA.
- Rollback: gỡ route là quay về app cũ ngay.
Bước 0 luôn là gom vỏ dùng chung
Trước khi tách khu đầu tiên: gom đăng nhập, HTTP client, NavBar, menu, avatar, Motion, ngôn ngữ vào một package (packages/<app>-shell). Không có bước này thì mỗi app tự chép vỏ, và chúng lệch nhau từ tuần đầu.
Ở Conan hôm nay
Tokyo (com.conan.school) vẫn là một SPA, và là làn bận nhất repo. Chưa có quyết định tách khu nào. Ứng viên tự nhiên nếu cần: Books, cộng đồng, khoá học. Xem Audit.