vuejs/devtools-v6 · error · Error

[Vue Devtools] Vue version not found

Error message

[Vue Devtools] Vue version not found

What it means

registerDevToolsApp/registerAppJob requires the app's Vue version string to select the correct backend (Vue 2 vs Vue 3) by parsing the major version. If options.version is empty or undefined, it throws instead of guessing a backend. This guards against registering an app whose version could not be detected.

Source

Thrown at packages/app-backend-core/src/app.ts:36

const jobs = new JobQueue()

let recordId = 0

type AppRecordResolver = (record: AppRecord) => void | Promise<void>
const appRecordPromises = new Map<App, AppRecordResolver[]>()

export async function registerApp(options: AppRecordOptions, ctx: BackendContext) {
  return jobs.queue('regiserApp', () => registerAppJob(options, ctx))
}

async function registerAppJob(options: AppRecordOptions, ctx: BackendContext) {
  // Dedupe
  if (ctx.appRecords.find(a => a.options.app === options.app)) {
    return
  }

  if (!options.version) {
    throw new Error('[Vue Devtools] Vue version not found')
  }

  // Find correct backend
  const baseFrameworkVersion = Number.parseInt(options.version.substring(0, options.version.indexOf('.')))
  for (let i = 0; i < availableBackends.length; i++) {
    const backendOptions = availableBackends[i]
    if (backendOptions.frameworkVersion === baseFrameworkVersion) {
      // Enable backend if it's not enabled
      const backend = getBackend(backendOptions, ctx)

      await createAppRecord(options, backend, ctx)

      break
    }
  }
}

async function createAppRecord(options: AppRecordOptions, backend: DevtoolsBackend, ctx: BackendContext) {

View on GitHub (pinned to dd2ab5d427)

Solutions

  1. Pass an explicit version when registering: include `version: Vue.version` (e.g. '3.4.21') in the options object.
  2. Verify the app actually exposes Vue.version before registration; if using a bundled/aliased Vue import, import from the real 'vue' package to get the version.
  3. If writing a custom backend integration, guard the call: only call registerApp once a version string is available, or default to a known major like '3.0.0'.
  4. Update vue-devtools packages to the latest version — newer detectors handle more framework builds.

Example fix

// before
registerDevToolsApi({ app, appId, options: { app } }) // no version

// after
import Vue from 'vue'
registerDevToolsApi({ app, appId, options: { app, version: Vue.version } })
Defensive patterns

Strategy: validation

Validate before calling

const version = options.version ?? Vue.version
if (typeof version !== 'string' || !/^\d+\./.test(version)) {
  throw new Error(`registerApp requires a valid version string, got: ${version}`)
}
registerDevToolsApi({ ...options, version })

Type guard

function hasVersion(o) { return typeof o?.version === 'string' && o.version.length > 0 }

Prevention

When it happens

Trigger: Calling app-backend registerApp (via the registerAppJob path) with an AppOptions object whose `version` field is undefined, null, or an empty string — typically because the backend sent `hook.Vue` / `app.version` before Vue exposed it.

Common situations: Custom app integrations calling the devtools API manually without passing version; apps using exotic Vue builds where `Vue.version` is missing; timing issues where registration happens before the framework sets its version; third-party framework wrappers that report no version.

Understand the failure class

Background: "Must pass :limit option" / "Missing required option" — required option errors explained — this error's family across 41 libraries.

Related errors


AI-assisted analysis of vuejs/devtools-v6@dd2ab5d427 (2026-08-31). Data as JSON: /api/errors/e91a5788f6c8cb8c. Report an issue: GitHub.