掘金文章归档 · 第 75 篇 工程化 · 样式方案 Tailwind CSS 3 / 4

tailwindcss @4 和 @3 版本项目引入,及自定义配置

vue3 + vite 双版本对比:引用方式、配置文件、自定义主题与 px 转 vw 适配

原文作者:随意_(掘金) | juejin.cn/post/7487792871821312009 | 发布于 2025-03-31 | 阅读 2,379 · 约 1 分钟

0背景

tailwindcss 已经升级到 @4 版本,并且已经成为了默认的版本,较于 @3 版本引用及自定义配置均有了变化。下面我们就对比下这两个版本的引用不同点。

本文以 vue3 + vite 框架来做试验。

1vue3 + vite + tailwindcss@3 版本

初始化项目

npm create vite@latest  --template vue
cd vue
npm install
npm run dev

安装 tailwindcss@3 和 postcss 引入

npm install -D tailwindcss@3 postcss autoprefixer
// 初始化引用
npx tailwindcss init -p

以上配置后,会在根目录生成 postcss.config.js、tailwind.config.js,src 目录下创建 index.css、tailwind.css。

截图占位:初始化后项目文件结构(postcss.config.js / tailwind.config.js / index.css / tailwind.css)

2@3 版本:引入与配置文件

postcss.config.js 配置如下:

export default {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}

tailwind.config.js 配置如下:

/** @type {import('tailwindcss').Config} */
export default {
  content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
}

tailwind.css 配置如下:

/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

index.css 配置如下:

@import url('tailwind.css');

main.ts 引入 index.css:

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
// 注意此处
import "./index.css"

createApp(App).mount('#app')

在 app.vue 中写入 tailwindcss 类名即可,可以看见效果,如:

<div class="flex justify-center text-red-400">11111111</div>

3@3 版本:自定义主题配置

tailwind.config.js 配置如下(自定义 width / height / padding / margin / fontSize 类,支持固定 px 值):

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{vue,js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {
      // 自定义宽度类
      width: {
        ...Array.from({ length: 300 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义高度类
      height: {
        ...Array.from({ length: 300 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义 padding 类
      padding: {
        ...Array.from({ length: 150 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义 margin 类
      margin: {
        ...Array.from({ length: 100 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义 font-size 类
      fontSize: {
        ...Array.from({ length: 50 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      }
    },
  },
  plugins: [],
};
📌 通过 Array.from + reduce 批量生成 1~300px 的宽度/高度、1~150px 的 padding、1~100px 的 margin、1~50px 的 font-size,可直接写 w-100、mr-20 等任意固定像素类名。

4@3 版本:postcss-px-to-viewport 适配

以上配置我们将 fontSize、margin 等改为了固定宽度,此时安装 postcss-px-to-viewport 可以进行适配:

npm install postcss-px-to-viewport

postcss.config.js 配置如下:

export default {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
    "postcss-px-to-viewport": {
      unitToConvert: "px", // 要转化的单位
      viewportWidth: 750, // UI设计稿的宽度
      unitPrecision: 6, // 转换后的精度,即小数点位数
      propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
      viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw
      fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw
      selectorBlackList: [], // 指定不转换为视窗单位的类名
      minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
      mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
      // replace: true, // 是否转换后直接更换属性值
      exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
      landscape: false // 是否处理横屏情况
    }
  },
}

我们写入 css 类,查看适配已经配置完成:

<div class="flex justify-center text-red-400 mr-20 w-100">11111111</div>

5vue3 + vite + tailwindcss@4 版本

初始化项目

npm create vite@latest  --template vue-ts
cd vue
npm install
npm run dev

4 版本采用插件安装

npm install tailwindcss @tailwindcss/vite

vite.config.ts 配置如下:

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import tailwindcss from "@tailwindcss/vite";

// https://vite.dev/config/
export default defineConfig({
  plugins: [vue(), tailwindcss()],
});

src 下创建 index.css 并在入口引入,配置如下:

@import "tailwindcss";

app.vue 写入类名,效果如下已经引入:

<span class="flex text-red-400">tailwindcss4</span>

6@4 版本:自定义样式(@config)

index.css:

@import "tailwindcss";

@config "../tailwind.config.js";

添加 tailwind.config.js 配置如下(与 @3 相同的自定义主题):

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{vue,js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {
      // 自定义宽度类
      width: {
        ...Array.from({ length: 300 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义高度类
      height: {
        ...Array.from({ length: 300 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义 padding 类
      padding: {
        ...Array.from({ length: 150 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义 margin 类
      margin: {
        ...Array.from({ length: 100 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      },
      // 自定义 font-size 类
      fontSize: {
        ...Array.from({ length: 50 }, (_, i) => i + 1).reduce((acc, num) => {
          acc[num] = `${num}px`;
          return acc;
        }, {})
      }
    },
  },
  plugins: [],
};
<span class="flex text-red-400 w-100">tailwindcss4</span>

postcss 适配可以自行引入。

7两版本对比总结

对比项@3 版本@4 版本
安装方式npm i -D tailwindcss@3 postcss autoprefixernpm i tailwindcss @tailwindcss/vite
初始化npx tailwindcss init -p 生成 postcss/tailwind 配置无需 init,vite 插件直接接入
接入方式postcss.config.js 注册 tailwindcss 插件vite.config.ts 中注册 @tailwindcss/vite
CSS 入口@tailwind base/components/utilities@import "tailwindcss"
自定义配置直接改 tailwind.config.jsindex.css 中 @config 引入配置文件