Getting Started

Let's build with Waku!


Getting Started

To create a new Waku project run the following command in your terminal:

npm create waku@latest

Follow the CLI instructions and name the project something like waku-tutorial. Then open the project, install dependencies, and run the development server:

cd waku-tutorial
npm install
npm run dev

Now open up your browser and go to http://localhost:3000. You should see a simple Waku app with an interactive counter.

Let’s take a look at the files and code that we were given:

Server Components

If we take a deeper look at /src/pages/index.tsx, we notice that our component is an async server component:

// line 5
export default async function HomePage() {
  const data = await getData();
  // ...rest of the file
}

This allows us to make an async call to get some data that happens securely on the server.

Server components can access files and databases directly, keep the client bundle size smaller, and perform other server-side logic! Keep in mind that they only run once on the server (i.e., they never re-render).

Client Components

Go ahead and open up /src/components/counter.tsx:

'use client';

import { useState } from 'react';

export const Counter = () => {
  const [count, setCount] = useState(0);
  // ...rest of the file
};

As you can see on top of the file, it contains a 'use client' directive. This tell us it (and any components it imports) will be client components. These are the traditional React components that we’ve come to know and love, which can use all of the familiar React client API such as useEffect and useState.

Routing

To handle routing in Waku, there is a familiar pages router.

Everything that’s inside the /src/pages directory abides by the router’s rules:

  • /pages/_layout.tsx is a layout
  • /pages/index.tsx is a single route page
  • /pages/about.tsx is a single route page

As you can see, there’s two ways to create pages:

  1. use an index file (e.g., /pages/contact/index.tsx)
  2. use a single named file (e.g., /pages/contact.tsx)

Either of these would render under the /contact route.

Layouts are created with the special _layout.tsx filename and are how we create a shared layout that wraps a route and its descendents.

The layout at /pages/_layout.tsx is the root layout, which wraps the entire site. Layouts can be nested as well, which we’ll see later. We’ll also discover segment routes, nested segment routes, and catch-all routes as well as Waku’s two rendering methods: static prerendering at build time and dynamic rendering at request time.

And that’s all you need to get started

Soon, we’ll dive deeper into everything to understand how powerful, but simple Waku is! 🙂


Next Steps

In Chapter 2 we will start building a small Todo Application to get some hands on experience with Waku.

You’ll learn more about server components, client components, router, navigation, and more!