项目文件夹

文件
2026-07-13 12:32:10 +08:00

136 行
6.8 KiB
Markdown

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# Decision Tree: Should You Build This Architecture?
Run the user's project through this tree *before* recommending the four-layer architecture. It excludes the architecture for many common project shapes, and saying so directly is more useful than over-fitting advice.
---
## Question 1: How many OS targets?
- **Just one (macOS only, or Windows only):**
**Don't use this architecture.** Build native (Swift/AppKit, or C#/WinUI/WPF). The cross-platform tax is not worth it. The whole point of this stack is to share a UI codebase across OSes; with one OS, you have nothing to share.
- **Two (macOS + Windows):**
→ Proceed.
- **Three (+ Linux):**
→ Proceed, but warn: this skill is grounded in macOS+Windows evidence. Linux + WebKitGTK works but has its own quirks not documented here. WebView2 doesn't exist on Linux; you'll likely use WebKitGTK or fall back to bundling. Budget for it.
- **Mobile too (iOS / Android):**
→ Proceed for desktop, *and* extract the Rust core to share with mobile (this is exactly the Layer-4-sharing benefit). Don't try to share the React UI with mobile via React Native; that's a different stack with different trade-offs.
---
## Question 2: Is "native feel" actually a hard requirement?
- **Yes, the app must be indistinguishable from native** (e.g., a launcher, a system utility, a productivity tool the user lives in all day):
→ Proceed.
- **"It should be nice but Electron is fine":**
**Don't use this architecture.** Use Electron. The polish budget here is 5–10× higher than Electron, and you only earn that back if native-feel is a competitive differentiator. If "nice" is sufficient, the cheapest path is Electron + a good designer.
- **No, it's an internal tool, no end-user polish needed:**
**Don't use this architecture.** Web app in a browser tab. Or Electron. Or a Mac app for the one OS your team uses.
---
## Question 3: Do you have a plugin/extension ecosystem?
- **Yes, third parties will build extensions:**
→ JS/TS plugins are the only practical choice (1000× more authors than native plugins). You need Layer 3 (Node backend). Proceed.
- **No, but the app has very rich business logic / network code:**
→ Layer 3 (Node) is still likely correct, because the alternative is duplicating business logic in Swift and C#. Proceed.
- **No, and the app is mostly UI + a small amount of native work:**
→ Consider skipping Layer 3. A native shell + WebView + small Rust core may be enough. Lighter, simpler.
---
## Question 4: How tight is your launch budget?
- **Cold start must be < 100 ms:**
**Don't use this architecture.** The WebView + Node boot floor is ~150–300 ms even with prewarming. Build native.
- **Cold start < 500 ms acceptable, warm start < 50 ms required:**
→ Proceed. Prewarm a hidden launcher window at app start. Warm activation is essentially free.
- **Cold start tolerance is generous (< 2s):**
→ Proceed comfortably.
---
## Question 5: What's your memory budget?
- **Under 150 MB resident:**
**Don't use this architecture.** The floor is ~150 MB on Windows for an empty WebView + Node. Build native.
- **300–800 MB acceptable:**
→ Proceed.
- **1 GB+ fine (e.g., a heavy AI app):**
→ Proceed, but consider memory hygiene from day one — see `references/05-memory-truths.md`. Going over 1 GB sustained will cost you reviews from users who don't understand memory accounting.
---
## Question 6: How experienced is your team?
- **Strong in one of Swift OR C#, plus React/TS:**
→ Proceed. You'll need to hire/learn the other native side, but the centroid of work is in TS where the team is fluent. This is a near-ideal fit.
- **Strong in React/TS, no native experience:**
→ Proceed with caution. The two native shells (Layers 1 + 1 again) are real work. Budget 2–3 months per shell for an experienced TS engineer to get competent. Or hire one native specialist per OS.
- **Strong in native (Swift or C#), no React experience:**
→ Proceed with caution. React/TS is easier to ramp on than the reverse, but design-system maturity in React takes longer than people expect. Budget 3 months for the UI baseline before shipping.
- **Two-person team, no Rust experience:**
→ Skip Layer 4 initially. Start with shell + WebView + Node. Add Rust only when a specific need arises (file indexer, crypto, etc.). UniFFI is great but ramping on Rust + UniFFI + cross-toolchain builds *while shipping* is a lot.
---
## Question 7: How long is the runway?
- **Short (need to ship in < 3 months):**
**Don't use this architecture.** Use Electron or Tauri. You can rewrite to native-feel later if the product takes off. (Raycast itself started as a pure Mac native app — they rewrote *after* they had product-market fit.)
- **Medium (6–12 months):**
→ Proceed if you have native experience on the team. Skip Layer 4 to start.
- **Long (12+ months to v1):**
→ Proceed comfortably. All four layers.
---
## Decision matrix
After all seven questions, score yourself:
| Score | Recommendation |
|---|---|
| All "Proceed" | Four-layer architecture. Read `references/02-architecture.md`. |
| One or two "Skip Layer X" | Three-layer architecture (omit the skipped layer). Read `references/02-architecture.md` and note the per-layer rationale to confirm what you're losing. |
| Any "Don't use this architecture" | Use the alternative named in that question (native / Electron / different stack). This skill doesn't apply. |
| "Proceed with caution" anywhere | Proceed but front-load risk: prototype the riskiest layer first (e.g., the native shell + WebView wiring), not the easiest. |
---
## Common false positives (apps that *seem* like a fit but aren't)
- **A "fast" web app** — i.e., a SaaS dashboard the team wants to "make feel native." Almost always: just ship it as a web app. Adding a native shell for "feel" rarely pays back the engineering cost.
- **A small utility** — e.g., a clipboard manager. Probably wants pure native; the cross-platform value isn't there at this size.
- **A game or graphics-heavy app** — use a game engine or native graphics framework, not a WebView.
- **A document editor** — depends. Notion/Obsidian-class? Maybe. Microsoft Word-class? Native.
- **A media player** — native, because media frameworks (AVFoundation, Media Foundation) are platform-specific anyway.
---
## When this architecture is *clearly* right
- A productivity launcher (Raycast, Alfred-style).
- A note-taking app with rich extensions (Obsidian-class).
- A team communication app with deep OS integration (Slack-class, *if* willing to invest more than Slack did).
- A developer tool that needs to embed editors, terminals, and rich panels (Linear desktop, Warp-ish).
- An AI app where the UI needs to render rich markdown/code and the backend needs to manage long-lived AI sessions across windows.
If the user's project resembles one of these and they passed Q1–Q7, recommend with confidence.