@@ -26,13 +26,12 @@ A production-quality Vite implementation is likely **10–18 engineer-days**, in
|
||||
|
||||
## Scope examined
|
||||
|
||||
The implementation target is `effect-fc-next` (Effect 4 beta), which is
|
||||
expected to become `effect-view`. The legacy `effect-fc` package is not
|
||||
supported by the Vite plugin.
|
||||
The implementation target is `effect-view` (Effect 4 beta). The legacy
|
||||
`effect-fc` package is not supported by the Vite plugin.
|
||||
|
||||
## How Effect View rendering works today
|
||||
|
||||
`Component.make` creates a function-shaped descriptor with a `body` property and `ComponentPrototype`; it does not create the React component that will be mounted. See [`packages/effect-fc-next/src/Component.ts`](packages/effect-fc-next/src/Component.ts), around `make`, `makeUntraced`, and `ComponentImplPrototype`.
|
||||
`Component.make` creates a function-shaped descriptor with a `body` property and `ComponentPrototype`; it does not create the React component that will be mounted. See [`packages/effect-view/src/Component.ts`](packages/effect-view/src/Component.ts), around `make`, `makeUntraced`, and `ComponentImplPrototype`.
|
||||
|
||||
The relevant path is:
|
||||
|
||||
@@ -45,7 +44,7 @@ source definition
|
||||
-> mounted React fiber
|
||||
```
|
||||
|
||||
In `effect-fc-next`, `asFunctionComponent` creates a closure over the descriptor
|
||||
In `effect-view`, `asFunctionComponent` creates a closure over the descriptor
|
||||
and Effect context. `.use` retains that synthesized function in `componentRef`
|
||||
while the relevant Effect service identities remain unchanged, and
|
||||
`withContext` renders the function returned by `.use`.
|
||||
@@ -88,7 +87,7 @@ Consequently, edits currently propagate through ordinary Vite HMR invalidation.
|
||||
|
||||
The initial feasibility study used the legacy implementation for a focused
|
||||
jsdom/React identity experiment. Its descriptor-caching result also applies to
|
||||
`effect-fc-next`, but the legacy package is not an implementation target:
|
||||
`effect-view`, but the legacy package is not an implementation target:
|
||||
|
||||
1. Render an Effect View containing `React.useState(0)`.
|
||||
2. Increment it to `old:1`.
|
||||
@@ -145,7 +144,7 @@ It should recognize:
|
||||
- `Component.makeUntraced(...)`
|
||||
- class declarations extending either factory result
|
||||
- definitions followed by Effect `pipe` transformations
|
||||
- aliased imports from `effect-fc-next`
|
||||
- aliased imports from `effect-view`
|
||||
|
||||
For each definition it should inject development-only metadata containing:
|
||||
|
||||
@@ -255,7 +254,7 @@ Exit criterion: editing render text updates without a page reload, and incompati
|
||||
### Phase 1: Vite MVP (4–7 additional days)
|
||||
|
||||
- Implement binding-aware AST detection for all public construction styles.
|
||||
- Add stable shell/keyed implementation support to the supported `effect-fc-next` Component implementation.
|
||||
- Add stable shell/keyed implementation support to the supported `effect-view` Component implementation.
|
||||
- Cover memoized and async traits.
|
||||
- Add safe self-accept/fallback behavior.
|
||||
- Add browser integration tests against the example app.
|
||||
@@ -295,7 +294,7 @@ Minimum cases:
|
||||
- Async View and Suspense/error recovery.
|
||||
- Two materializations of the same View under different Effect contexts.
|
||||
- Reactive and `nonReactiveTags` service changes.
|
||||
- TanStack Router code splitting used by the `example-next` application.
|
||||
- TanStack Router code splitting used by the `example` application.
|
||||
- Successive edits before the previous refresh finishes.
|
||||
- Syntax error followed by recovery.
|
||||
- Production build contains no HMR registry/subscription code.
|
||||
|
||||
Reference in New Issue
Block a user