Skip to main content

ServerPlugin API

To create a serverPlugin, use

import { createServerPlugin } from 'shuvi'

Context​

The context stores a series of useful data and utils and can be visit in the last parameter of every hook handler.

The context of serverPlugin has all the fields of the context of corePlugin, and the following field.

serverPluginRunner​

An object containing every hook runner.

Example:

context.serverPluginRunner[hookName]()              // if initialValue and extraArg are void
context.serverPluginRunner[hookName](extraArg) // if initialValue is void
context.serverPluginRunner[hookName](initialValue) // if extraArg is void

onListen​

will executed on server listening.

  • hookType: AsyncParallelHook
  • initialValue: { port: number; hostname?: string }
  • extraArg: void
  • returnType: void

addProxy​

add local api proxy, usually works at development mode.

Example:

export default createServerPlugin({
addProxy: () => {
const isDev = process.env.NODE_ENV === 'development'
return isDev ? {
context: (pathname) => /^\/api/.test(pathname),
target: process.env.API_HOST,
} : []
}
})

addMiddleware​

add server middlewares with express-style.

  • hookType: AsyncParallelHook

  • initialValue: void

  • extraArg: void

  • returnType: IServerMiddleware | IServerMiddleware[]

    type IServerMiddleware = IMiddlewareHandler | 
    {
    path: string;
    handler: IMiddlewareHandler
    };

    type IMiddlewareHandler =
    (res: IRequest, req: http.ServerResponse, next: (err?: any) => void)
    => void | Promise<void>

    interface IRequest extends http.IIncomingMessage {
    url: string;
    pathname: string;
    query: Record<string, any>;
    params: Record<string, any>;;
    headers: http.IncomingHttpHeaders;
    }

    interface IResponse extends http.ServerResponse {}

Example:

export default createServerPlugin({
addProxy: () => [{
path: 'test',
handler: (_, _, next) => {
console.log(1);
next();
}
}]
})

renderToHTML​

modify how to render app component to html

  • hookType: AsyncSeriesWaterfallHook
  • initialValue: IRenderToHTML
    type IRenderToHTML = (
    req: http.IncomingMessage,
    res: http.ServerResponse
    ) => Promise<string | null>;
  • extraArg: void

Example:

export default createServerPlugin({
renderToHTML: renderToHTML => {
return async (req, res) => {
const html = await renderToHTML(req, res);
console.log('custom-renderToHTML', html);
return html;
};
}
})

pageData​

Add properties to pageData object.

Example:

export default createServerPlugin({
pageData: appContext => {
const { test } = appContext;
return {
test
};
}
})

Extending types​

The type of serverPlugin hooks can be extended as the following example:

types.d.ts
declare module '@shuvi/runtime' {
export interface CustomServerPluginHooks {
extendedHookExample: typeof extendedHookExample
}
}