Skip to content
Back to skills

Naive Ui Ssr

ASecurity

Server-Side Rendering configuration and best practices for Naive UI. Invoke when user needs to implement SSR with Naive UI in Nuxt.js, Vitepress, Vite SSG/SSE, or Webpack environments.

  • 8 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 11, 2026
documentationbashvuegitapiperformancedocumentation

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 11, 2026

npx -y skills add jiaiyan/naive-ui-skills --skill naive-ui-ssr --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Naive Ui Ssr?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Naive Ui Ssr
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jiaiyan-naive-ui-ssr/badge)](https://www.skillsdirectory.com/skills/jiaiyan-naive-ui-ssr)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: "naive-ui-ssr"
description: "Server-Side Rendering configuration and best practices for Naive UI. Invoke when user needs to implement SSR with Naive UI in Nuxt.js, Vitepress, Vite SSG/SSE, or Webpack environments."
metadata:
  author: jiaiyan
  version: "1.0.0"
---

# Naive UI Server-Side Rendering (SSR)

Naive UI uses CSS-in-JS, which requires additional configuration when using Server-Side Rendering (SSR). This skill provides guidance for setting up SSR across different frameworks and build tools.

## When to Use

Use this skill when:
- **Nuxt.js integration**: Setting up Naive UI in a Nuxt.js application
- **Vitepress integration**: Using Naive UI components in Vitepress documentation
- **Vite SSG/SSE**: Implementing static site generation or server-side rendering with Vite
- **Webpack SSR**: Configuring SSR with Webpack-based setups
- **SSR optimization**: Reducing SSR-rendered HTML size
- **Troubleshooting SSR issues**: Resolving common SSR-related problems

## When to Invoke

Invoke this skill when:
- User asks about SSR setup with Naive UI
- User encounters SSR build failures or hydration issues
- User wants to optimize SSR performance
- User needs to configure Naive UI for Nuxt.js, Vitepress, or Vite SSR
- User sees CSS-related errors during SSR builds

## Prerequisites

### Critical Requirements

Before implementing SSR with Naive UI, ensure the following conditions are met:

1. **css-render version**: All direct and indirect references to `@css-render/*` and `css-render` packages must be version `>=0.15.14`

2. **Single package resolution**: Each `@css-render/*` and `css-render` package should resolve to a single target (no duplicate versions or copies)

### Verifying Requirements

Check your lock file for duplicate `css-render` packages:

```bash
# For npm
npm ls css-render

# For pnpm
pnpm ls css-render

# For yarn
yarn why css-render
```

### Resolving Duplicate Packages

If you find duplicate packages, use the `resolution` field in `package.json`:

```json
{
  "resolutions": {
    "css-render": "^0.15.14",
    "@css-render/vue3-ssr": "^0.15.14"
  }
}
```

For pnpm, use `pnpm.overrides`:

```json
{
  "pnpm": {
    "overrides": {
      "css-render": "^0.15.14",
      "@css-render/vue3-ssr": "^0.15.14"
    }
  }
}
```

## Basic Usage

### Nuxt.js Integration

For Nuxt.js applications, refer to the dedicated Nuxt.js documentation:

```bash
# See Nuxt.js specific guide
# Path: docs/nuxtjs.md
```

### Vitepress Integration

For Vitepress documentation sites:

```bash
# See Vitepress specific guide
# Path: docs/vitepress.md
```

### Vite SSG/SSE

For Vite-based static site generation:

```bash
# See Vite SSG/SSE specific guide
# Path: docs/vite-ssge.md
```

### Webpack SSR Example

Reference implementation available at:
- GitHub: [naive-ui-vite-ssr](https://github.com/07akioni/naive-ui-vite-ssr)
- Playground: [naive-ui/playground/ssr](https://github.com/tusen-ai/naive-ui/tree/main/playground/ssr)

## API Reference

### Inline Theme Optimization

| Prop | Type | Default | Description |
|------|------|---------|-------------|
| inline-theme-disabled | `boolean` | `false` | Disable inline theme styles on components to reduce SSR HTML size |

### Usage with n-config-provider

```vue
<template>
  <n-config-provider inline-theme-disabled>
    <n-button>Optimized for SSR</n-button>
  </n-config-provider>
</template>
```

## Common Patterns

### SSR-Optimized Configuration

```vue
<template>
  <n-config-provider
    inline-theme-disabled
    :theme="theme"
  >
    <n-global-style />
    <router-view />
  </n-config-provider>
</template>

<script setup>
import { ref } from 'vue'
import { darkTheme } from 'naive-ui'

const theme = ref(null)
</script>
```

### Nuxt.js Plugin Setup

```ts
// plugins/naive-ui.ts
import { setup } from '@css-render/vue3-ssr'
import { defineNuxtPlugin } from '#app'

export default defineNuxtPlugin((nuxtApp) => {
  if (process.server) {
    const { collect } = setup(nuxtApp.vueApp)
    const originalRenderMeta = nuxtApp.ssrContext?.renderMeta
    
    nuxtApp.ssrContext = nuxtApp.ssrContext || {}
    nuxtApp.ssrContext.renderMeta = () => {
      if (!originalRenderMeta) {
        return {
          headTags: collect()
        }
      }
      const originalMeta = originalRenderMeta()
      if (originalMeta && typeof originalMeta === 'object') {
        return {
          ...originalMeta,
          headTags: `${originalMeta.headTags || ''}${collect()}`
        }
      }
      return originalMeta
    }
  }
})
```

### Vite SSR Entry Setup

```ts
// server-entry.ts
import { createSSRApp } from 'vue'
import { setup } from '@css-render/vue3-ssr'
import App from './App.vue'

export function createApp() {
  const app = createSSRApp(App)
  
  if (import.meta.env.SSR) {
    setup(app)
  }
  
  return { app }
}
```

### Collecting CSS in Vite SSR

```ts
// server.ts
import { renderToString } from 'vue/server-renderer'
import { createApp } from './server-entry'

async function render(url: string) {
  const { app } = createApp()
  
  const ctx: { modules?: string[] } = {}
  const html = await renderToString(app, ctx)
  
  // CSS will be collected automatically by css-render
  return html
}
```

## Known Issues

The following components have known issues in SSR environments. Avoid using them if possible:

| Component | Issue | Status |
|-----------|-------|--------|
| `n-scrollbar` | SSR rendering issues | Fixed in Vue >= 3.2.36 |
| `n-data-table` | SSR rendering issues | Fixed in Vue >= 3.2.36 |
| `n-anchor` | SSR rendering issues | Pending fix |
| `n-avatar-group` | SSR rendering issues | Pending fix |
| `n-watermark` | SSR rendering issues | Pending fix |
| `n-affix` | SSR rendering issues | Pending fix |
| `n-transfer` | SSR rendering issues | Pending fix |

### Workaround for Known Issues

```vue
<template>
  <ClientOnly>
    <n-scrollbar>
      <n-data-table :data="data" />
    </n-scrollbar>
  </ClientOnly>
</template>

<script setup>
import { ClientOnly } from '#components'

const data = ref([])
</script>
```

## Best Practices

1. **Verify css-render versions**: Always check that all css-render packages are >= 0.15.14 and deduplicated
   ```bash
   npm ls css-render
   ```

2. **Use inline-theme-disabled**: Enable this option to reduce SSR HTML size
   ```vue
   <n-config-provider inline-theme-disabled>
     <App />
   </n-config-provider>
   ```

3. **Wrap problematic components**: Use `ClientOnly` wrapper for components with known SSR issues
   ```vue
   <ClientOnly>
     <n-watermark content="Draft" />
   </ClientOnly>
   ```

4. **Check Vue version**: Ensure Vue >= 3.2.36 for `n-scrollbar` and `n-data-table` SSR support

5. **Test hydration**: Verify that client-side hydration works correctly
   ```js
   // Check for hydration mismatches in console
   ```

6. **Use resolutions field**: Prevent duplicate css-render packages
   ```json
   {
     "resolutions": {
       "css-render": "^0.15.14"
     }
   }
   ```

7. **Follow framework-specific guides**: Use the appropriate guide for your framework
   - Nuxt.js: See nuxtjs documentation
   - Vitepress: See vitepress documentation
   - Vite SSG/SSE: See vite-ssge documentation

8. **Reference examples**: Check official examples for implementation patterns
   - Vite SSR: [naive-ui-vite-ssr](https://github.com/07akioni/naive-ui-vite-ssr)
   - Webpack SSR: [playground/ssr](https://github.com/tusen-ai/naive-ui/tree/main/playground/ssr)

## Troubleshooting

### Common Error: CSS Not Applied

**Problem**: Styles are missing after SSR hydration

**Solution**: Ensure css-render is properly configured for SSR
```ts
import { setup } from '@css-render/vue3-ssr'

if (import.meta.env.SSR) {
  setup(app)
}
```

### Common Error: Hydration Mismatch

**Problem**: Vue hydration mismatch warnings in console

**Solution**: 
1. Check for browser-only APIs in setup code
2. Wrap problematic components in `ClientOnly`
3. Ensure data is consistent between server and client

### Common Error: Duplicate css-render Packages

**Problem**: Build fails or styles break due to multiple css-render versions

**Solution**: Add resolutions to package.json
```json
{
  "resolutions": {
    "css-render": "^0.15.14",
    "@css-render/vue3-ssr": "^0.15.14"
  }
}
```

## Related Skills

- [n-config-provider](../components/n-config-provider/SKILL.md): Global configuration for SSR optimization
- [naive-ui-theming](../naive-ui-theming/SKILL.md): Theme customization in SSR
- [naive-ui-dark-mode](../naive-ui-dark-mode/SKILL.md): Dark mode with SSR considerations

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.