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