vuejs/vue · critical · Error

\n\nVue packages version mismatch:\n\n- vue@${vueVersion}\n-

Error message

\n\nVue packages version mismatch:\n\n- vue@${vueVersion}\n- ${packageName}@${packageVersion}\n\nThis may cause things to work incorrectly. Make sure to use the same version for both.\n

What it means

Thrown at module-load time by vue-server-renderer's index.js when the resolved 'vue' package version differs from vue-server-renderer's own package.json version. The two packages are tightly coupled (shared internals, SSR compile helpers) and must ship at the same version. This runs synchronously during require(), so it aborts the process before any SSR code executes.

Source

Thrown at packages/server-renderer/index.js:8

try {
  var vueVersion = require('vue').version
} catch (e) {}

var packageName = require('./package.json').name
var packageVersion = require('./package.json').version
if (vueVersion && vueVersion !== packageVersion) {
  throw new Error(
    '\n\nVue packages version mismatch:\n\n' +
      '- vue@' +
      vueVersion +
      '\n' +
      '- ' +
      packageName +
      '@' +
      packageVersion +
      '\n\n' +
      'This may cause things to work incorrectly. Make sure to use the same version for both.\n'
  )
}

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./build.prod.js')
} else {
  module.exports = require('./build.dev.js')
}

View on GitHub (pinned to 9e88707940)

Solutions

  1. Align both packages to the exact same version: npm install vue@2.7.16 vue-server-renderer@2.7.16 (use the same version string for both).
  2. Delete node_modules and the lockfile, then reinstall to resolve any dedupe drift.
  3. Run `npm ls vue vue-server-renderer` (or pnpm why vue) to find nested conflicting installations and dedupe them.
  4. If using a monorepo, ensure all workspaces resolve vue and vue-server-renderer to the same version via resolutions/overrides.

Example fix

// before (mismatched)
// package.json: "vue": "2.6.14", "vue-server-renderer": "2.7.16"

// after (aligned)
// package.json: "vue": "2.7.16", "vue-server-renderer": "2.7.16"
// then run: npm install
Defensive patterns

Strategy: validation

Validate before calling

const vueVersion = require('vue/package.json').version
const ssrVersion = require('vue-server-renderer/package.json').version

if (vueVersion !== ssrVersion) {
  throw new Error(
    `Refusing to start: vue@${vueVersion} vs vue-server-renderer@${ssrVersion}. ` +
    `Run: npm install vue@${ssrVersion} vue-server-renderer@${ssrVersion}`
  )
}

Type guard

function versionsAligned(a: string, b: string): boolean {
  return a === b
}

Try / catch

// Version check throws at require() time — cannot try/catch around a transitive require easily.
// Validate before requiring:
const pkg = name => require(`${name}/package.json`).version
if (pkg('vue') !== pkg('vue-server-renderer')) {
  process.exitCode = 1
  console.error('Fix versions before continuing.')
} else {
  require('vue-server-renderer')
}

Prevention

When it happens

Trigger: require('vue-server-renderer') when node_modules contains vue@2.6.x and vue-server-renderer@2.7.x (or any mismatched pair). The version read from require('vue').version is compared to the package.json version of the server-renderer.

Common situations: A dependency upgrade bumps vue-server-renderer but leaves vue on the old version (or vice versa). npm/yarn dedupe resolves a nested different version. Lockfile drift after a partial upgrade. Using aliasing (webpack resolve.alias) that points vue to a different version than what node_modules resolves.

Related errors


AI-assisted analysis of vuejs/vue@9e88707940 (2026-08-11). Data as JSON: /api/errors/91af183399839bcc. Report an issue: GitHub.