Vue3整合Element Plus与Tailwind CSS指南
Vue 3 项目集成 Element Plus 与 Tailwind CSS 教程
创建 Vue 3 项目
使用 Vue CLI 或 Vite 创建新项目。以 Vite 为例,运行以下命令:
npm create vite@latest vue3-element-tailwind --template vue
cd vue3-element-tailwind
npm install
安装 Element Plus
通过 npm 或 yarn 安装 Element Plus 及其依赖:
npm install element-plus
在 main.js 或 main.ts 中全局引入 Element Plus:
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
安装 Tailwind CSS
通过 npm 安装 Tailwind CSS 及其依赖:
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init
配置 tailwind.config.js:
module.exports = {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}
在 src/assets 目录下创建 tailwind.css 文件并添加基础样式:
@tailwind base;
@tailwind components;
@tailwind utilities;
在 main.js 或 main.ts 中引入 Tailwind CSS:
import './assets/tailwind.css'
解决样式冲突
Element Plus 和 Tailwind CSS 可能因基础样式(如 preflight)产生冲突。在 tailwind.config.js 中禁用 preflight:
module.exports = {
corePlugins: {
preflight: false,
},
// 其他配置...
}
或通过自定义 CSS 覆盖冲突样式:
@layer base {
button, [type='button'] {
background-color: var(--el-button-bg-color);
}
}
示例组件
结合两者编写一个登录表单组件:
<template>
<div class="min-h-screen flex items-center justify-center bg-gray-100">
<el-card class="w-96 shadow-lg">
<h2 class="text-2xl font-bold text-center mb-6">Login</h2>
<el-form :model="form" label-width="80px">
<el-form-item label="Username">
<el-input v-model="form.username" class="w-full" />
</el-form-item>
<el-form-item label="Password">
<el-input v-model="form.password" type="password" class="w-full" />
</el-form-item>
<el-button
type="primary"
class="w-full mt-4"
@click="handleLogin"
>
Sign In
</el-button>
</el-form>
</el-card>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const form = reactive({
username: '',
password: ''
})
const handleLogin = () => {
console.log('Login}
</script>
按需导入优化
为减小打包体积,可配置 Element Plus 按需导入。安装 unplugin-vue-components:
npm install -D unplugin-vue-components unplugin-auto-import
修改 vite.config.js:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
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: [
vue(),
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
})
生产环境优化
通过 PurgeCSS 移除未使用的 Tailwind 样式。安装依赖:
npm install -D @fullhuman/postcss-purgecss
在 postcss.config.js 中添加配置:
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
...(process.env.NODE_ENV === 'production'
? {
'@fullhuman/postcss-purgecss': {
content: ['./src/**/*.vue', './index.html'],
defaultExtractor: content => content.match(/[\w-/:]+(?<!:)/g) || [],
safelist: {
standard: [/^el-/], // 保留 Element Plus 类名
}
}
}
: {})
}
}
BbS.okapop001.sbs/PoSt/1122_138737.HtM
BbS.okapop002.sbs/PoSt/1122_908326.HtM
BbS.okapop003.sbs/PoSt/1122_803941.HtM
BbS.okapop004.sbs/PoSt/1122_889358.HtM
BbS.okapop005.sbs/PoSt/1122_579445.HtM
BbS.okapop006.sbs/PoSt/1122_968939.HtM
BbS.okapop007.sbs/PoSt/1122_875653.HtM
BbS.okapop008.sbs/PoSt/1122_657726.HtM
BbS.okapop009.sbs/PoSt/1122_928558.HtM
BbS.okapop010.sbs/PoSt/1122_721541.HtM
BbS.okapop001.sbs/PoSt/1122_906784.HtM
BbS.okapop002.sbs/PoSt/1122_996319.HtM
BbS.okapop003.sbs/PoSt/1122_530039.HtM
BbS.okapop004.sbs/PoSt/1122_253068.HtM
BbS.okapop005.sbs/PoSt/1122_477222.HtM
BbS.okapop006.sbs/PoSt/1122_411071.HtM
BbS.okapop007.sbs/PoSt/1122_850700.HtM
BbS.okapop008.sbs/PoSt/1122_355470.HtM
BbS.okapop009.sbs/PoSt/1122_114606.HtM
BbS.okapop010.sbs/PoSt/1122_332510.HtM
BbS.okapop001.sbs/PoSt/1122_054094.HtM
BbS.okapop002.sbs/PoSt/1122_026494.HtM
BbS.okapop003.sbs/PoSt/1122_597011.HtM
BbS.okapop004.sbs/PoSt/1122_513685.HtM
BbS.okapop005.sbs/PoSt/1122_272372.HtM
BbS.okapop006.sbs/PoSt/1122_298392.HtM
BbS.okapop007.sbs/PoSt/1122_955284.HtM
BbS.okapop008.sbs/PoSt/1122_345364.HtM
BbS.okapop009.sbs/PoSt/1122_515333.HtM
BbS.okapop010.sbs/PoSt/1122_384876.HtM
BbS.okapop001.sbs/PoSt/1122_871241.HtM
BbS.okapop002.sbs/PoSt/1122_758731.HtM
BbS.okapop003.sbs/PoSt/1122_139227.HtM
BbS.okapop004.sbs/PoSt/1122_331564.HtM
BbS.okapop005.sbs/PoSt/1122_094821.HtM
BbS.okapop006.sbs/PoSt/1122_680927.HtM
BbS.okapop007.sbs/PoSt/1122_479701.HtM
BbS.okapop008.sbs/PoSt/1122_932717.HtM
BbS.okapop009.sbs/PoSt/1122_327676.HtM
BbS.okapop010.sbs/PoSt/1122_402256.HtM
BbS.okapop001.sbs/PoSt/1122_273307.HtM
BbS.okapop002.sbs/PoSt/1122_617081.HtM
BbS.okapop003.sbs/PoSt/1122_700870.HtM
BbS.okapop004.sbs/PoSt/1122_154469.HtM
BbS.okapop005.sbs/PoSt/1122_699217.HtM
BbS.okapop006.sbs/PoSt/1122_825041.HtM
BbS.okapop007.sbs/PoSt/1122_482219.HtM
BbS.okapop008.sbs/PoSt/1122_472389.HtM
BbS.okapop009.sbs/PoSt/1122_041872.HtM
BbS.okapop010.sbs/PoSt/1122_493006.HtM
BbS.okapop001.sbs/PoSt/1122_284710.HtM
BbS.okapop002.sbs/PoSt/1122_543942.HtM
BbS.okapop003.sbs/PoSt/1122_633811.HtM
BbS.okapop004.sbs/PoSt/1122_762272.HtM
BbS.okapop005.sbs/PoSt/1122_015550.HtM
BbS.okapop006.sbs/PoSt/1122_287203.HtM
BbS.okapop007.sbs/PoSt/1122_347873.HtM
BbS.okapop008.sbs/PoSt/1122_016700.HtM
BbS.okapop009.sbs/PoSt/1122_033393.HtM
BbS.okapop010.sbs/PoSt/1122_578491.HtM
BbS.okapop001.sbs/PoSt/1122_080051.HtM
BbS.okapop002.sbs/PoSt/1122_961390.HtM
BbS.okapop003.sbs/PoSt/1122_089549.HtM
BbS.okapop004.sbs/PoSt/1122_128624.HtM
BbS.okapop005.sbs/PoSt/1122_358488.HtM
BbS.okapop006.sbs/PoSt/1122_494336.HtM
BbS.okapop007.sbs/PoSt/1122_686072.HtM
BbS.okapop008.sbs/PoSt/1122_059346.HtM
BbS.okapop009.sbs/PoSt/1122_700678.HtM
BbS.okapop010.sbs/PoSt/1122_098791.HtM
BbS.okapop001.sbs/PoSt/1122_428008.HtM
BbS.okapop002.sbs/PoSt/1122_320295.HtM
BbS.okapop003.sbs/PoSt/1122_400501.HtM
BbS.okapop004.sbs/PoSt/1122_065611.HtM
BbS.okapop005.sbs/PoSt/1122_948317.HtM
BbS.okapop006.sbs/PoSt/1122_546135.HtM
BbS.okapop007.sbs/PoSt/1122_046086.HtM
BbS.okapop008.sbs/PoSt/1122_002321.HtM
BbS.okapop009.sbs/PoSt/1122_175980.HtM
BbS.okapop010.sbs/PoSt/1122_791079.HtM

