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.jsmain.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.jsmain.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

#牛客AI配图神器#

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-19 18:52
七牛云一生之敌I两个...:自我评价删了,其他浓缩为一页
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务