前言

2026 年 4 月 20 日,Reflex 推出 0.9.0。這次更新不是單純補幾個 API,而是直接把框架的底層假設改了一輪:資料庫變成選配、事件處理搬到後端、生產模式收斂成單一埠口,連自動產生 setter 這件事也改成預設關閉。

我的第一個感覺是:Reflex 正在把自己從「很好上手」推向「更像正式產品」。

這版更新了什麼

改動 影響
資料庫支援改為選配 不用 DB 的專案安裝更輕,依賴更少
事件處理搬到後端 yield 與背景任務的流程更集中,少一次 client round-trip
生產模式單一埠口 部署更簡單,前後端不用再分 port 維護
state_auto_setters 預設關閉 少一點魔法,多一點明確性
舊內部 API / 測試 helper 移除 框架更乾淨,但升級成本提高

資料庫依賴改成選配

這是我覺得最務實的改動之一。以前很多人只是想用 Reflex 做前端 UI 或輕量互動頁,卻還要被資料庫相關依賴綁住。0.9 把 pydanticsqlmodelalembic 從預設依賴拿掉,只有真的用到 rx.Modelrx.session 或 migration 的專案才需要額外安裝:

pip install 'reflex[db]~=0.9.0'

如果你的 app 需要資料庫,還要在設定裡明確指定 db_url

config = rx.Config(
    app_name="my_app",
    db_url="sqlite:///reflex.db",
)

如果你的 app 沒有 DB,這個改動直接替你省掉一整包負擔。

事件處理搬到後端

這是 0.9 最有架構味的一刀。以前一些事件鏈與 queue 的責任偏向前端,現在核心事件生命週期搬回 backend,少掉一段 client 來回,也讓 background task 的責任邊界更清楚。

這種改動通常不會讓 demo 看起來更炫,但會讓專案更耐用。對長期維護來說,這比多一個 UI component 更重要。

生產模式更乾淨

0.9 之後,production mode 走單一 port,不再鼓勵前後端分開配置。部署策略更直接,也比較接近多數人對「一個 Web App」的直覺理解。少一個 port,就少一種故障模式。

state_auto_setters 不再默認開啟

這點會讓舊使用者有點痛,但我認為方向是對的。自動 setter 很方便,卻也很容易讓 state 更新變得不夠顯眼。0.9 改成預設關閉後,程式碼會更囉嗦一點,但讀起來更清楚。

我的評論:這版到底值不值得升級

如果把 0.8 跟 0.9 對比,我會把這次更新解讀成一句話:

Reflex 開始少一點「框架幫你猜」,多一點「框架幫你管」。

我認為做對的地方

  • 資料庫改成選配,很務實。不是每個專案都需要 DB,沒必要把重量級依賴綁死在核心安裝裡。
  • 事件處理搬到後端,架構邊界更清楚,也比較符合長期維護的直覺。
  • 生產模式收斂成單一 port,部署面更簡單,少掉一整類環境錯配問題。
  • state_auto_setters 預設關閉,雖然少了一點便利,但讓 state 更新更透明。

我認為要注意的地方

  • 如果你有碰內部 API,升級成本不低。
  • 如果你的測試流程依賴舊 helper,得重寫一段。
  • 如果你原本很愛自動 setter,這版會讓你覺得程式碼變囉嗦。

我的結論

這不是一版「更炫」的更新,而是一版「更像正式框架」的更新。

如果你是新專案,我會偏向直接上 0.9。 如果你是老專案,而且有用到內部流程或舊測試工具,先做盤點再升級會比較穩。

所以我對 0.9 的評價不是「更潮」,而是「更像一個能長期用的框架」。

一個簡單範例

下面是一個最小可跑的 Counter,刻意不碰資料庫,正好示範 0.9 這種「乾淨而明確」的寫法:

import reflex as rx


class State(rx.State):
    count: int = 0
    step: int = 1

    def set_step(self, value: str):
        self.step = max(1, int(value or 1))

    def increment(self):
        self.count += self.step


def index():
    return rx.center(
        rx.vstack(
            rx.heading("Reflex 0.9 Demo"),
            rx.text(f"Count: {State.count}"),
            rx.text(f"Step: {State.step}"),
            rx.hstack(
                rx.input(
                    type="number",
                    default_value="1",
                    on_change=State.set_step,
                    width="6em",
                ),
                rx.button("Increment", on_click=State.increment),
            ),
            align="start",
            spacing="4",
        ),
        width="100%",
        height="100vh",
    )


app = rx.App()
app.add_page(index, title="Reflex 0.9 Demo")

如果你要升級舊專案,我會建議先從這三件事開始檢查:

  • 有沒有用到 DB 相關功能
  • 有沒有依賴舊的 event / test internals
  • 有沒有大量仰賴自動 setter

結語

Reflex 0.9 的價值不在「新增了多少花俏功能」,而在它開始把框架邏輯收斂得更像正式產品。對開發者來說,這通常代表兩件事:短期升級會有成本,長期維護會更舒服。

如果你本來就在看純 Python Web 開發框架,0.9 版的 Reflex 值得重新評估。尤其是你想要的是能做產品,而不是只做 demo。

參考資料