https://github.com/marko-js/fastify
Render Marko templates in a Fastify application.
https://github.com/marko-js/fastify
Last synced: 7 months ago
JSON representation
Render Marko templates in a Fastify application.
- Host: GitHub
- URL: https://github.com/marko-js/fastify
- Owner: marko-js
- License: mit
- Created: 2021-02-24T21:04:42.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2022-06-22T15:39:24.000Z (over 3 years ago)
- Last Synced: 2025-04-26T00:04:06.308Z (8 months ago)
- Language: TypeScript
- Size: 688 KB
- Stars: 9
- Watchers: 7
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: .github/CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
@marko/fastify
Render [Marko](https://markojs.com/) templates in a [`Fastify`](https://www.fastify.io/) application.
# Installation
```console
npm install @marko/fastify
```
# Examples
## Setup
> Note: the example below assumes that you've configured the environment to handle `.marko` files.
> This means using the require hook (`@marko/compiler/register`) or a bundler like `webpack`, `vite`, etc.
> We recommend using `npm init marko -- --template vite-fastify` for a more complete example!
```javascript
import fastify from "fastify";
import markoPlugin from "@marko/fastify";
import Template from "./template.marko";
const app = fastify();
app.register(markoPlugin);
app.get("/", (request, reply) => {
// Streams Marko template into the response.
// Forwards errors into fa error handler.
reply.marko(Template, { hello: "world" });
});
```
## $global / out.global
When calling `reply.marko` the [`input.$global`](https://markojs.com/docs/rendering/#global-data) is automatically merged with `app.locals` and `reply.locals` (both added by this plugin). This makes it easy to set some global data via fastify hook or globally, eg:
```js
app.locals.appName = "My App";
app.addHook("onRequest", (request, reply, done) => {
reply.locals.locale = "en-US";
reply.locals.serializedGlobals.locale = true;
done();
});
```
Then later in a template access via:
```marko
${out.global.appName}: ${out.global.locale}
```
## Using with `fastify-compress`
[`fastify-compress`](https://github.com/fastify/fastify-compress) does not currently expose a way for Marko to indicate when it is appropriate to flush out content while streaming. The default behavior for [`zlib`](https://nodejs.org/api/zlib.html#flushing) is to buffer all content, which we don't wan't if we're trying to send out responses as fast as possible.
To properly use Marko with [`fastify-compress`](https://github.com/fastify/fastify-compress) you should configure it to allow flushing out content as it is written. Marko internally will be sure to only write to the response stream when we've reached a point where we're waiting for async content.
```js
import zlib from "zlib";
import fastifyCompress from "fastify-compress";
fastify.register(fastifyCompress, {
zlibOptions: {
flush: zlib.constants.Z_SYNC_FLUSH,
},
brotliOptions: {
flush: zlib.constants.BROTLI_OPERATION_FLUSH,
},
});
```
# Code of Conduct
This project adheres to the [eBay Code of Conduct](./.github/CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.