@gasket/plugin-nextjs
Version:
Adds Next support to your application
130 lines (100 loc) • 4.71 kB
Markdown
# Next.js Deployment Guide
## Understand the `.next` folder
The `.next` folder is generated when your application is built. Which is
either done using the `npm run build` command, or when you run the server
in development mode e.g. `npm run local`. The `.next` folder contains
the following:
- `BUILD_ID` The build id that was generated for the application.
- `build-manifest.json` File that contains a mapping for all assets.
- `bundles` Folder that contains all build files for **client** usage.
- `static` Static files that are generated through WebPack.
- `server` Folder that contains all files that are used on the server.
- `bundles` All build files, but for **server** usage.
- `pages-manifest.json` Identical to `build-manifest.json` but for server.
- `static` Static files to be used on the server.
All these files are needed to render your application server side or client
side.
## To CDN or not to CDN
By default all the files that are in the `.next` folder will be hosted on your
application server. As most of these contain static files, it might make sense
for you application to upload it to the CDN.
If you decide to upload these to the CDN you need to instruct the application
to reference the files from the CDN instead of the application server. This is
done by setting the `assetPrefix` to the host/path of the CDN server.
You want to make sure that you only set the `assetPrefix` for production
environments so that when you are developing your application all assets are
still hosted on the application server. You can do this by setting environment
specific configuration in your `gasket.js`:
```js
export default makeGasket({
environments: {
production: {
nextConfig: {
assetPrefix: 'https://<your cdn base url>/<directory that contains .next folder>'
}
}
}
});
```
## Install production only dependencies
When you are deploying your application to production, make sure you only
install the `--production` dependencies to speed up the installation:
```bash
npm install --production
```
## Build for production
For production builds, you want to ensure that you end up with the smallest
bundle possible, so we need to set the `NODE_ENV=production` flag to instruct
the libraries to only include the code that is needed for production:
```bash
NODE_ENV=production npm run build
```
## The `gasket.js` contains environment specific configuration
There are values in the configuration that you might want to adjust when you
deploy to production, for example the hostname of your application, the
port number you deploy on, or even HTTPS options if that is not terminated
at a load balancer level.
Update your `gasket.js` file to include an `environments` object with
configuration values for the environments you deploy on:
```js
export default makeGasket({
environments: {
production: {
hostname: '<appname>.your-url.com',
port: 8080,
//
// Rest of your production configuration here.
//
}
}
});
```
See the [configuration][config] guide for more detailed information.
## What files should be included in your production deployment
Ensure that the following files are included when you deploy your application:
- `.next` (folder) *This contains the output of the WebPack builds*
- `locales` (folder) *Intl information*
- `plugins` (folder) *Plugins that you've written for Gasket*
- `lifecycles` (folder) *Lifecycle function to interact with Gasket*
- `config` (folder) *Environment specific configuration*
- `static` (folder) *Static files that need to be hosted*
- `node_modules` (folder)
- `package.json` *Scripts and dependencies for your project*
- `package-lock.json` *Automatically generated file about the installed dependencies*
- `.babelrc` *Config file for babel*
- `gasket.js` *Config file for Gasket*
## Deployment checklist
- [ ] `npm run analyze` is ran and the application dependency tree is optimized
- [ ] `npm test` is passing
- [ ] `npm run lint` does not contain any warnings
- [ ] `npm audit` does not contain any issues about top level dependencies
- [ ] All dependencies that are used are correctly licensed.
- [ ] `NODE_ENV=production npm run build` is ran
- [ ] SSL certificates are setup and correctly configured in `gasket.config`
- [ ] `gasket.js` contains `environment.production` with prod settings
- [ ] Bumped the version in `package.json`, following the semver standard
## Sample `Dockerfile`
You can also define a container for a `gasket` app to run with a `Dockerfile`.
Follow the [Docker deployment guide] to see a sample `Dockerfile`.
[config]: /packages/gasket-cli/docs/configuration.md
[Docker deployment guide]: docker-deployment.md