这几年前端工具链的迭代速度简直让人眼花缭乱,但Vue3+vite+Tailwind CSS这个组合确实让我在多个项目中尝到了甜头。先说Vue3,它的Composition API让组件逻辑组织更灵活;vite的秒级热更新让开发体验飞起;而Tailwind CSS则彻底改变了我的CSS编写方式。
记得第一次用Tailwind时,看着满屏的类名确实有点懵。但坚持用了一周后,我发现它带来的效率提升是惊人的。不用再在CSS文件和HTML之间来回切换,不用绞尽脑汁给class命名,更不用维护一堆逐渐失控的样式文件。特别是在配合Vue3的单文件组件时,所有样式都内联在模板里,组件自包含性特别好。
vite作为新一代构建工具,对Tailwind的支持也很到位。实测下来,在vite项目中配置Tailwind比传统webpack要简单不少,热更新速度更是快得飞起。有一次我需要调整一个复杂页面的布局,传统CSS方案可能要反复修改多个文件,而用Tailwind直接在模板里调整类名,保存后几乎瞬间就能看到效果。
先确保你已经有node环境(建议16.x以上版本),然后创建一个vite项目:
bash复制npm create vite@latest my-vue-app --template vue
cd my-vue-app
安装Tailwind CSS及其依赖:
bash复制npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
这里有个小技巧:我习惯加上-D参数把这些包作为开发依赖安装,因为生产环境只需要编译后的CSS。
运行初始化命令生成配置文件:
bash复制npx tailwindcss init -p
这个命令会同时生成tailwind.config.js和postcss.config.js。打开tailwind.config.js,修改content配置:
javascript复制module.exports = {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}
注意content配置非常重要,它决定了Tailwind会扫描哪些文件来生成样式。如果漏掉了某些文件类型,可能会导致某些类名没有生成对应的CSS。
在src目录下新建index.css文件:
css复制@tailwind base;
@tailwind components;
@tailwind utilities;
然后在main.js中引入这个CSS文件:
javascript复制import './index.css'
有时候可能会遇到"vite不是内部命令"这样的错误,我遇到过几次,通常的解决步骤是:
npm installnpm run dev如果还是有问题,可以尝试全局安装vite:
bash复制npm install -g vite
强烈建议安装VS Code的Tailwind CSS IntelliSense插件。它会自动补全类名,还能显示对应的CSS规则。安装后如果发现不生效,可能需要检查VS Code的设置:
json复制"tailwindCSS.includeLanguages": {
"vue": "html"
}
Tailwind默认会生成大量CSS,这可能会影响开发时的构建速度。可以在tailwind.config.js中配置只生成开发时需要的样式:
javascript复制module.exports = {
purge: {
enabled: process.env.NODE_ENV === 'production',
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}']
},
// 其他配置...
}
这样在开发环境下Tailwind会保留所有样式,而在生产环境才会进行tree-shaking。
Tailwind使用PurgeCSS来移除未使用的样式。确保生产构建时正确配置:
javascript复制module.exports = {
purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
// 其他配置...
}
我曾经遇到过PurgeCSS把一些动态生成的类名也删除了的情况。解决方法是在配置中使用safelist选项:
javascript复制module.exports = {
purge: {
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
safelist: [
'bg-red-500',
'text-xl',
// 其他需要保留的类名
]
}
}
安装cssnano来进一步压缩CSS:
bash复制npm install -D cssnano
然后在postcss.config.js中添加:
javascript复制module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {})
}
}
对于首屏渲染性能要求高的项目,可以考虑使用critters这样的工具来提取关键CSS:
bash复制npm install -D critters
在vite.config.js中配置:
javascript复制import critters from 'critters'
export default {
plugins: [
// 其他插件...
critters({
preload: 'swap',
pruneSource: true,
})
]
}
Tailwind的主题系统非常灵活。比如要添加品牌色:
javascript复制module.exports = {
theme: {
extend: {
colors: {
brand: {
light: '#3fbaeb',
DEFAULT: '#0fa9e6',
dark: '#0c87b8',
}
}
}
}
}
然后就可以使用bg-brand、text-brand-light这样的类名了。
Tailwind的响应式设计非常直观。比如要实现一个在手机上垂直排列,在平板上水平排列的布局:
html复制<div class="flex flex-col md:flex-row">
<div class="w-full md:w-1/2">左侧内容</div>
<div class="w-full md:w-1/2">右侧内容</div>
</div>
Tailwind默认提供了5个断点:
| 断点 | 最小宽度 | 典型设备 |
|---|---|---|
| sm | 640px | 手机横屏 |
| md | 768px | 平板 |
| lg | 1024px | 笔记本 |
| xl | 1280px | 台式机 |
| 2xl | 1536px | 大屏显示器 |
Tailwind有很多官方和第三方插件。比如要添加表单样式:
bash复制npm install -D @tailwindcss/forms
然后在配置中启用:
javascript复制module.exports = {
plugins: [
require('@tailwindcss/forms'),
]
}
用Tailwind实现一个带悬停效果的按钮:
html复制<button class="px-4 py-2 bg-blue-500 text-white rounded-lg
hover:bg-blue-600 focus:outline-none focus:ring-2
focus:ring-blue-400 focus:ring-opacity-50 transition-colors">
点击我
</button>
这个按钮包含了内边距、背景色、文字色、圆角、悬停效果、焦点状态和颜色过渡动画。
实现一个带阴影和悬停效果的卡片:
html复制<div class="max-w-sm rounded overflow-hidden shadow-lg
hover:shadow-xl transition-shadow">
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2">卡片标题</div>
<p class="text-gray-700 text-base">
这里是卡片内容...
</p>
</div>
</div>
实现一个响应式导航菜单:
html复制<nav class="bg-gray-800">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<!-- 移动端菜单按钮 -->
<div class="md:hidden">
<button class="text-gray-300 hover:text-white">
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round"
stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
</button>
</div>
<!-- 桌面端菜单项 -->
<div class="hidden md:block">
<div class="ml-10 flex items-baseline space-x-4">
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium
text-white bg-gray-900">首页</a>
<a href="#" class="px-3 py-2 rounded-md text-sm font-medium
text-gray-300 hover:text-white">关于</a>
</div>
</div>
</div>
</div>
</nav>
安装@fullhuman/postcss-purgecss来分析最终生成的CSS:
bash复制npm install -D @fullhuman/postcss-purgecss
然后运行:
bash复制npx tailwindcss --input ./src/index.css --output ./dist/tailwind.css --minify --analyze
这会生成一个可视化报告,显示哪些样式被保留,哪些被移除。
Tailwind 2.1+引入了JIT(Just-In-Time)模式,可以显著减少开发时的CSS体积。启用方法:
javascript复制module.exports = {
mode: 'jit',
purge: [
'./index.html',
'./src/**/*.{vue,js,ts,jsx,tsx}'
],
// 其他配置...
}
JIT模式会按需生成样式,而不是一次性生成所有可能的组合。实测下来,开发时的CSS体积可以减少90%以上。
如果项目中有大量动态类名,可以配置safelistPatterns:
javascript复制module.exports = {
purge: {
content: ['./src/**/*.{vue,js,ts,jsx,tsx}'],
safelistPatterns: [/^bg-/, /^text-/],
}
}
这样所有以bg-或text-开头的类名都会被保留,即使没有在代码中显式使用。