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.
		
		
		
		
		
			
		
			
				
					103 lines
				
				4.7 KiB
			
		
		
			
		
	
	
					103 lines
				
				4.7 KiB
			| 
											3 years ago
										 | <h1 align="center">Fastify</h1> | ||
|  | 
 | ||
|  | # How to write a good plugin
 | ||
|  | First, thank you for deciding to write a plugin for Fastify. Fastify is a | ||
|  | minimal framework and plugins are its strength, so thank you. | ||
|  | 
 | ||
|  | The core principles of Fastify are performance, low overhead, and providing a | ||
|  | good experience to our users. When writing a plugin, it is important to keep | ||
|  | these principles in mind. Therefore, in this document, we will analyze what | ||
|  | characterizes a quality plugin. | ||
|  | 
 | ||
|  | *Need some inspiration? You can use the label ["plugin | ||
|  | suggestion"](https://github.com/fastify/fastify/issues?q=is%3Aissue+is%3Aopen+label%3A%22plugin+suggestion%22) | ||
|  | in our issue tracker!* | ||
|  | 
 | ||
|  | ## Code
 | ||
|  | Fastify uses different techniques to optimize its code, many of them are | ||
|  | documented in our Guides. We highly recommend you read [the hitchhiker's guide | ||
|  | to plugins](./Plugins-Guide.md) to discover all the APIs you can use to build | ||
|  | your plugin and learn how to use them. | ||
|  | 
 | ||
|  | Do you have a question or need some advice? We are more than happy to help you! | ||
|  | Just open an issue in our [help repository](https://github.com/fastify/help). | ||
|  | 
 | ||
|  | Once you submit a plugin to our [ecosystem list](./Ecosystem.md), we will review | ||
|  | your code and help you improve it if necessary. | ||
|  | 
 | ||
|  | ## Documentation
 | ||
|  | Documentation is extremely important. If your plugin is not well documented we | ||
|  | will not accept it to the ecosystem list. Lack of quality documentation makes it | ||
|  | more difficult for people to use your plugin, and will likely result in it going | ||
|  | unused. | ||
|  | 
 | ||
|  | If you want to see some good examples on how to document a plugin take a look | ||
|  | at: | ||
|  | - [`@fastify/caching`](https://github.com/fastify/fastify-caching) | ||
|  | - [`@fastify/compress`](https://github.com/fastify/fastify-compress) | ||
|  | - [`@fastify/cookie`](https://github.com/fastify/fastify-cookie) | ||
|  | - [`point-of-view`](https://github.com/fastify/point-of-view) | ||
|  | - [`under-pressure`](https://github.com/fastify/under-pressure) | ||
|  | 
 | ||
|  | ## License
 | ||
|  | You can license your plugin as you prefer, we do not enforce any kind of | ||
|  | license. | ||
|  | 
 | ||
|  | We prefer the [MIT license](https://choosealicense.com/licenses/mit/) because we | ||
|  | think it allows more people to use the code freely. For a list of alternative | ||
|  | licenses see the [OSI list](https://opensource.org/licenses) or GitHub's | ||
|  | [choosealicense.com](https://choosealicense.com/). | ||
|  | 
 | ||
|  | ## Examples
 | ||
|  | Always put an example file in your repository. Examples are very helpful for | ||
|  | users and give a very fast way to test your plugin. Your users will be grateful. | ||
|  | 
 | ||
|  | ## Test
 | ||
|  | It is extremely important that a plugin is thoroughly tested to verify that is | ||
|  | working properly. | ||
|  | 
 | ||
|  | A plugin without tests will not be accepted to the ecosystem list. A lack of | ||
|  | tests does not inspire trust nor guarantee that the code will continue to work | ||
|  | among different versions of its dependencies. | ||
|  | 
 | ||
|  | We do not enforce any testing library. We use [`tap`](https://www.node-tap.org/) | ||
|  | since it offers out-of-the-box parallel testing and code coverage, but it is up | ||
|  | to you to choose your library of preference. | ||
|  | 
 | ||
|  | ## Code Linter
 | ||
|  | It is not mandatory, but we highly recommend you use a code linter in your | ||
|  | plugin. It will ensure a consistent code style and help you to avoid many | ||
|  | errors. | ||
|  | 
 | ||
|  | We use [`standard`](https://standardjs.com/) since it works without the need to | ||
|  | configure it and is very easy to integrate into a test suite. | ||
|  | 
 | ||
|  | ## Continuous Integration
 | ||
|  | It is not mandatory, but if you release your code as open source, it helps to | ||
|  | use Continuous Integration to ensure contributions do not break your plugin and | ||
|  | to show that the plugin works as intended. Both | ||
|  | [CircleCI](https://circleci.com/) and [GitHub | ||
|  | Actions](https://github.com/features/actions) are free for open source projects | ||
|  | and easy to set up. | ||
|  | 
 | ||
|  | In addition, you can enable services like [Dependabot](https://dependabot.com/) | ||
|  | or [Snyk](https://snyk.io/), which will help you keep your dependencies up to | ||
|  | date and discover if a new release of Fastify has some issues with your plugin. | ||
|  | 
 | ||
|  | ## Let's start!
 | ||
|  | Awesome, now you know everything you need to know about how to write a good | ||
|  | plugin for Fastify! After you have built one (or more!) let us know! We will add | ||
|  | it to the [ecosystem](https://github.com/fastify/fastify#ecosystem) section of | ||
|  | our documentation! | ||
|  | 
 | ||
|  | If you want to see some real world examples, check out: | ||
|  | - [`point-of-view`](https://github.com/fastify/point-of-view) Templates | ||
|  |   rendering (*ejs, pug, handlebars, marko*) plugin support for Fastify. | ||
|  | - [`@fastify/mongodb`](https://github.com/fastify/fastify-mongodb) Fastify | ||
|  |   MongoDB connection plugin, with this you can share the same MongoDB connection | ||
|  |   pool in every part of your server. | ||
|  | - [`@fastify/multipart`](https://github.com/fastify/fastify-multipart) Multipart | ||
|  |   support for Fastify. | ||
|  | - [`@fastify/helmet`](https://github.com/fastify/fastify-helmet) Important | ||
|  |   security headers for Fastify. |