Use PouchDB on a Vue 3 app with Vite

Fix the global-is-not-defined and process errors when using PouchDB in a Vue 3 + Vite application.

2 min read Updated

PouchDB expects Node globals that Vite does not define in the browser, which usually shows up as global is not defined or a `process@@ error during the build. This note explains the two errors and the Vite configuration that resolves them. The configuration and error output are below.

When trying to use PouchDB on a web application built with the default Vite config, the build step failed with:

Error 1

text
Uncaught ReferenceError: global is not defined

Error 2

text
Uncaught Error: Module "events" has been externalized for browser compatibility and cannot be accessed in client code.

This snippet shows how to fix this on index.html, package.json and vite.config.js

index.html.diff

text
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <link rel="icon" href="/favicon.ico"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>MyApp</title>
  </head>
  <body>
    <div id="app"></div>
+    <script>window.global = {}</script>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

package.json.diff

text
{
  "name": "myapp",
  "version": "1.0.0",
  "license": "ISC",
  "dependencies": {
    "pouchdb": "^7.2.2",
    "pouchdb-find": "^7.2.2",
    "vue": "^3.2.25"
  },
  "devDependencies": {
+    "events": "^3.3.0"
  }
}

vite.config.js.diff

text
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
  ],
+  optimizeDeps: {
+    include: [
+      'events',
+    ],
+  },
});

Search articles

Type to filter articles. Use the arrow keys to move through results and Enter to open one. Press Escape to close.