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