Installation and Setup
Installing Relay
Relay comes with quite a number of dependencies that don't involve Next.js.
We'll set those up first before moving on to relay-nextjs
.
First install Relay's runtime dependencies:
npm install react-relay relay-runtime
TypeScript users should install appropriate @types
packages:
npm install --save-dev @types/react-relay @types/relay-runtime
Configuring Relay
Install relay-config
to provide a single configuration file to the rest of
Relay:
npm install --save-dev relay-config
Create relay.config.js
. For Next.js projects using TypeScript this should look
something like this:
module.exports = {
src: './src',
schema: './src/schema/__generated__/schema.graphql',
exclude: ['**/node_modules/**', '**/__mocks__/**', '**/__generated__/**'],
extensions: ['ts', 'tsx'],
language: 'typescript',
artifactDirectory: 'src/queries/__generated__',
};
Configuring artifactDirectory
Next.js's /pages
directory cannot include non-React components as default
export.
By default, the relay-compiler generates *.graphql.ts
files that are
co-located with the corresponding files containing graphql tags. To fix this
configure artifactDirectory
to emit to src/queries/__generated__
:
module.exports = {
// ...
artifactDirectory: 'src/queries/__generated__',
}
For more information please see the Relay
type emission documentation.
Alternatively you can keep *.graphql.ts
files in /pages
directory with
pageExtensions
.
Installing Relay Compiler
The Relay Compiler statically analyzes and optimizes GraphQL queries in your application. To install the dependencies run:
npm install --save-dev relay-compiler relay-compiler-language-typescript babel-plugin-relay graphql
For convenience create a package.json
to run the compiler:
{
"scripts": {
"generate:relay": "relay-compiler"
}
}
Then configure Babel to compile away graphql
strings:
.babelrc
:
{
"presets": ["next/babel"],
"plugins": ["relay"]
}
relay-nextjs
is designed to run on both the server and client. To avoid
pulling in server dependencies to the client bundle configure Webpack to ignore
any files in src/lib/server
. In next.config.js
:
const webpack = require("webpack");
//...
module.exports = {
webpack: (config, { isServer, webpack }) => {
if (!isServer) {
// Ensures no server modules are included on the client.
config.plugins.push(
new webpack.IgnorePlugin({ resourceRegExp: /lib\/server/ })
);
}
return config;
},
};
If your path to server-only files is different please adjust the above RegExp properly.