1. 为什么选择Vite+Tailwind组合?
现代前端开发对构建速度和开发体验的要求越来越高。Vite作为新一代前端构建工具,凭借其原生ESM支持和闪电般的冷启动速度,正在快速取代Webpack成为开发者的首选。而Tailwind CSS作为实用优先的CSS框架,通过组合原子类的方式彻底改变了我们编写样式的方法。
这个组合的优势在于:
- 开发体验:Vite的即时热更新(HMR)速度极快,搭配Tailwind的实用类即时生效特性,实现真正的"所见即所得"
- 性能表现:Vite在生产构建时使用Rollup,生成的代码更精简;Tailwind通过PurgeCSS自动移除未使用的样式
- 维护成本:不需要维护复杂的Webpack配置,Tailwind也避免了传统CSS的命名冲突问题
提示:如果你的项目需要兼容IE11等老旧浏览器,需要额外配置PostCSS和autoprefixer,这在后续章节会详细说明
2. 环境准备与项目创建
2.1 系统环境检查
在开始之前,请确保你的开发环境满足以下要求:
- Node.js版本 ≥14.18.0(推荐使用16.x LTS版本)
- npm ≥6.x 或 yarn ≥1.22(推荐使用pnpm,速度更快)
- 代码编辑器(VS Code + Tailwind CSS IntelliSense插件体验最佳)
可以通过以下命令检查当前环境:
node -v npm -v2.2 创建Vite项目
使用Vite官方脚手架快速初始化项目:
npm create vite@latest my-tailwind-app --template vue # 或使用yarn yarn create vite my-tailwind-app --template vue # 或使用pnpm pnpm create vite my-tailwind-app --template vue模板选择建议:
- Vue项目选择
vue或vue-ts - React项目选择
react或react-ts - 纯HTML/CSS/JS项目选择
vanilla
创建完成后进入项目目录并安装基础依赖:
cd my-tailwind-app npm install3. Tailwind CSS安装与配置
3.1 安装Tailwind及其依赖
通过npm安装Tailwind CSS及其必要依赖:
npm install -D tailwindcss postcss autoprefixer然后初始化Tailwind配置文件:
npx tailwindcss init这会在项目根目录生成两个重要文件:
tailwind.config.js- Tailwind的主配置文件postcss.config.js- PostCSS的配置文件(如果不存在会自动创建)
3.2 配置Tailwind
修改tailwind.config.js以包含项目中的所有模板文件路径:
module.exports = { content: [ "./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}", ], theme: { extend: {}, }, plugins: [], }对于Vue项目,特别注意要包含.vue文件;React项目则需要包含.jsx/.tsx文件。
3.3 引入Tailwind样式
在项目的CSS入口文件(通常是src/style.css或src/index.css)中添加Tailwind指令:
@tailwind base; @tailwind components; @tailwind utilities;如果使用Vue单文件组件,确保在main.js或main.ts中导入这个CSS文件:
import './style.css'4. 开发环境优化
4.1 配置VS Code插件
为了获得最佳的开发体验,建议安装以下VS Code插件:
- Tailwind CSS IntelliSense- 提供自动完成、语法高亮和 linting
- PostCSS Language Support- 更好的CSS支持
- Volar(Vue项目) 或ES7+ React/Redux/React-Native snippets(React项目)
在项目根目录创建.vscode/settings.json以启用Tailwind提示:
{ "editor.quickSuggestions": { "strings": true }, "tailwindCSS.includeLanguages": { "vue": "html", "javascript": "javascriptreact" } }4.2 优化HMR体验
Vite默认已经配置了热模块替换,但我们可以针对Tailwind做一些优化。在vite.config.js中添加:
export default defineConfig({ server: { watch: { usePolling: true, // 对Docker/WSL2环境特别有用 } } })5. 生产环境构建优化
5.1 配置PurgeCSS
Tailwind CSS在生产环境下会自动移除未使用的样式,但我们需要确保配置正确。在tailwind.config.js中:
module.exports = { purge: { enabled: process.env.NODE_ENV === 'production', content: [ './src/**/*.html', './src/**/*.vue', './src/**/*.jsx', // 其他模板文件路径 ], options: { safelist: ['bg-red-500', 'px-4'], // 强制保留的类名 } } }5.2 兼容旧版浏览器
如果需要支持旧版浏览器(如IE11),需要修改postcss.config.js:
module.exports = { plugins: { tailwindcss: {}, autoprefixer: { overrideBrowserslist: [ '>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9' ], }, }, }然后在vite.config.js中设置构建目标:
export default defineConfig({ build: { target: ['es2015', 'edge88', 'firefox78', 'chrome87', 'safari12'] } })6. 常见问题与解决方案
6.1 样式不生效
症状:Tailwind类名应用了但没有效果
排查步骤:
- 检查
tailwind.config.js中的content配置是否包含你的模板文件 - 确保CSS文件中正确引入了三个Tailwind指令
- 检查构建过程中是否有PostCSS相关的错误
- 尝试重启开发服务器
6.2 生产环境样式丢失
症状:开发环境正常,但生产构建后缺少样式
解决方案:
- 检查PurgeCSS配置,确保没有过度清除
- 在
safelist中添加必要的类名 - 使用
@layer指令保护自定义样式:
@layer components { .btn-primary { @apply py-2 px-4 bg-blue-500 text-white; } }6.3 与其他CSS库冲突
症状:Tailwind样式被其他CSS库覆盖
解决方案:
- 在
tailwind.config.js中配置important选项:
module.exports = { important: '#app', // 使用ID选择器提高特异性 }- 或使用
@layer和@apply重构冲突的样式
7. 高级配置技巧
7.1 自定义主题
在tailwind.config.js中扩展默认主题:
module.exports = { theme: { extend: { colors: { primary: { DEFAULT: '#3B82F6', light: '#93C5FD', dark: '#1D4ED8' } }, spacing: { 128: '32rem', } } } }7.2 使用插件扩展功能
安装官方插件增强Tailwind功能:
npm install -D @tailwindcss/forms @tailwindcss/typography @tailwindcss/line-clamp然后在配置中启用:
module.exports = { plugins: [ require('@tailwindcss/forms'), require('@tailwindcss/typography'), require('@tailwindcss/line-clamp'), ] }7.3 JIT模式优化
Tailwind v3.0+默认使用JIT(Just-In-Time)模式,但我们可以进一步优化:
module.exports = { mode: 'jit', purge: [ // 模板文件路径 ], // 其他配置... }8. 性能优化实践
8.1 分析构建产物
使用rollup-plugin-visualizer分析包大小:
npm install -D rollup-plugin-visualizer然后在vite.config.js中配置:
import { visualizer } from 'rollup-plugin-visualizer' export default defineConfig({ plugins: [ visualizer() ] })构建后会生成stats.html,可以直观查看各模块大小。
8.2 按需引入第三方库
对于组件库如Element Plus,配置按需导入:
import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' export default defineConfig({ plugins: [ AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ] })8.3 图片优化
使用vite-plugin-image-optimizer自动优化图片:
npm install -D vite-plugin-image-optimizer配置示例:
import { imageOptimizer } from 'vite-plugin-image-optimizer' export default defineConfig({ plugins: [ imageOptimizer({ jpg: { quality: 80, }, png: { quality: 80, }, }) ] })9. 项目结构最佳实践
推荐的项目结构组织方式:
my-tailwind-app/ ├── src/ │ ├── assets/ │ │ ├── styles/ # 全局样式 │ │ └── images/ # 图片资源 │ ├── components/ # 公共组件 │ │ └── Button.vue # 使用Tailwind的组件示例 │ ├── composables/ # Vue组合式API │ ├── layouts/ # 布局组件 │ ├── pages/ # 页面组件 │ ├── stores/ # 状态管理 │ ├── utils/ # 工具函数 │ ├── App.vue # 根组件 │ └── main.js # 应用入口 ├── tailwind.config.js # Tailwind配置 ├── postcss.config.js # PostCSS配置 └── vite.config.js # Vite配置典型组件示例(Button.vue):
<template> <button class="px-4 py-2 rounded-md bg-blue-600 text-white hover:bg-blue-700 transition-colors" @click="$emit('click')" > <slot /> </button> </template>10. 部署注意事项
10.1 静态资源路径问题
如果项目部署在子路径下,需要配置base选项:
export default defineConfig({ base: '/sub-path/' })10.2 404重定向
对于单页应用,大多数服务器需要配置将所有请求重定向到index.html。以Nginx为例:
location / { try_files $uri $uri/ /index.html; }10.3 压缩静态资源
推荐在服务器层面启用gzip/brotli压缩。对于Nginx:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;11. 测试与验证
11.1 视觉回归测试
使用Storybook + Loki进行视觉回归测试:
npx sb init npm install -D loki配置.storybook/main.js:
module.exports = { stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], addons: [ '@storybook/addon-links', '@storybook/addon-essentials', '@storybook/addon-interactions' ], framework: '@storybook/vue3', core: { builder: '@storybook/builder-vite' } }11.2 端到端测试
使用Cypress进行端到端测试:
npm install -D cypress在cypress/support/commands.js中添加自定义命令:
Cypress.Commands.add('checkTailwindClass', (selector, className) => { cy.get(selector).should('have.class', className) })12. 持续集成配置
12.1 GitHub Actions示例
创建.github/workflows/ci.yml:
name: CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: '16' - run: npm ci - run: npm run build - run: npm run test12.2 Docker化部署
创建Dockerfile:
FROM node:16-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]配套的nginx.conf:
server { listen 80; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } }13. 迁移现有项目
13.1 从Webpack迁移
- 备份现有
webpack.config.js - 安装Vite:
npm install -D vite- 创建
vite.config.js,参考Vite文档转换Webpack配置 - 将
index.html移到项目根目录,更新资源路径 - 替换
process.env为import.meta.env - 更新package.json脚本:
{ "scripts": { "dev": "vite", "build": "vite build", "serve": "vite preview" } }13.2 从其他CSS框架迁移
Bootstrap迁移步骤:
- 识别项目中使用的Bootstrap组件
- 使用
@apply指令转换核心样式:
.btn-primary { @apply py-2 px-4 bg-blue-600 text-white rounded hover:bg-blue-700; }- 逐步替换布局类(如
row/col)为Tailwind的flex和grid - 使用
@tailwindcss/forms插件替代表单样式
14. 主题切换实现
14.1 暗黑模式配置
在tailwind.config.js中启用暗黑模式:
module.exports = { darkMode: 'class', // 或 'media' // ... }使用示例:
<html class="dark"> <body class="bg-white dark:bg-gray-900"> <button class="bg-blue-500 dark:bg-blue-800">Toggle</button> </body> </html>14.2 动态主题切换
创建主题切换组件:
<template> <button @click="toggleTheme"> {{ darkMode ? 'Light' : 'Dark' }} Mode </button> </template> <script setup> import { ref, onMounted } from 'vue' const darkMode = ref(false) const toggleTheme = () => { darkMode.value = !darkMode.value document.documentElement.classList.toggle('dark', darkMode.value) localStorage.setItem('darkMode', darkMode.value) } onMounted(() => { darkMode.value = localStorage.getItem('darkMode') === 'true' document.documentElement.classList.toggle('dark', darkMode.value) }) </script>15. 性能监控与分析
15.1 使用Lighthouse
在Chrome DevTools中运行Lighthouse审计,或通过命令行:
npm install -D lighthouse npx lighthouse http://localhost:3000 --view15.2 真实用户监控
集成Sentry监控前端错误:
npm install @sentry/vue @sentry/tracing配置示例:
import * as Sentry from "@sentry/vue" import { Integrations } from "@sentry/tracing" const app = createApp(App) Sentry.init({ app, dsn: "your-dsn-here", integrations: [ new Integrations.BrowserTracing({ routingInstrumentation: Sentry.vueRouterInstrumentation(router), tracingOrigins: ["localhost", "your-domain.com"], }), ], tracesSampleRate: 1.0, })16. 移动端适配策略
16.1 响应式设计
Tailwind默认提供5个断点:
sm: 640pxmd: 768pxlg: 1024pxxl: 1280px2xl: 1536px
使用示例:
<div class="text-sm md:text-base lg:text-lg"> 响应式文字大小 </div>16.2 触摸反馈优化
为移动设备添加触摸反馈:
<button class="active:scale-95 transform transition-transform"> 点击我 </button>16.3 防止布局偏移
为图片和媒体元素预留空间:
<img src="image.jpg" class="w-full aspect-video bg-gray-100" loading="lazy" >17. 无障碍访问优化
17.1 语义化HTML
确保使用正确的HTML标签:
<button class="..." aria-label="关闭"> × </button>17.2 焦点样式
自定义焦点样式确保可见:
@layer components { .focusable { @apply focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2; } }17.3 颜色对比度
使用Tailwind提供的对比色工具类:
<p class="text-gray-900 bg-gray-100">良好对比度</p>18. 微交互增强
18.1 动画效果
使用Tailwind的动画工具类:
<button class="hover:animate-pulse">悬停脉冲效果</button>18.2 过渡效果
平滑的状态过渡:
<div class="transition-all duration-300 hover:scale-105"> 悬停放大 </div>18.3 骨架屏
加载状态占位:
<div class="animate-pulse flex space-x-4"> <div class="rounded-full bg-gray-200 h-10 w-10"></div> <div class="flex-1 space-y-2"> <div class="h-4 bg-gray-200 rounded"></div> <div class="h-4 bg-gray-200 rounded w-5/6"></div> </div> </div>19. 状态管理集成
19.1 Pinia集成
安装Pinia:
npm install pinia配置示例:
import { createPinia } from 'pinia' const app = createApp(App) app.use(createPinia())定义store:
import { defineStore } from 'pinia' export const useUIStore = defineStore('ui', { state: () => ({ darkMode: false, }), actions: { toggleDarkMode() { this.darkMode = !this.darkMode document.documentElement.classList.toggle('dark', this.darkMode) } } })19.2 使用Store管理UI状态
组件中使用:
<script setup> import { useUIStore } from '@/stores/ui' const ui = useUIStore() </script> <template> <button @click="ui.toggleDarkMode"> {{ ui.darkMode ? 'Light' : 'Dark' }} Mode </button> </template>20. 国际化支持
20.1 安装vue-i18n
npm install vue-i18n20.2 配置多语言
创建语言文件:
// locales/en.js export default { buttons: { submit: 'Submit', cancel: 'Cancel' } } // locales/zh.js export default { buttons: { submit: '提交', cancel: '取消' } }初始化i18n:
import { createI18n } from 'vue-i18n' import en from './locales/en' import zh from './locales/zh' const i18n = createI18n({ locale: 'en', messages: { en, zh } }) app.use(i18n)20.3 在组件中使用
<template> <button class="..."> {{ $t('buttons.submit') }} </button> </template>21. 测试覆盖率保障
21.1 单元测试配置
使用Vitest进行单元测试:
npm install -D vitest @vue/test-utils jsdom配置vite.config.js:
/// <reference types="vitest" /> export default defineConfig({ test: { environment: 'jsdom', globals: true, } })21.2 组件测试示例
测试Tailwind组件:
import { mount } from '@vue/test-utils' import Button from './Button.vue' test('renders with Tailwind classes', () => { const wrapper = mount(Button, { slots: { default: 'Click me' } }) expect(wrapper.classes()).toContain('bg-blue-600') expect(wrapper.text()).toBe('Click me') })22. 文档与团队协作
22.1 样式文档生成
使用Storybook记录组件:
npx sb init配置Tailwind支持:
// .storybook/preview.js import '../src/style.css' export const parameters = { actions: { argTypesRegex: "^on[A-Z].*" }, controls: { matchers: { color: /(background|color)$/i, date: /Date$/, }, }, }22.2 设计系统集成
使用Figma Tokens插件同步设计变量:
- 安装Figma Tokens插件
- 导出设计变量为JSON
- 在
tailwind.config.js中导入:
const colors = require('./design-tokens/colors.json') module.exports = { theme: { colors: { ...colors, // 扩展其他颜色 } } }23. 升级与维护
23.1 依赖更新策略
使用npm-check-updates检查更新:
npm install -g npm-check-updates ncu -u npm install23.2 版本锁定建议
推荐在package.json中使用精确版本:
{ "devDependencies": { "tailwindcss": "3.1.8", "vite": "3.0.7" } }23.3 破坏性变更处理
创建升级检查清单:
- 查看框架更新日志
- 在开发分支测试升级
- 使用codemod工具自动迁移(如tailwindcss-upgrader)
- 更新项目文档
24. 社区资源推荐
24.1 学习资源
- 官方文档:
- Vite文档
- Tailwind CSS文档
- 视频教程:
- Vite + Tailwind速成课程
- 高级主题定制教程
24.2 实用工具
- Tailwind Play - 在线Tailwind编辑器
- Vite Visualizer - 分析构建产物
- Headless UI - 无样式UI组件库
24.3 UI库推荐
- DaisyUI - Tailwind组件库
- Flowbite - 基于Tailwind的UI套件
- Tailwind Elements - Bootstrap风格的组件
25. 项目模板推荐
25.1 官方模板
Vite官方提供了多个预设模板:
npm create vite@latest my-project --template vue-ts可用模板包括:
vanilla,vanilla-tsvue,vue-tsreact,react-tspreact,preact-tslit,lit-tssvelte,svelte-ts
25.2 社区模板
一些优秀的社区模板:
vitesse- Vue3全栈模板vite-react-tailwind-starter- React + Tailwind起手式vite-electron-builder- 桌面应用模板
安装示例:
npx degit user/repo my-project cd my-project npm install26. 调试技巧
26.1 开发工具配置
Chrome开发者工具技巧:
- 使用"Toggle Element State"测试hover/focus状态
- 在Styles面板过滤Tailwind类名
- 使用"Force Element State"测试暗黑模式
26.2 源码映射
确保Vite生成正确的sourcemap:
export default defineConfig({ build: { sourcemap: true, } })26.3 性能分析
使用Chrome Performance面板:
- 录制页面加载过程
- 分析JavaScript执行时间
- 识别重绘和回流问题
27. 安全最佳实践
27.1 依赖安全
定期检查漏洞:
npm audit使用snyk进行深度扫描:
npx snyk test27.2 内容安全策略
配置CSP头:
export default defineConfig({ server: { headers: { "Content-Security-Policy": "default-src 'self'" } } })27.3 环境变量保护
永远不要在前端暴露敏感信息:
// 错误示例 const apiKey = import.meta.env.VITE_API_KEY // 正确做法 - 通过后端接口中转28. 渐进式Web应用支持
28.1 安装PWA插件
npm install -D vite-plugin-pwa28.2 配置示例
import { VitePWA } from 'vite-plugin-pwa' export default defineConfig({ plugins: [ VitePWA({ registerType: 'autoUpdate', manifest: { name: 'My App', short_name: 'App', theme_color: '#ffffff', icons: [ { src: '/pwa-192x192.png', sizes: '192x192', type: 'image/png' } ] } }) ] })28.3 离线缓存策略
自定义workbox配置:
VitePWA({ workbox: { runtimeCaching: [ { urlPattern: /^https:\/\/api\.example\.com\/.*/i, handler: 'NetworkFirst', options: { cacheName: 'api-cache', expiration: { maxEntries: 10, maxAgeSeconds: 60 * 60 * 24 } } } ] } })29. 服务端渲染配置
29.1 Vite SSR基础
创建简单的SSR配置:
// server.js import { createServer } from 'vite' const server = await createServer({ server: { middlewareMode: 'ssr' } }) app.use('*', async (req, res) => { const url = req.originalUrl const template = await server.transformIndexHtml(url) const { render } = await server.ssrLoadModule('/src/entry-server.js') const appHtml = await render(url) res.status(200).set({ 'Content-Type': 'text/html' }).end(template.replace('<!--app-html-->', appHtml)) })29.2 Tailwind SSR注意事项
确保Tailwind在SSR中正常工作:
- 禁用JIT模式或确保所有类名都在初始渲染中出现
- 使用
@tailwindcss/jit插件处理动态类名 - 在构建时预渲染关键CSS
30. 微前端集成
30.1 作为微应用集成
配置Vite构建:
export default defineConfig({ build: { lib: { entry: 'src/main.js', name: 'myApp', formats: ['umd'] } } })30.2 使用模块联邦
安装@originjs/vite-plugin-federation:
npm install @originjs/vite-plugin-federation -D配置示例:
import { createVuePlugin } from 'vite-plugin-vue2' import { viteStaticCopy } from 'vite-plugin-static-copy' import { federation } from '@originjs/vite-plugin-federation' export default { plugins: [ federation({ name: 'host-app', remotes: { remote_app: 'http://localhost:5001/assets/remoteEntry.js' }, shared: ['vue'] }) ] }31. 性能基准测试
31.1 构建速度测试
比较不同工具的构建时间:
# Vite time npm run build # Webpack time webpack --mode production31.2 运行时性能
使用WebPageTest进行测试:
- 设置3G网络节流
- 测试首次内容绘制(FCP)
- 比较CSS和JS文件大小
31.3 内存分析
使用Chrome DevTools Memory面板:
- 拍摄堆快照
- 比较组件挂载前后的内存变化
- 识别内存泄漏
32. 自定义插件开发
32.1 创建Vite插件
简单插件示例:
export default function myPlugin() { return { name: 'transform-file', transform(code, id) { if (id.endsWith('.custom')) { return `export default ${JSON.stringify(code)}` } } } }32.2 Tailwind插件开发
扩展Tailwind功能:
// tailwind.config.js const plugin = require('tailwindcss/plugin') module.exports = { plugins: [ plugin(function({ addUtilities }) { addUtilities({ '.rotate-y-180': { transform: 'rotateY(180deg)', }, }) }) ] }33. 设计工作流优化
33.1 Figma集成
使用Tailwind CSS Figma插件:
- 安装Figma插件
- 同步颜色和间距变量
- 生成设计令牌
33.2 设计到代码
工具推荐:
- Anima- Figma转Vue组件
- Storybook- 设计系统文档
- Zeroheight- 设计系统协作
34. 多项目管理
34.1 Monorepo配置
使用pnpm workspace:
packages/ app/ vite.config.js ui/ tailwind.config.js pnpm-workspace.yaml34.2 共享配置
提取公共Tailwind配置:
// packages/config/tailwind-preset.js module.exports = { theme: { // 共享主题配置 } } // 子项目中使用 module.exports = { presets: [require('../config/tailwind-preset')] }35. 高级优化技巧
35.1 关键CSS提取
使用critters插件:
npm install -D vite-plugin-critters配置示例:
import critters from 'vite-plugin-critters' export default defineConfig({ plugins: [ critters({ preload: 'swap', inlineThreshold: 0 }) ] })35.2 字体优化
使用fontsource自托管字体:
npm install @fontsource/inter在CSS中引入:
@import '@fontsource/inter/variable.css';配置Tailwind:
module.exports = { theme: { fontFamily: { sans: ['Inter var', 'sans-serif'], }, } }36. 错误处理与监控
36.1 全局错误处理
Vue3错误处理器:
app.config.errorHandler = (err, instance, info) => { console.error('Vue error:', err) // 发送到错误监控服务 }36.2 组件错误边界
创建ErrorBoundary组件:
<template> <slot v-if="!hasError" /> <div v-else class="bg-red-50 p-4"> 组件渲染错误 </div> </template> <script setup> import { ref, onErrorCaptured } from 'vue' const hasError = ref(false) onErrorCaptured((err) => { hasError.value = true return false // 阻止错误继续向上传播 }) </script>37. 代码分割策略
37.1 路由级分割
Vue Router配置:
const routes = [ { path: '/about', component: () => import('./views/About.vue') } ]37.2 组件级分割
使用defineAsyncComponent:
<script setup> import { defineAsyncComponent } from 'vue' const AsyncComponent = defineAsyncComponent(() => import('./components/HeavyComponent.vue') ) </script> <template> <AsyncComponent /> </template>37.3 库分割
手动分割大依赖:
export default defineConfig({ build: { rollupOptions: { output: { manualChunks: { lodash: ['lodash'], chartjs: ['chart.js'], } } } } })38. 类型安全增强
38.1 TypeScript配置
推荐tsconfig.json:
{ "compilerOptions": { "target": "ESNext", "module": "ESNext", "strict": true, "jsx": "preserve", "moduleResolution": "node", "esModuleInterop": true, "skipLibCheck": true, "forceCons