Skip to main content
Have a Wasp app in production? 🐝 We'll send you some swag! πŸ‘•
This is documentation for Wasp 0.12.0, which is no longer actively maintained.
For up-to-date documentation, see the latest version (0.20.0).
Version: 0.12.0

Client Config

You can configure the client using the client field inside the app declaration:

  • JavaScript
  • TypeScript
main.wasp
appMyApp{
title: "My app",
// ...
client: {
rootComponent: importRootfrom"@src/Root.jsx",
setupFn: importmySetupFunctionfrom"@src/myClientSetupCode.js"
}
}

Root Component​

Wasp gives you the option to define a "wrapper" component for your React app.

It can be used for a variety of purposes, but the most common ones are:

  • Defining a common layout for your application.
  • Setting up various providers that your application needs.

Defining a Common Layout​

Let's define a common layout for your application:

  • JavaScript
  • TypeScript
main.wasp
appMyApp{
title: "My app",
// ...
client: {
rootComponent: importRootfrom"@src/Root.jsx",
}
}
src/Root.jsx
exportdefaultfunctionRoot({ children }){
return(
<div>
<header>
<h1>My App</h1>
</header>
{children}
<footer>
<p>My App footer</p>
</footer>
</div>
)
}

Setting up a Provider​

This is how to set up various providers that your application needs:

  • JavaScript
  • TypeScript
main.wasp
appMyApp{
title: "My app",
// ...
client: {
rootComponent: importRootfrom"@src/Root.jsx",
}
}
src/Root.jsx
importstorefrom'./store'
import{Provider}from'react-redux'

exportdefaultfunctionRoot({ children }){
return<Providerstore={store}>{children}</Provider>
}

As long as you render the children, you can do whatever you want in your root component.

Read more about the root component in the API Reference.

Setup Function​

setupFn declares a function that Wasp executes on the client before everything else.

Running Some Code​

We can run any code we want in the setup function.

For example, here's a setup function that logs a message every hour:

  • JavaScript
  • TypeScript
src/myClientSetupCode.js
exportdefaultasyncfunctionmySetupFunction(){
let count =1
setInterval(
()=>console.log(`You have been online for ${count++} hours.`),
1000*60*60
)
}

Overriding Default Behaviour for Queries​

info

You can change the options for a single Query using the options object, as described here.

Wasp's useQuery hook uses react-query's useQuery hook under the hood. Since react-query comes configured with aggressive but sane default options, you most likely won't have to change those defaults for all Queries.

If you do need to change the global defaults, you can do so inside the client setup function.

Wasp exposes a configureQueryClient hook that lets you configure react-query's QueryClient object:

  • JavaScript
  • TypeScript
src/myClientSetupCode.js
import{ configureQueryClient }from'wasp/client/operations'

exportdefaultasyncfunctionmySetupFunction(){
// ... some setup
configureQueryClient({
defaultOptions:{
queries:{
staleTime:Infinity,
},
},
})
// ... some more setup
}

Make sure to pass in an object expected by the QueryClient's constructor, as explained in react-query's docs.

Read more about the setup function in the API Reference.

Base Directory​

If you need to serve the client from a subdirectory, you can use the baseDir option:

main.wasp
appMyApp{
title: "My app",
// ...
client: {
baseDir: "/my-app",
}
}

This means that if you serve your app from https://example.com/my-app, the router will work correctly, and all the assets will be served from https://example.com/my-app.

Setting the correct env variable

If you set the baseDir option, make sure that the WASP_WEB_CLIENT_URL env variable also includes that base directory.

For example, if you are serving your app from https://example.com/my-app, the WASP_WEB_CLIENT_URL should be also set to https://example.com/my-app, and not just https://example.com.

API Reference​

  • JavaScript
  • TypeScript
main.wasp
appMyApp{
title: "My app",
// ...
client: {
rootComponent: importRootfrom"@src/Root.jsx",
setupFn: importmySetupFunctionfrom"@src/myClientSetupCode.js"
}
}

Client has the following options:

  • rootComponent: ExtImport​

    rootComponent defines the root component of your client application. It is expected to be a React component, and Wasp will use it to wrap your entire app. It must render its children, which are the actual pages of your application.

    Here's an example of a root component that both sets up a provider and renders a custom layout:

    • JavaScript
    • TypeScript
    src/Root.jsx
    importstorefrom'./store'
    import{Provider}from'react-redux'

    exportdefaultfunctionRoot({ children }){
    return(
    <Providerstore={store}>
    <Layout>{children}</Layout>
    </Provider>
    )
    }

    functionLayout({ children }){
    return(
    <div>
    <header>
    <h1>My App</h1>
    </header>
    {children}
    <footer>
    <p>My App footer</p>
    </footer>
    </div>
    )
    }
  • setupFn: ExtImport​

    You can use this function to perform any custom setup (e.g., setting up client-side periodic jobs).

    • JavaScript
    • TypeScript
    src/myClientSetupCode.js
    exportdefaultasyncfunctionmySetupFunction(){
    // Run some code
    }
  • baseDir: String​

    If you need to serve the client from a subdirectory, you can use the baseDir option.

    If you set baseDir to /my-app for example, that will make Wasp set the basename prop of the Router to /my-app. It will also set the base option of the Vite config to /my-app.

    This means that if you serve your app from https://example.com/my-app, the router will work correctly, and all the assets will be served from https://example.com/my-app.

    Setting the correct env variable

    If you set the baseDir option, make sure that the WASP_WEB_CLIENT_URL env variable also includes that base directory.

    For example, if you are serving your app from https://example.com/my-app, the WASP_WEB_CLIENT_URL should be also set to https://example.com/my-app, and not just https://example.com.

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /