You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
5.3 KiB
128 lines
5.3 KiB
3 years ago
|
# @fastify/fast-json-stringify-compiler
|
||
|
Build and manage the [`fast-json-stringify`](https://www.npmjs.com/package/fast-json-stringify) instances for the fastify framework.
|
||
|
This package is responsible for compiling the application's `response` JSON schemas into optimized functions to speed up the response time.
|
||
|
|
||
|
[](http://standardjs.com/)
|
||
|
[](https://github.com/fastify/fast-json-stringify-compiler/actions/workflows/ci.yml)
|
||
|
|
||
|
|
||
|
## Versions
|
||
|
|
||
|
| `@fastify/fast-json-stringify-compiler` | `fast-json-stringify` | Supported `fastify` |
|
||
|
|----------------------------------------:|----------------------:|--------------------:|
|
||
|
| v1.x | v3.x | ^3.x |
|
||
|
| v2.x | v3.x | ^4.x |
|
||
|
| v3.x | v4.x | ^4.x |
|
||
|
| v4.x | v5.x | ^4.x |
|
||
|
|
||
|
### fast-json-stringify Configuration
|
||
|
|
||
|
The `fast-json-stringify` configuration is the default one. You can check it the default settings in the [`fast-json-stringify` option](https://github.com/fastify/fast-json-stringify/#options) documentation.
|
||
|
|
||
|
You can also override the default configuration by passing the [`serializerOpts`](https://www.fastify.io/docs/latest/Reference/Server/#serializeropts) configuration to the Fastify instance.
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
This module is already used as default by Fastify.
|
||
|
If you need to provide to your server instance a different version, refer to [the official doc](https://www.fastify.io/docs/latest/Reference/Server/#schemacontroller).
|
||
|
|
||
|
### fast-json-stringify Standalone
|
||
|
|
||
|
`fast-json-stringify@v4.1.0` introduces the [standalone feature](https://github.com/fastify/fast-json-stringify#standalone) that let you to pre-compile your schemas and use them in your application for a faster startup.
|
||
|
|
||
|
To use this feature, you must be aware of the following:
|
||
|
|
||
|
1. You must generate and save the application's compiled schemas.
|
||
|
2. Read the compiled schemas from the file and provide them back to your Fastify application.
|
||
|
|
||
|
|
||
|
#### Generate and save the compiled schemas
|
||
|
|
||
|
Fastify helps you to generate the serialization schemas functions and it is your choice to save them where you want.
|
||
|
To accomplish this, you must use a new compiler: `@fastify/fast-json-stringify-compiler/standalone`.
|
||
|
|
||
|
You must provide 2 parameters to this compiler:
|
||
|
|
||
|
- `readMode: false`: a boolean to indicate that you want generate the schemas functions string.
|
||
|
- `storeFunction`" a sync function that must store the source code of the schemas functions. You may provide an async function too, but you must manage errors.
|
||
|
|
||
|
When `readMode: false`, **the compiler is meant to be used in development ONLY**.
|
||
|
|
||
|
|
||
|
```js
|
||
|
const { StandaloneSerializer } = require('@fastify/fast-json-stringify-compiler')
|
||
|
|
||
|
const factory = StandaloneSerializer({
|
||
|
readMode: false,
|
||
|
storeFunction (routeOpts, schemaSerializationCode) {
|
||
|
// routeOpts is like: { schema, method, url, httpStatus }
|
||
|
// schemaSerializationCode is a string source code that is the compiled schema function
|
||
|
const fileName = generateFileName(routeOpts)
|
||
|
fs.writeFileSync(path.join(__dirname, fileName), schemaSerializationCode)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const app = fastify({
|
||
|
jsonShorthand: false,
|
||
|
schemaController: {
|
||
|
compilersFactory: {
|
||
|
buildSerializer: factory
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
// ... add all your routes with schemas ...
|
||
|
|
||
|
app.ready().then(() => {
|
||
|
// at this stage all your schemas are compiled and stored in the file system
|
||
|
// now it is important to turn off the readMode
|
||
|
})
|
||
|
```
|
||
|
|
||
|
#### Read the compiled schemas functions
|
||
|
|
||
|
At this stage, you should have a file for every route's schema.
|
||
|
To use them, you must use the `@fastify/fast-json-stringify-compiler/standalone` with the parameters:
|
||
|
|
||
|
- `readMode: true`: a boolean to indicate that you want read and use the schemas functions string.
|
||
|
- `restoreFunction`" a sync function that must return a function to serialize the route's payload.
|
||
|
|
||
|
Important keep away before you continue reading the documentation:
|
||
|
|
||
|
- when you use the `readMode: true`, the application schemas are not compiled (they are ignored). So, if you change your schemas, you must recompile them!
|
||
|
- as you can see, you must relate the route's schema to the file name using the `routeOpts` object. You may use the `routeOpts.schema.$id` field to do so, it is up to you to define a unique schema identifier.
|
||
|
|
||
|
```js
|
||
|
const { StandaloneSerializer } = require('@fastify/fast-json-stringify-compiler')
|
||
|
|
||
|
const factory = StandaloneSerializer({
|
||
|
readMode: true,
|
||
|
restoreFunction (routeOpts) {
|
||
|
// routeOpts is like: { schema, method, url, httpStatus }
|
||
|
const fileName = generateFileName(routeOpts)
|
||
|
return require(path.join(__dirname, fileName))
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const app = fastify({
|
||
|
jsonShorthand: false,
|
||
|
schemaController: {
|
||
|
compilersFactory: {
|
||
|
buildSerializer: factory
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
// ... add all your routes with schemas as before...
|
||
|
|
||
|
app.listen({ port: 3000 })
|
||
|
```
|
||
|
|
||
|
### How it works
|
||
|
|
||
|
This module provide a factory function to produce [Serializer Compilers](https://www.fastify.io/docs/latest/Reference/Server/#serializercompiler) functions.
|
||
|
|
||
|
## License
|
||
|
|
||
|
Licensed under [MIT](./LICENSE).
|