Custom App
Create a src/app.js or src/app.ts file to intervene shuvi app.
init
run on initialization
example:
src/app.ts
import { InitFunction } from '@shuvi/runtime/app'
export const init = () => {
  console.log('init');
};
appContext
Should return custom ctx data, mixin ctx.appContext, fired after init.
example:
src/app.ts
import { AppContextFunction } from '@shuvi/runtime/app'
export const appContext: AppContextFunction = ctx => {
  return {
    ...ctx,
    data: 1
  };
}
appComponent
appComponent is a function that should return a component that is the arrow at the top of the entire application.
example:
src/app.ts
import { AppComponentFunction } from '@shuvi/runtime/app'
export const appComponent: AppComponentFunction = async UserApp => {
  function AppComponent() {
    return (
      <div>
        <div>This is AppComponent</div>
        <UserApp />
      </div>
    );
  }
  return AppComponent;
};
src/routes/page.js
// src/routes/page.js
export default function Index() {
  return <div>Index Page</div>;
}
The notes shown layers of HOC in result HTML.
// render result
<div id="__APP"> // container to render
  // appComponent HOC
  <div>
    <div>This is AppComponent</div>
    // index page
    <div>Index Page</div>
  </div>
</div>
dispose
Will only run on the server side, when the page request is completed.
example:
src/app.ts
import { DisposeFunction } from '@shuvi/runtime/app';
export const dispose: DisposeFunction = () => {
  console.log('dispose');
};