Add a headless CMS to Nuxt 3 in 5 minutes
Storyblok is the first headless CMS that works for developers & marketers alike.
If you’re in a hurry, have a look at our live demo in Stackblitz! Alternatively, you can explore or fork the code from the Nuxt Ultimate Tutorial GitHub Repository.
Environment Setup
Requirements
To follow this tutorial make sure to meet these requirements:
- Basic understanding of Vue.js, Nuxt.js and JavaScript
- Node.js LTS version
- An account in the Storyblok App
The project in this tutorial and its subsequent parts was developed using the following versions:
- nuxt@3.10.2
- @storyblok/nuxt@6.0.4
Please remember that these versions may be slightly behind the latest ones.
Create a Nuxt project
Following the Nuxt 3 official installation guide, we can easily create our project using the installation tool nuxi
. Use it by running the following command:
If you open your newly created project folder in your code editor of choice, you will notice that by default, Nuxt 3 uses TypeScript. However, since we would like to use simple JavaScript for this project, we can delete the tsconfig.json
and rename nuxt.config.ts
to nuxt.config.js
.
Once you installed the dependencies by running npm install
, you can launch the project by running npm run dev
. Now you’ll see this screen when you open http://localhost:3000 in your browser:
Create a new space in the Storyblok app by choosing the Create space {1} option. Pick a name for it {2}. Optionally, you can choose between different server locations for your space {3} (if you choose the United States or China, please be mindful of the required API parameter explained hereinafter).
Shortly afterward, a Storyblok space with sample content has been created for you. Let’s open the Home story by first clicking on Content {1} and then on Home {2}:
Now you’ll see the default screen and the Visual Editor:
Enabling the Visual Editor
In order to actually see your Nuxt project in the Visual Editor, we’ll have to define the default environment URL. Let’s do that by going to Settings > Visual Editor {1} and setting the Location field to https://localhost:3000/ {2}:
Storyblok v2 requires that your website is served via HTTPS. You can follow the instructions in our FAQ entry: How to set up SSL in Nuxt 3.
Now, if you go back to the Home story, you won’t see your Nuxt app there just yet. Just one more quick step to take: Open the Entry configuration {1} and set the Real path to /
{2}. After having saved, you should now be seeing your Nuxt app in the Visual Editor:
This SDK allows you to interact with the Storyblok API. On top of that, it also provides an ingeniously simple way to enable real-time editing! Let’s start configuring it.
Before we jump into the code, we quickly need to grab our API token from our space. Let’s do that by going to Settings > Access Tokens {1} and copying the Preview Token {2}.
Now we can use this token by adding the following configuration to the modules of nuxt.config.js
:
Setting the correct region
Depending on whether your space was created in the EU, the US, Australia, Canada, or China, you may need to set the region
parameter of the API accordingly:
eu
(default): For spaces created in the EUus
: For spaces created in the USap
: For spaces created in Australiaca
: For spaces created in Canadacn
: For spaces created in China
Here's an example for a space created in the US:
Note: For spaces created in any region other than the EU, the region parameter must be specified.
Rendering Dynamic Components in the Nuxt App
The core idea of using Storyblok for this particular use case is the following:
- Content managers (even if it’s only yourself) can create pages (or stories) composed of different components (or blocks)
- Developers receive the page in the JSON format by using the Storyblok API and can render components accordingly (this is what we want to accomplish in our Nuxt app)
When you create a new space from scratch, Storyblok automatically creates four default components for you:
page
: Content type blockgrid
: Nested blockfeature
: Nested blockteaser
: Nested block
You can find all of these in the Components section of your space.
Understand the difference between the nestable components and content type in our Structures of Content tutorial.
You may be wondering why we added those components to a storyblok
subfolder. By doing that, they’re found and loaded automatically by the Storyblok Nuxt module. No need to register your components – it doesn’t get any easier!
Next, let’s add it to the modules in nuxt.config.js
:
Finally, we’ll have to create the following two files:
And that’s it! Let’s move on.
All we have to do is to create a pages/index.vue
with the following code:
Having created this file, you can now delete the app.vue
at the root of your project.
At this point, the components should be rendered successfully when viewing the Home story in the Visual Editor.
Real-time editing with Storyblok Bridge
The power of Storyblok relies on its fantastic real-time editing experience. Play with changing the teaser headline or re-arranging the features and see the magic happen!
Fortunately, @storyblok/nuxt
makes it very easy for you. Your components have to be connected with Storyblok and listen to changes by its Visual Editor. Let's take a closer look at how this is achieved:
First, to link your Vue and Storyblok components together, @storyblok/nuxt
automatically registers a v-editable
directive. If you take a look at the components in your components/storyblok
folder, you'll already find it there.
Second, useAsyncStoryblok
loads the Storyblok Bridge under the hood by default.
For now, you can only 1 useAsyncStoryblok
or useStoryblok
composable per page because they're loading the bridge. For more API calls, you can use useStoryblokApi
.
If you want to learn more (or if you prefer working with the Options API), have a look at our docs on GitHub. Alternatively, you can check out the long form in our SDK demo.
Continue reading and find out How to Render Storyblok Stories Dynamically in Nuxt.
Resource | Link |
---|---|
Storyblok Nuxt 3 Ultimate Tutorial | https://www.storyblok.com/tp/storyblok-nuxt-ultimate-tutorial |
Storyblok Nuxt 3 Module | https://github.com/storyblok/storyblok-nuxt |
Storyblok Nuxt Technology Hub | https://www.storyblok.com/tc/nuxtjs |
Storyblok APIs | https://www.storyblok.com/docs/api |
Nuxt 3 | https://v3.nuxtjs.org/ |