summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/astro/src/core/render/README.md70
1 files changed, 70 insertions, 0 deletions
diff --git a/packages/astro/src/core/render/README.md b/packages/astro/src/core/render/README.md
new file mode 100644
index 000000000..f1e6f15c1
--- /dev/null
+++ b/packages/astro/src/core/render/README.md
@@ -0,0 +1,70 @@
+# `core/render`
+
+This directory contains most of Astro's high-level rendering APIs, including `renderPage`, `createRenderContext`, etc.
+
+- For rendering an Astro file, see [src/runtime/server/](../../runtime/server/).
+- For rendering an endpoint, see [src/core/endpoint/](../endpoint/).
+
+## Concepts
+
+The codebase has a few abstractions for rendering:
+
+### `RenderContext`
+
+Each render (page or endpoint) requires a `RenderContext` that contains:
+
+- The `Request` object
+- The matched `route`
+- The matched `pathname` (without the `base`)
+- The route `params` and `props`
+- Additional `styles`, `links`, `scripts`
+- And more!
+
+The `RenderContext` is agnostic to what's being rendered.
+
+**Permitted state:** `RenderContext` should only contain per-request information.
+
+### `Environment`
+
+Every app (dev and prod) has one `Environment`. It contains a subset of the Astro `settings`, `config`, and `routes` information needed for Astro's runtime to work.
+
+In dev, all of `settings`, `config`, and `routes` are available, so the `Environment` (aka `DevelopmentEnvironment`) is derived directly from them. In prod, the `Environment` is derived from the `SSRManifest`, an intermediate layer that helps keep the build output lean.
+
+**Permitted state:** `Environment` should only contain the global state shared across all requests.
+
+### `SSRManifest`
+
+An `SSRManifest` is created during a build to save information needed to create an `Environment` during runtime start-up. The values should be serializable (`buildManifest`) and deserializable (`deserializeManifest`).
+
+The serialized string is inlined in the server output and can usually be read from the compiled module's `manifest` export.
+
+### `SSRResult`
+
+The `SSRResult` is used by the public rendering APIs at [`src/runtime/server/`](../../runtime/server/). At the top level, it is created by `renderPage` and passed down to the public rendering APIs. It is also often used in non-Astro pages, like `.mdx` and `.md`.
+
+The `SSRResult` object contains a subset of `RenderContext`, the state used by the compiled output (`cookies`, `createAstro`, `resolve`, etc), and the state used by the rendering APIs (`_metadata`).
+
+### `SSROptions`
+
+The `SSROptions` is a small wrapper used only in dev to create a `RenderContext`. It is abstracted to share the same shape for `renderPage` and `renderEndpoint` ([src/core/endpoint/](../endpoint/)).
+
+## Flow
+
+### Development
+
+NOTE: The development flow has a different API under [src/core/render/dev/](./dev/) that wraps the core API in this directory.
+
+1. Create the `Environment` with `settings`, `config`, and `routes`.
+2. Create `SSROptions` containing the `Request` and `Environment`.
+3. Call `renderPage` with `SSROptions`.
+4. Internally, `renderPage` creates a `RenderContext` and calls the core-`renderPage` API.
+5. The core-`renderPage` creates the `SSRResult`.
+6. Call the core-`render` API to render the page!
+
+### Production
+
+1. Deserialize the `SSRManifest`.
+2. Create the `Environment` with the `SSRManifest`.
+3. Create `RenderContext` from `Request` and `SSRManifest`.
+4. Call the core-`renderPage` with `RenderContext` and `Environment`.
+5. Call the core-`render` API to render the page!