An open API service indexing awesome lists of open source software.

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.

Awesome Lists containing this project

README

          





@marko/fastify



TypeScript



Styled with prettier



Build status







NPM Version



Downloads

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.