安装
设置
添加到Vue项目
安装Nuxt UI包
pnpm add @nuxt/ui tailwindcss
yarn add @nuxt/ui tailwindcss
npm install @nuxt/ui tailwindcss
bun add @nuxt/ui tailwindcss
在您的vite.config.ts中添加Nuxt UI Vite插件
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui()
]
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
import laravel from 'laravel-vite-plugin'
export default defineConfig({
plugins: [
laravel({
input: ['resources/js/app.ts'],
refresh: true
}),
vue({
template: {
transformAssetUrls: {
base: null,
includeAbsolute: false
}
}
}),
ui({
router: 'inertia'
})
]
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
import adonisjs from '@adonisjs/vite/client'
import inertia from '@adonisjs/inertia/client'
export default defineConfig({
plugins: [
adonisjs({
entrypoints: ['inertia/app/app.ts'],
reload: ['resources/views/**/*.edge']
}),
inertia(),
vue(),
ui({
router: 'inertia'
})
]
})
unplugin-auto-import和unplugin-vue-components,这将生成auto-imports.d.ts和components.d.ts类型声明文件。您可能希望gitignore这些文件,并将其添加到tsconfig中。{
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "auto-imports.d.ts", "components.d.ts"]
}
# Auto-generated type declarations
auto-imports.d.ts
components.d.ts
create-vuebuild脚本并行运行vue-tsc和vite build(run-p type-check "build-only {@}"),因此在干净的检出中,类型检查可能会在文件存在之前启动,并因错误(如Cannot find name 'useToast')而失败。请在构建后运行类型检查,以便首先生成声明。{
"scripts": {
"build": "run-s build-only type-check"
}
}
tsconfig文件中,以在vite.config.ts中启用自动完成。{
"compilerOptions": {
"paths": {
"#build/ui": [
"./node_modules/.nuxt-ui/ui"
]
}
}
}
{
"compilerOptions": {
"paths": {
"#build/ui/*": [
"./node_modules/.nuxt-ui/ui/*"
]
}
}
}
使用Nuxt UI Vue插件
import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router'
import ui from '@nuxt/ui/vue-plugin'
import App from './App.vue'
const app = createApp(App)
const router = createRouter({
routes: [],
history: createWebHistory()
})
app.use(router)
app.use(ui)
app.mount('#app')
import type { DefineComponent } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import ui from '@nuxt/ui/vue-plugin'
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'
import { createApp, h } from 'vue'
const appName = import.meta.env.VITE_APP_NAME || 'Laravel x Nuxt UI'
createInertiaApp({
title: title => (title ? `${title} - ${appName}` : appName),
resolve: name =>
resolvePageComponent(
`./pages/${name}.vue`,
import.meta.glob<DefineComponent>('./pages/**/*.vue')
),
setup({ el, App, props, plugin }) {
createApp({ render: () => h(App, props) })
.use(plugin)
.use(ui)
.mount(el)
}
})
import type { DefineComponent } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import ui from '@nuxt/ui/vue-plugin'
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
import { createApp, h } from 'vue'
const appName = import.meta.env.VITE_APP_NAME || 'AdonisJS x Nuxt UI'
createInertiaApp({
title: title => (title ? `${title} - ${appName}` : appName),
resolve: name =>
resolvePageComponent(
`../pages/${name}.vue`,
import.meta.glob<DefineComponent>('../pages/**/*.vue')
),
setup({ el, App, props, plugin }) {
createApp({ render: () => h(App, props) })
.use(plugin)
.use(ui)
.mount(el)
}
})
在CSS中导入Tailwind CSS和Nuxt UI
@import "tailwindcss";
@import "@nuxt/ui";
@import "tailwindcss";
@import "@nuxt/ui";
@import "tailwindcss";
@import "@nuxt/ui";
import './assets/css/main.css'
import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router'
import ui from '@nuxt/ui/vue-plugin'
import App from './App.vue'
const app = createApp(App)
const router = createRouter({
routes: [],
history: createWebHistory()
})
app.use(router)
app.use(ui)
app.mount('#app')
import '../css/app.css'
import type { DefineComponent } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import ui from '@nuxt/ui/vue-plugin'
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'
import { createApp, h } from 'vue'
const appName = import.meta.env.VITE_APP_NAME || 'Laravel x Nuxt UI'
createInertiaApp({
title: title => (title ? `${title} - ${appName}` : appName),
resolve: name =>
resolvePageComponent(
`./pages/${name}.vue`,
import.meta.glob<DefineComponent>('./pages/**/*.vue')
),
setup({ el, App, props, plugin }) {
createApp({ render: () => h(App, props) })
.use(plugin)
.use(ui)
.mount(el)
}
})
import '../css/app.css'
import type { DefineComponent } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import ui from '@nuxt/ui/vue-plugin'
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
import { createApp, h } from 'vue'
const appName = import.meta.env.VITE_APP_NAME || 'AdonisJS x Nuxt UI'
createInertiaApp({
title: title => (title ? `${title} - ${appName}` : appName),
resolve: name =>
resolvePageComponent(
`../pages/${name}.vue`,
import.meta.glob<DefineComponent>('../pages/**/*.vue')
),
setup({ el, App, props, plugin }) {
createApp({ render: () => h(App, props) })
.use(plugin)
.use(ui)
.mount(el)
}
})
{
"files.associations": {
"*.css": "tailwindcss"
},
"editor.quickSuggestions": {
"strings": "on"
},
"tailwindCSS.classAttributes": ["class", "ui"],
"tailwindCSS.classFunctions": ["defineAppConfig"]
}
使用App组件包装您的应用
<template>
<UApp>
<RouterView />
</UApp>
</template>
<template>
<UApp>
<!-- Your content goes here -->
</UApp>
</template>
<template>
<UApp>
<!-- Your content goes here -->
</UApp>
</template>
将isolate类添加到根容器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Nuxt UI</title>
</head>
<body>
<div id="app" class="isolate"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
@inertiaHead
@vite('resources/js/app.ts')
</head>
<body>
<div class="isolate">
@inertia
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
@inertiaHead()
@vite(['inertia/app/app.ts', `inertia/pages/${page.component}.vue`])
</head>
<body>
@inertia({ class: 'isolate' })
</body>
</html>
使用Vue模板
使用GitHub上的Use this template按钮或CLI开始使用我们的官方模板:
npm create nuxt@latest -- --no-modules -t ui-vue
npm create nuxt@latest -- --no-modules -t ui-vue/dashboard
npm create nuxt@latest -- --no-modules -t ui-vue/chat
选项
您可以通过在vite.config.ts中提供选项来自定义Nuxt UI。
prefix
使用prefix选项更改组件的前缀。
- 默认值:
U
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
prefix: 'Nuxt'
})
]
})
ui
使用ui选项为Nuxt UI提供配置。这是Nuxt的app.config.ts中ui键的Vue等效项。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
colors: {
primary: 'green',
neutral: 'slate'
}
}
})
]
})
dts
使用dts选项可以启用或禁用为自动导入的组件和可组合项生成声明文件。
- 默认值:
true
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
dts: false
})
]
})
icon
使用icon选项可以设置Icon组件(size,mode,customize)的默认属性,并通过clientBundle配置构建时图标绑定。在安装Nuxt UI自己的图标集时,默认情况下会启用图标绑定。将clientBundle: false设置为退出。
- 默认值:
{}
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
icon: {
mode: 'svg',
clientBundle: {
scan: true
}
}
})
]
})
colorMode
使用colorMode选项启用或禁用@vueuse/core的颜色模式集成。
- 默认值:
true
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
colorMode: false
})
]
})
theme.colors
使用theme.colors选项定义用于生成组件主题的动态颜色别名。
- 默认值:
['primary', 'secondary', 'success', 'info', 'warning', 'error']
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
theme: {
colors: ['primary', 'error']
}
})
]
})
--ui-color-*阴影和变体,无论您的应用是否使用它。将列表修剪为您实际使用的别名,如果您使用表单,请保留error,因为验证样式依赖于它。theme.transitions
使用theme.transitions选项启用或禁用组件上的转换。
- 默认值:
true
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
theme: {
transitions: false
}
})
]
})
transition-colors类添加到具有悬停或活动状态的组件上。theme.unstyled:badge{label="4.9+" class="align-text-top"}
使用theme.unstyled选项从组件中删除所有默认主题类,只保留它们的结构和通过class、ui或app.config.ui提供的类。
- 默认值:
false
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
theme: {
unstyled: true
}
})
]
})
Modal,Drawer或Calendar这样的布局重的组件需要你重新提供它们的布局,类似于PrimeVue的无样式模式。theme.defaultVariants
使用theme.defaultVariants选项覆盖组件的默认color和size变体。
只有完全为primary或md的默认值才会被替换,因此Avatar保留color: 'neutral',Separator保留size: 'xs'。
- 默认值:
{ color: 'primary', size: 'md' }
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
theme: {
defaultVariants: {
color: 'neutral',
size: 'sm'
}
}
})
]
})
theme.prefix:badge{label="4.2+" class="align-text-top"}
使用theme.prefix选项来配置您在Tailwind CSS导入中设置的相同前缀。这可以确保Nuxt UI组件使用正确的前缀实用程序类和CSS变量。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
theme: {
prefix: 'tw'
}
})
]
})
@import "tailwindcss" prefix(tw);
@import "@nuxt/ui";
这将自动为Nuxt UI组件主题中的所有Tailwind实用程序类和CSS变量添加前缀:
<!-- Without prefix -->
<button class="px-2 py-1 text-xs hover:bg-primary/75">Button</button>
<!-- With prefix: tw -->
<button class="tw:px-2 tw:py-1 tw:text-xs tw:hover:bg-primary/75">Button</button>
prose
使用prose选项启用Nuxt UI Prose组件及其主题。
- 默认值:
false
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
prose: true
})
]
})
autoImport
使用autoImport选项禁用可组合的自动导入或自定义unplugin-auto-import选项。
- 默认值:
{}
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
autoImport: false
})
]
})
@nuxt/ui/composables显式导入组合。components
使用components选项禁用组件自动导入或自定义unplugin-vue-components选项。
- 默认值:
{}
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
components: false
})
]
})
import Button from '@nuxt/ui/components/Button.vue'或import ProseCode from '@nuxt/ui/components/prose/Code.vue'。router:badge{label="4.3+" class="align-text-top"}
使用router选项配置路由集成。这对于不使用vue-router的应用程序非常有用,例如Electron应用程序、MPA或Inertia.js或Hybridly等框架。
- 默认值:
true
| 值 | 描述 |
|---|---|
true | 使用vue-router和RouterLink组件进行导航。 |
false | 禁用路由集成,链接呈现为普通<a>标记。 |
'inertia' | 使用Inertia.js及其Link组件进行导航。 |
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
router: false
})
]
})
router: false,并在安装Vue插件时传递一个函数,为Hybridly等框架提供自定义导航逻辑:import ui from '@nuxt/ui/vue-plugin'
import { router } from 'hybridly'
app.use(ui, {
router: (event, { href, external }) => {
if (external) {
return
}
event.preventDefault()
router.navigate({ url: href })
}
})
false或'inertia'时,vue-router不需要作为依赖项。scanPackages:badge{label="4.3+" class="align-text-top"}
使用scanPackages选项指定应使用Nuxt UI扫描组件的其他npm包。当您拥有内部使用Nuxt UI组件的共享组件库时,这很有用。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
scanPackages: ['@my-org/ui-components']
})
]
})
@nuxt/ui。当您的外部包包含使用Nuxt UI的Vue组件时,请使用此选项。root:badge{label="4.9+" class="align-text-top"}
使用root选项覆盖Nuxt UI生成其.nuxt-ui目录的目录(包含主题模板)。默认情况下,它使用Vite的root,但在electron-vite等设置中,渲染器的root指向子目录(例如src/renderer),因此模板在src/renderer/node_modules/.nuxt-ui中不会被Tailwind扫描,导致bg-default,ring-default和divide-default等主题类丢失。
import { defineConfig } from 'electron-vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
renderer: {
root: 'src/renderer',
plugins: [
vue(),
ui({
root: __dirname
})
]
}
})
root指向您的项目根目录,这样生成的.nuxt-ui目录最终会出现在Tailwind扫描的node_modules目录中。experimental.componentDetection:badge{label="4.11+" class="align-text-top"}
使用experimental.componentDetection选项启用自动组件检测以进行树抖动。此功能扫描您的源代码以检测实际使用的组件,并仅为这些组件生成必要的CSS(包括它们的依赖项)。如果没有它,Vite插件会为每个组件生成主题CSS。检测覆盖Vite根,在scanPackages中列出的软件包和位于根目录之外的components选项中的任何dirs。
- 默认值:
false - 类型:
boolean | string[]
启用自动检测:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
experimental: {
componentDetection: true
}
})
]
})
包含用于动态使用的附加组件:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
experimental: {
componentDetection: ['Modal', 'DropdownMenu', 'Popover']
}
})
]
})
<component :is="..." />这样不能静态分析的动态组件很有用。连续发布
Nuxt UI使用pkg.pr.new进行持续预览发布,为开发人员提供即时访问最新功能和错误修复,而无需等待官方发布。
自动预览版本是为v4分支的所有提交和PR创建的。使用它们时,请将您的软件包版本替换为特定的提交哈希或PR编号。
{
"dependencies": {
- "@nuxt/ui": "^4.0.0",
+ "@nuxt/ui": "https://pkg.pr.new/@nuxt/ui@4c96909",
}
}