Custom App builder for Next.js.
Next.js uses the App component to initialize pages. You can override it and control the page initialization. Which allows you to do amazing things like:
- Persisting layout between page changes
- Keeping state when navigating pages
- Custom error handling using componentDidCatch
- Inject additional data into pages
- Add global CSS
For more details, see offical documentation.
Generates a custom next App using middleware.
Before:
class CustomNextApp extends App {
static async getInitialProps({ Component, ctx, router }) {
const initialPageProps = await (Component.getInitialProps ? Component.getInitialProps : {});
const data = await fetch(getDataForPage(router.pathname));
return {
pageProps: {
...initialPageProps,
data
}
};
}
render() {
const { Component, pageProps } = this.props;
return (
<SsrDataProvider data={pageProps.ssrData}>
<LayoutComponent>
<Component {...pageProps} />
</LayoutComponent>
</SsrDataProvider>
);
}
}
After:
const ssrDataMiddleware = {
Component: SsrDataProvider,
getInitialProps: ({ router }) => {
const data = await fetch(getDataForPage(router.pathname));
return { data };
}
};
const layoutMiddleware = { Component: LayoutComponent };
nextAppBuilder({
middleware: [ssrDataMiddleware, layoutMiddleware]
});
Install using Yarn:
yarn add @scacap/next-app-builder
or NPM:
npm install @scacap/next-app-builder --save
// pages/_app.js
import nextAppBuilder from '@scacap/next-app-builder';
import materialUiMiddleware from '../middlewares/material-ui';
import theme from '../theme';
export default nextAppBuilder({
middleware: [materialUiMiddleware(theme)]
});
Creates a custom app that should be the default export of pages/_app.js
.
const CustomApp = appBuilder({
middleware: [
// middlewares here
]
});
An object containing the following fields:
- name: a human readable identifier of middleware. Optional.
- getInitialProps: a function which is executed before rendering. Used for blocking data requirements for every single page in your application, e.g. server side data fetching. Optional.
- Component: the React component which is rendered in custom App. It's a wrapper component that will receive each page as children. Typically used for adding providers in the App level, e.g. css theme provider. Optional.
- componentDidCatch: invoked when a descendant component throws an error. See more details in the React docs. Optional.
Internally, you will be adding a custom getInitialProps in your App. This will disable Automatic Static Optimization in pages without Static Generation.
For more details, see offical documentation.
Let's build together our v1! Pull-requests and issue reports are welcome.