Getting started with Vue JS, StoreFront UI, Nuxt JS with Magento 2 GraphQL Crash Course
The original video this piece is based on.
This started as a run of videos I recorded across 2022 and 2023, rewritten here as one piece because the question behind them keeps coming back: how do you actually put a Vue and Nuxt frontend on a Magento store over GraphQL, and is it worth it? The stack has moved on since I filmed those (we're on Nuxt 4 now, and the Vue Storefront project has changed shape), so treat the specific tools as dated. The shape of the approach has held up well, and that shape is the useful part.
Why bolt a Vue frontend onto Magento at all
Magento's own frontend is heavy. It ships a lot of JavaScript, a lot of markup, and a rendering path that fights you when you want a fast, app-like feel. The headless idea is simple to say and harder to do: stop shipping Magento's frontend, keep Magento as the commerce engine and the data source, and build the storefront yourself in something light. When I did this properly the goal was blunt. To get the performance I wanted, I had to throw out Magento's frontend baggage and bring in only the bits I needed.
The GraphQL API is the contract, so test it first
Magento exposes products, categories, search and more over a GraphQL API, and that API is the contract between the store and your frontend. Before I write a line of Vue I open a GraphQL client (Altair, or anything Postman-like) and fire real queries at the store's endpoint. I want to see the exact shape of the data coming back, confirm the fields I think exist actually do, and make sure my queries are right at the very start rather than debugging them through three layers of frontend later. If you get the query right against the raw API first, the component work afterwards is mostly plumbing.
Here's the order I work in:
- Query the API directly until the data looks right.
- Version those queries in the project so they're not scattered through components.
- Then build the Vue component that consumes the data you've already proven.
What you get for free, and what you fight
If you start from a Vue Storefront base, a lot is already built. Category pages, product pages, the cart, the basic plumbing between Magento and the frontend are up and running. The honest first reaction is that there isn't an obvious place to start, because most of it works out of the box. I found the best way in was to take one real job and do it end to end. Get the home page of the storefront to show your Magento home page content, then move outward from there.
One thing that bites people early: a Vue storefront does not natively render Magento's Page Builder content, so you have to do some work to bridge it. I'd argue that's a feature, not a flaw. The moment your frontend isn't tied to Magento's CMS, you're free to pull content from anywhere. You could feed it from Magento, from WordPress, or from a CMS you control. That decoupling is exactly the point of going headless, and it's the thread that later led me off Magento entirely.
A search component is the clearest worked example
If you want one feature that proves the whole approach, build search. Magento's GraphQL API has a products query that takes a search term, so you can hand it a keyword like "bottoms" and get the matching products back. Test that in your GraphQL client first and watch what comes back: a direct name match plus the looser matches the search engine thinks are relevant. Once the query behaves, the Vue side is a small component: an input, a debounced call to that query, and a list of results. You can tighten it by searching names only rather than descriptions, depending on how noisy your catalogue is. It's a contained piece of work that touches the API, the query layer and the component, which is why I always reach for it as the teaching example.
Where the performance actually comes from
The reason I went down this road was speed. The route to a 100 score wasn't a magic config flag, it was discipline about what you ship. I built a small custom Magento module to expose just the blocks and data the Vue app needed, pulled that over the API, and rendered it with Vue and Tailwind, bundled with Laravel Mix at the time. Because you're only sending the data the page uses, the payload is tiny compared to the full Magento frontend. Nuxt then gives you server rendering so the pages are still good for SEO and first paint, which is the bit a pure client-side Vue app gets wrong.
The honest caveats
This is more moving parts, not fewer. You now own the frontend, the build, the SEO and the deploy, where Magento used to hand you all of that, badly but for free. For a small store that converts fine and loads acceptably, this is over-engineering and I'd talk you out of it. The stores where it pays off are the ones where speed is money and the team can maintain a Vue app. If that's you, the payoff is real: a storefront that feels like an app, scores you want on PageSpeed, and a frontend you control instead of one you wrestle.
Doing this is also what convinced me to stop meeting Magento halfway. Once the frontend was a Vue app talking to an API, Magento was just one possible backend, and a heavy one. That's the story I tell in why I moved from Magento to headless, and if performance is what you're chasing, it pairs with how I get 100/100 now. Build the search component, prove the approach to yourself, then decide how far down the road you want to go.