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
						
					
					
				# @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).
 |