Pinia Cookie Persist - Nuxt 3 Module
Persist Pinia state in cookies with flexible global & per-store options.
📦 Installation
-
Install the package:
npm install pinia-cookie-persist
# or
yarn add pinia-cookie-persist
-
Add to nuxt.config.ts
:
export default defineNuxtConfig({
modules: [
'pinia-cookie-persist' // 👈 Add this
]
})
⚙️ Configuration
1. Global Options (Optional)
Set defaults in nuxt.config.ts
:
export default defineNuxtConfig({
modules: ['pinia-cookie-persist'],
piniaCookiePersist: {
globalCookieOptions: { // Applies to all stores unless overridden
path: '/',
maxAge: 86400, // 1 day
secure: true, // HTTPS-only in production
sameSite: 'lax'
}
}
})
2. Per-Store Options
Override global settings in any Pinia store:
export const useAuthStore = defineStore('auth', {
state: () => ({
token: null,
user: null
}),
persist: {
key: 'auth', // Custom cookie name (default: store.$id)
paths: ['token'], // Only persist these fields
cookieOptions: { // Overrides global settings
maxAge: 3600, // 1 hour (for this store only)
sameSite: 'strict'
}
}
})
✨ Features
✅ Flexible Priority System
- Store-level
cookieOptions
> Global globalCookieOptions
> Plugin defaults.
✅ Automatic Cookie Management
- Hydrates store from cookies on page load
- Updates cookies when state changes
✅ Secure by Default
secure: true
in production
- Configurable
sameSite
policies
✅ SSR Compatible
- Works seamlessly with server-side rendering
🔧 Troubleshooting
Q: Why isn't maxAge
working?
- Ensure values are in seconds (not milliseconds)
- Check browser DevTools (Application → Cookies)
Q: How to clear persisted data?
const store = useStore()
store.$reset() // Clears both state and cookie
OR
const authCookie = useCookie('auth) //cookie-key-name
authCookie.expires = new Date(0); // Clear cookie
Q: Why isn't my cookie persisting?
- Verify paths are correctly specified
- Check browser DevTools → Application → Cookies
- Ensure you're not in Incognito mode
📝 Examples
1. Basic Persistence
// stores/counter.ts
export const useCounter = defineStore('counter', {
state: () => ({ count: 0 }),
persist: {
paths: ['count'] // Persist only 'count'
}
})
2. Advanced Store
// stores/auth.ts
export const useAuth = defineStore('auth', {
state: () => ({
token: null,
user: { name: '', email: '' }
}),
persist: {
key: 'session', // Custom cookie name
paths: ['token', 'user.name'], // Partial persistence
cookieOptions: {
maxAge: 7200, // 2 hours
domain: '.yourdomain.com' // Cross-subdomain
}
}
})
📌 Notes
- Requires Nuxt 3 + Pinia
- No extra dependencies (uses Nuxt's built-in
useCookie
)
- TypeScript support out of the box
📜 License
MIT © Zeeshan Siddique
🔗 Links
🎉 Happy persisting!
For support or feature requests, please open an issue on GitHub.