Skip to content

Designing features ​

A feature should own a coherent product capability. Keep its routes, state, UI, initialization, and public contributions together. That boundary gives a team room to evolve the feature without changing the entire app.

How the pieces fit together

Follow product ownership ​

Catalog, account, and checkout are useful starting boundaries. A complete customer journey can cross all three. A single screen may be too small a boundary if it cannot own its behavior independently.

Share services through plugins ​

Use the app’s network, auth, storage, telemetry, and logging contracts. Put shared infrastructure behavior in the plugin that owns it so every consuming feature benefits. Feature-specific domain behavior stays in the feature.

Keep the public surface small ​

Export the descriptor and any components deliberately supported for reuse. Avoid importing another feature’s private implementation. Describe shared routes and extension contracts so consumers know how to integrate them.

Make dependencies explicit ​

Declare the names of prerequisite features in dependencies. Include those features in the app composition. The runtime waits for prerequisites before initializing dependents; independent features remain free to initialize concurrently.

Carry a feature between apps ​

Keep app-specific service implementations, branding, and configuration in the app. Reuse a feature package alongside a different collection of features. If a smaller part needs independent reuse, extract a supported component or a smaller coherent feature rather than copying private state.

How the pieces fit together

Continue with feature descriptors, using plugins, and the counter example.