How to detect Vue.js on any website
Progressive JavaScript framework — the most popular alternative to React, especially in Asia and Europe.
By Mapree ·
Official siteWhat is Vue.js?
Vue.js pioneered the single-file component pattern (`.vue` files) and powers Nuxt, most Chinese e-commerce frontends, and a huge portion of European dev-tools. Vue 3 is based on the Composition API; Vue 2 is still in wide use in long-tail apps.
Vue occupies a distinctive niche: it's React-adjacent in capability but substantially more prescriptive about conventions (single-file components, explicit reactivity primitives, first-party router and state library). That prescriptiveness is a feature for teams that prefer a less-plural ecosystem. Vue 3 rewrote the reactivity system using Proxies and introduced the Composition API, bringing the authoring model closer to React hooks while keeping the template syntax. Vue 2 reached end-of-life at the end of 2023 but a long tail of applications still run it. Detecting Vue on a site usually implies Nuxt above it (the SSR meta-framework), a Pinia or Vuex state layer, Vue Router for navigation, and a Tailwind or custom utility CSS layer.
Why it matters to identify
Vue's ecosystem is largely invisible to naive detectors because much of it is hydrated at runtime. Seeing Vue in an enumeration tells you whether you're dealing with an SSR Nuxt app, a client-only SPA, or a server-rendered app with Vue as an enhancement layer. It also strongly correlates with geography: European and Chinese sites over-index on Vue compared to the global React-heavy baseline.
A brief history of Vue.js
Vue was released by Evan You in 2014. v1 (2015), v2 (2016), v2.6 (2019, Slots API), v3 (2020, Proxy reactivity and Composition API). Vue 2 reached end-of-life December 2023 with a paid LTS continuation. Over the years Vue's governance has remained independent (unlike React's Facebook-backing or Angular's Google-backing), which shapes some of its community dynamics.
Ecosystem and common pairings
Typical Vue stack: Vue + Nuxt (for SSR) + Pinia (state) + VueUse (composable utilities) + Vue Router (always bundled with Nuxt) + Tailwind or Vuetify or PrimeVue (UI). Data fetching is `useFetch`/`useAsyncData` from Nuxt, or a third-party library. Form validation often via VeeValidate or Vuelidate.
Detection signals we look at
Each signal alone is rarely conclusive; the detector cross-references all of them and weights by confidence. You can reproduce any of these checks yourself in Chrome DevTools.
window.Vue|window.__VUE__
Runtime Vue global, present in both Vue 2 and Vue 3 apps when Vue is exposed to the window.
[data-v-app]|[v-cloak]
Vue 3 sets `data-v-app` on the root of the hydrated tree. `v-cloak` is older.
node_modules/vue/|node_modules/@vue/
Vue bundled under these paths. Version comes from the embedded `package.json`.
<!--v-if-->|<!--v-for-->
Vue uses HTML comment placeholders for conditional rendering. Not exclusive but strongly suggestive.
Versioning
What you typically see in production
Vue's footprint in the wild is heavily skewed by region and vertical. European sites — particularly French, German and Eastern European agencies — over-index on Vue compared to the global React-dominant baseline. Chinese e-commerce (Alibaba, JD, Tmall) standardised on Vue early and continues to ship it across hundreds of millions of pages per day. Documentation sites, small-team SaaS products and Laravel-shop deployments also lean Vue, partly because of the historical alignment between Vue and the Laravel/PHP ecosystem. A typical Vue 3 production page weighs less than the equivalent React page — the Composition API and the proxy-based reactivity system both produce smaller compiled output, and the Vue ecosystem has fewer must-have UI libraries than React's, so teams often ship a leaner stack. The detection signature is unmistakable once you have seen it a few times: `<div data-v-app>` on the hydration root, `node_modules/vue/dist/vue.runtime.esm-browser.prod.js` (or the equivalent ESM bundle path) in the source, and frequent HTML-comment placeholders like `<!--v-if-->` or `<!--v-for-->` left in the rendered output where conditional blocks were rendered out. Vue 2 still ships in the wild despite official end-of-life in December 2023 because the upgrade tax to Vue 3 (Composition API rewrite, breaking changes in reactivity, removal of `Vue.extend`) is non-trivial for large codebases. You will see Vue 2 most often on long-running enterprise apps, on WordPress plugin frontends that bundled Vue 2 years ago and never re-evaluated, and on Chinese commerce sites that prioritised stability over migration. The paid LTS continuation from HeroDevs keeps Vue 2 patched for security through 2026. Nuxt sits on top of Vue on a meaningful share of Vue sites. The two share enough surface area (`/_nuxt/` paths, `__NUXT__` global, the `<div id="__nuxt">` wrapper) that a quick check disambiguates them in seconds. When you see Vue without Nuxt the site is usually a SPA with manual routing via Vue Router, a Pinia store, and either a Tailwind or Vuetify visual layer.
Sites commonly running Vue.js
- alibaba.com
- gitlab.com
- laravel.com
- nintendo.com (regional)
- jd.com
Often confused with
Vue.js vs Nuxt
Nuxt is built on Vue, so every Nuxt site is a Vue site, but the reverse is not true — lots of Vue sites are vanilla SPAs without the Nuxt SSR layer. The clean disambiguation is to look for `/_nuxt/` chunk URLs and the `<div id="__nuxt">` wrapper; if those are absent, you are on plain Vue.
Vue.js vs Alpine.js
Alpine sits in a similar 'progressive enhancement' niche but is a much smaller library that targets sprinkles of interactivity rather than full SPAs. `[x-data]` and `[x-init]` attributes signal Alpine; Vue's signature is `[data-v-app]` and the bundled `node_modules/vue/` paths.
Vue.js vs Petite Vue
Petite Vue is a 6KB subset of Vue 3 designed for progressive enhancement. It uses `<div v-scope>` markers and ships from `node_modules/petite-vue/`, distinguishable from full Vue by both size and the absence of `data-v-app`.
FAQ
How do I tell Vue 2 from Vue 3?
The `node_modules/vue/package.json` in the sourcemap is the authoritative source. Bundle-shape signals also help: Vue 3 imports from `@vue/reactivity`, `@vue/runtime-core` and `@vue/runtime-dom` (the package was split into multiple modules), while Vue 2 has a single `node_modules/vue/dist/vue.runtime.common.prod.js`. The Composition API only ships in Vue 3, so seeing `defineComponent`, `ref`, `reactive` or `computed` imports in the reconstructed source confirms 3.
Is Vue still actively used now that React dominates?
Yes, particularly outside North America. Chinese e-commerce, European agencies, Laravel ecosystem, documentation sites and small-team SaaS products all skew Vue. The total share is smaller than React but it is steady, not declining, and the ecosystem (Nuxt, Pinia, Vite, VueUse) is mature and well-maintained.
Does the `Vue.version` global still work?
When Vue is exposed as a runtime global (most CDN-linked deployments and some bundled apps that explicitly attach Vue to `window`), yes. Modern bundled Vue apps — especially Nuxt — usually do not expose the global, so the sourcemap path is the reliable answer.
What's the difference between Options API and Composition API?
Two ways of authoring Vue components. Options API is the original Vue 2 / Vue 3 default style (the `data() { return ... }, methods: { ... }` pattern). Composition API is the React-hooks-shaped alternative introduced in Vue 3 (`setup() { const x = ref(...) ... }`). Both ship in Vue 3 today; new code increasingly uses Composition API.
Why do I see HTML comments like `<!--v-if-->` in the rendered output?
Vue's compiler emits HTML comment placeholders to mark where conditional rendering was true/false at render time. They are part of the framework's hydration mechanism and have nothing to do with developer-authored comments. They are also a strong Vue fingerprint — no other framework leaves that exact marker pattern.
Should I use Sourcemap Explorer to detect Vue?
It is the fastest path. The popup confirms Vue presence, reads the exact version from `node_modules/vue/package.json`, and surfaces the surrounding ecosystem (Pinia, VueUse, Nuxt modules, Vue Router) in one click. For a quick visual check the `<div data-v-app>` and `/_nuxt/` signals are also enough.
Related
See Vue.js — with the exact version — on every site you visit.
Sourcemap Explorer runs these checks passively in the background. When the target library is bundled, you get the precise package.json-level version.