Tailwind CSS 安装(NPM)
Tailwind CSS v3 安装 (NPM) 学习笔记
一、安装步骤
1. 初始化项目
mkdirmy-project&&cdmy-projectnpminit-y2. 安装 Tailwind CSS
npminstall-Dtailwindcss3. 生成配置文件
npx tailwindcss init生成tailwind.config.js:
/** @type {import('tailwindcss').Config} */module.exports={content:[],// ← 需要配置模板路径theme:{extend:{},},plugins:[],}4. 配置内容路径
/** @type {import('tailwindcss').Config} */module.exports={content:['./src/**/*.{html,js,jsx,ts,tsx,vue}',// './public/**/*.html', // 如果 HTML 在 public 目录],theme:{extend:{},},plugins:[],}
content是必须配置的,Tailwind 据此扫描文件,只生成用到的工具类(Tree-shaking)。
5. 创建 CSS 入口文件
/* src/input.css */@tailwindbase;/* Preflight 重置样式 */@tailwindcomponents;/* 组件层 */@tailwindutilities;/* 工具类层 */6. 创建 HTML 文件
<!-- src/index.html --><!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Tailwind CSS v3</title><linkrel="stylesheet"href="../dist/output.css"></head><bodyclass="bg-gray-50 text-gray-900 min-h-screen"><divclass="max-w-4xl mx-auto py-12 px-4"><h1class="text-4xl font-bold text-blue-600 mb-4">Hello Tailwind!</h1><pclass="text-lg text-gray-600">使用 NPM 方式安装的 Tailwind CSS v3。</p></div></body></html>7. 构建并监听
# 开发模式(监听文件变化,自动重新构建)npx tailwindcss-isrc/input.css-odist/output.css--watch# 生产构建(压缩输出)npx tailwindcss-isrc/input.css-odist/output.css--minify8. 配置 npm scripts
{"scripts":{"dev":"tailwindcss -i src/input.css -o dist/output.css --watch","build":"tailwindcss -i src/input.css -o dist/output.css --minify"}}npmrun dev# 开发npmrun build# 生产构建二、项目结构
my-project/ ├── package.json ├── tailwind.config.js ← Tailwind 配置 ├── src/ │ ├── input.css ← CSS 入口 │ └── index.html ← 页面模板 └── dist/ └── output.css ← 构建产物(自动生成)三、tailwind.config.js 完整配置
1. content — 模板路径
content:[// 相对路径,支持 glob 模式'./src/**/*.{html,js,jsx,ts,tsx,vue}','./public/**/*.html',// 第三方组件库路径(确保其类名不被 Tree-shaking)'./node_modules/my-ui-lib/**/*.js',],2. theme — 主题定制
theme:{// 完全替换默认值(不推荐)colors:{...},// 在默认值基础上扩展(推荐)extend:{colors:{brand:{50:'#eff6ff',100:'#dbeafe',200:'#bfdbfe',300:'#93c5fd',400:'#60a5fa',500:'#3b82f6',600:'#2563eb',700:'#1d4ed8',800:'#1e40af',900:'#1e3a8a',},},fontFamily:{sans:['"Microsoft YaHei"','system-ui','sans-serif'],mono:['"Fira Code"','monospace'],},spacing:{'128':'32rem','144':'36rem',},borderRadius:{'4xl':'2rem',},screens:{'xs':'475px','3xl':'1920px',},animation:{'fade-in':'fadeIn 0.5s ease-out','slide-up':'slideUp 0.3s ease-out',},keyframes:{fadeIn:{'0%':{opacity:'0',transform:'translateY(10px)'},'100%':{opacity:'1',transform:'translateY(0)'},},slideUp:{'0%':{opacity:'0',transform:'translateY(20px)'},'100%':{opacity:'1',transform:'translateY(0)'},},},boxShadow:{'soft':'0 2px 15px -3px rgba(0, 0, 0, 0.07), 0 10px 20px -2px rgba(0, 0, 0, 0.04)',},},},3. plugins — 插件
plugins:[require('@tailwindcss/forms'),// 表单样式重置require('@tailwindcss/typography'),// 排版插件 (prose)require('@tailwindcss/aspect-ratio'),// 宽高比require('@tailwindcss/line-clamp'),// 文本截断 (v3.3+ 已内置)],安装插件:
npminstall-D@tailwindcss/forms @tailwindcss/typography @tailwindcss/aspect-ratio4. darkMode — 暗色模式
darkMode:'class',// 通过 .dark 类手动切换// darkMode: 'media', // 跟随系统偏好(默认)5. 完整配置示例
/** @type {import('tailwindcss').Config} */module.exports={content:['./src/**/*.{html,js,jsx,ts,tsx,vue}','./public/**/*.html',],darkMode:'class',theme:{extend:{colors:{brand:{50:'#eff6ff',500:'#3b82f6',600:'#2563eb',700:'#1d4ed8',900:'#1e3a8a',},},fontFamily:{sans:['"Microsoft YaHei"','system-ui','sans-serif'],},animation:{'fade-in':'fadeIn 0.5s ease-out',},keyframes:{fadeIn:{'0%':{opacity:'0'},'100%':{opacity:'1'},},},},},plugins:[require('@tailwindcss/forms'),require('@tailwindcss/typography'),],}四、CSS 层与自定义样式
1. 三个层的作用
/* src/input.css *//* base 层:Preflight 重置 + 全局样式 */@tailwindbase;/* components 层:可复用组件类 */@tailwindcomponents;/* utilities 层:工具类(优先级最高) */@tailwindutilities;优先级:utilities>components>base
2. 添加自定义样式
/* src/input.css */@tailwindbase;@tailwindcomponents;@tailwindutilities;/* ===== base 层:全局重置 ===== */@layerbase{body{@applybg-gray-50 text-gray-900;}h1, h2, h3{@applyfont-bold tracking-tight;}a{@applytext-blue-600hover:text-blue-800 transition;}}/* ===== components 层:组件类 ===== */@layercomponents{.btn{@applyfont-semibold py-2.5 px-5 rounded-lg transition duration-200 inline-flex items-center gap-2 cursor-pointer;}.btn-primary{@applybg-blue-500hover:bg-blue-700 text-white;}.btn-danger{@applybg-red-500hover:bg-red-700 text-white;}.btn-success{@applybg-green-500hover:bg-green-700 text-white;}.btn-outline{@applyborder-2 border-blue-500 text-blue-500hover:bg-blue-50;}.btn-sm{@applytext-sm py-1.5 px-3;}.btn-lg{@applytext-lg py-3 px-6;}.card{@applybg-white rounded-xl shadow-sm border border-gray-200 p-6;}.input-field{@applyw-full px-3 py-2.5 border border-gray-300 rounded-lgfocus:border-blue-500focus:ring-2focus:ring-blue-200 outline-none transition;}.badge{@applytext-xs font-semibold px-2.5 py-0.5 rounded-full;}}/* ===== utilities 层:自定义工具类 ===== */@layerutilities{.text-balance{text-wrap:balance;}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none;}.scrollbar-hide::-webkit-scrollbar{display:none;}}3. 不使用 @layer 的样式
/* 不放在 @layer 中的样式优先级最高,可覆盖所有 Tailwind 类 */.special-override{color:red!important;}谨慎使用,通常应优先通过
@layer管理优先级。
五、与构建工具集成
1. Vite 集成(推荐)
npmcreate vite@latest my-project ----templatevanillacdmy-projectnpminstall-Dtailwindcss postcss autoprefixer npx tailwindcss init-p# 生成 tailwind.config.js + postcss.config.js// postcss.config.jsexportdefault{plugins:{tailwindcss:{},autoprefixer:{},},}Vite 会自动处理 PostCSS,无需手动指定输出路径。
2. Webpack 集成
npminstall-Dtailwindcss postcss postcss-loader autoprefixer npx tailwindcss init-p// webpack.config.jsmodule.exports={module:{rules:[{test:/\.css$/,use:['style-loader','css-loader','postcss-loader'],},],},};3. Next.js 集成
npx create-next-app@latest my-projectcdmy-projectnpminstall-Dtailwindcss postcss autoprefixer npx tailwindcss init-p// tailwind.config.jscontent:['./app/**/*.{js,ts,jsx,tsx,mdx}','./pages/**/*.{js,ts,jsx,tsx,mdx}','./components/**/*.{js,ts,jsx,tsx,mdx}',],4. Vue CLI 集成
vue create my-projectcdmy-projectnpminstall-Dtailwindcss postcss autoprefixer npx tailwindcss init-p// tailwind.config.jscontent:['./public/index.html','./src/**/*.{vue,js,ts,jsx,tsx}',],六、PostCSS 与 Autoprefixer
1. 为什么需要 Autoprefixer
Tailwind v3 本身不添加浏览器前缀,需要 Autoprefixer 自动补全:
/* 输入 */.example{appearance:none;}/* Autoprefixer 输出 */.example{-webkit-appearance:none;-moz-appearance:none;appearance:none;}2. 安装
npminstall-Dautoprefixer3. 配置
// postcss.config.jsmodule.exports={plugins:{tailwindcss:{},autoprefixer:{},},}4. 浏览器目标
// package.json{"browserslist":["> 1%","last 2 versions","not dead"]}七、生产优化
1. Tree-shaking 原理
Tailwind v3 通过content配置扫描模板文件,只生成实际使用的工具类:
所有工具类 (约 100,000+) → 扫描模板 → 实际使用的类 (约 1,000)2. 产出体积对比
| 方式 | 体积 (gzip) |
|---|---|
| CDN (全量) | ~300KB |
| NPM 开发构建 | ~50-100KB |
| NPM 生产构建 + minify | 5-15KB |
3. 构建命令
# 生产构建(压缩 + Tree-shaking)NODE_ENV=production npx tailwindcss-isrc/input.css-odist/output.css--minify4. 检查产出
# 查看生成的 CSS 大小npx tailwindcss-isrc/input.css-odist/output.css--minifyls-lhdist/output.css八、常见问题
1. 样式不生效
原因:content路径配置错误,类名被 Tree-shaking 移除。
// 检查 content 是否覆盖了你的模板文件content:['./src/**/*.{html,js,jsx,ts,tsx,vue}',// 确保路径正确],2. 动态类名不生效
Tailwind不识别拼接的类名:
<!-- 不生效:Tailwind 无法静态分析 --><divclass="text-{{ color }}-500">错误</div>解决方案:完整写出类名,确保被扫描到:
<!-- 正确 --><divclass="{{ color === 'red' ? 'text-red-500' : 'text-blue-500' }}">正确</div>或在safelist中强制保留:
// tailwind.config.jsmodule.exports={safelist:['text-red-500','text-blue-500','bg-red-500','bg-blue-500',],}3. @apply 报错
确保@apply写在@layer块内,或使用独立 CSS 规则:
/* 正确 */@layercomponents{.btn{@applybg-blue-500 text-white;}}/* 也正确(不在 @layer 中,优先级更高) */.btn{@applybg-blue-500 text-white;}4. 修改配置后样式未更新
开发模式下--watch会自动重建。若未生效:
# 删除缓存重新构建rm-rfnode_modules/.cache npx tailwindcss-isrc/input.css-odist/output.css--watch5. 与现有 CSS 冲突
Tailwind 的 Preflight 会重置默认样式,可能导致第三方库样式异常:
/* 禁用 Preflight *//* @tailwind base; */← 注释掉即可@tailwindcomponents;@tailwindutilities;或选择性引入:
@tailwindbase;/* 在 base 之后覆盖冲突样式 */@layerbase{button{background:transparent;}}九、CDN vs NPM 对比总结
| 对比项 | CDN | NPM |
|---|---|---|
| 安装难度 | 极低 | 中 |
| 产出体积 | 大 (~300KB) | 小 (5-15KB gzip) |
| 自定义配置 | 有限 | 完整 |
| @apply / @layer | 有限支持 | 完整支持 |
| Tree-shaking | 不支持 | 支持 |
| 插件生态 | 部分支持 | 完整支持 |
| 构建工具集成 | 不支持 | 支持 |
| 浏览器兼容 | 依赖 JS | 纯 CSS |
| 适用场景 | 学习/原型 | 生产环境 |
总结:学习阶段可用 CDN 快速体验,正式项目务必使用 NPM 方式以获得完整功能和最优性能。
