在小程序中愉快的使用 Tailwind CSS 吧!

logo.jpg

在小程序中愉快的使用 Tailwind CSS 吧!

tailwindcss JIT 思想帶入小程序開發(fā)吧两入!

筆者之前寫了一個 tailwindcss-miniprogram-preset敲才,可是那個方案不能兼容最廣泛的 Just in time 引擎裹纳,在寫法上也有些變體。

于是筆者又寫了一個 weapp-tailwindcss-webpack-plugin紧武,這是一個 plugin 合集剃氧,包含 webpack/vite plugin,它會同時處理類 wxmlwxss 文件阻星,從而我們開發(fā)者朋鞍,不需要更改任何代碼,就能讓 jit 引擎兼容微信小程序妥箕。

此方案可兼容 tailwindcss v2/v3滥酥,webpack v4/v5postcss v7/v8畦幢。

隨著 @vue/cli-service v5 版本的發(fā)布坎吻,uni-app 到時候也會轉為 webpack5 + postcss8 的組合,到時候宇葱,我會升級一下 uni-app 的示例禾怠,讓它從 tailwindcss v2 jit 升級到 tailwindcss v3 jit

Usage

uni-app (vue2/3)

使用方式 | Demo 項目

uni-app for vite (vue3)

使用方式 | Demo 項目

Taro v3 (React/vue2/3)

使用方式 | React Demo 項目 | vue2 Demo 項目 | vue3 Demo 項目

remax (react)

使用方式 | Demo 項目

rax (react)

使用方式 | Demo 項目

原生小程序(webpack5 mina)

使用方式 | Demo 項目

Options 配置項

配置項 類型 描述
htmlMatcher (assetPath:string)=>boolean 匹配 wxml等等模板進行處理的方法
cssMatcher (assetPath:string)=>boolean 匹配 wxss等等樣式文件的方法
jsMatcher (assetPath:string)=>boolean 匹配 js文件進行處理的方法返奉,用于 react
mainCssChunkMatcher (assetPath:string)=>boolean 匹配 tailwindcss jit 生成的 css chunk 的方法
framework (Taro 特有) react|vue2|vue3 由于 Taro 不同框架的編譯結果有所不同贝搁,需要顯式聲明框架類型 默認react
customRuleCallback (node: Postcss.Rule, options: Readonly<RequiredStyleHandlerOptions>) => void 可根據(jù) Postcss walk 自由定制處理方案的 callback 方法
cssPreflight Record<string,string>| false 在所有 view節(jié)點添加的 css 預設吗氏,可根據(jù)情況自由的禁用原先的規(guī)則,或者添加新的規(guī)則雷逆。 詳細用法如下:
// default 默認:
cssPreflight: {
  'box-sizing': 'border-box',
  'border-width': '0',
  'border-style': 'solid',
  'border-color': 'currentColor'
}
// result
// box-sizing: border-box;
// border-width: 0;
// border-style: solid;
// border-color: currentColor

// case 禁用所有
cssPreflight: false
// result
// none

// case 禁用單個屬性
cssPreflight: {
  'box-sizing': false
}
// border-width: 0;
// border-style: solid;
// border-color: currentColor

// case 更改和添加單個屬性
cssPreflight: {
  'box-sizing': 'content-box',
  'background': 'black'
}
// result
// box-sizing: content-box;
// border-width: 0;
// border-style: solid;
// border-color: currentColor;
// background: black

使用 arbitrary values

詳見 tailwindcss/using-arbitrary-values 章節(jié) | Sample

Q&A

1. 我在 js 里寫了 tailwindcss 的任意值弦讽,為什么沒有生效?

詳見 issue#28

A: 因為這個插件,主要是針對, wxss,wxmljsx 進行轉義的膀哲,js 里編寫的 string 是不轉義的往产。如果你有這樣的需求可以這么寫:

import { replaceJs } from 'weapp-tailwindcss-webpack-plugin/replace'
const cardsColor = reactive([
  replaceJs('bg-[#4268EA] shadow-indigo-100'),
  replaceJs('bg-[#123456] shadow-blue-100')
])

你不用擔心把代碼都打進來導致體積過大,我在 'weapp-tailwindcss-webpack-plugin/replace' 中某宪,只暴露了2個方法仿村,代碼體積 1k左右,esm格式兴喂。

2. 一些像 disabled:opacity-50 這類的 tailwindcss 前綴不生效?

詳見 issue#33蔼囊,小程序選擇器的限制。

3. 和原生組件一起使用注意事項

假如出現(xiàn)原生組件引入報錯的情況衣迷,可以參考 issue#35 畏鼓,忽略指定目錄下的文件,跳過插件處理壶谒,比如 uni-app 中的 wxcomponents云矫。

如何更改?在傳入的配置項 cssMatcher汗菜,htmlMatcher 這類中過濾指定目錄或文件让禀。

4. 編譯到 h5 注意事項

有些用戶通過 uni-app 等跨端框架场勤,不止開發(fā)成各種小程序再来,也開發(fā)為 H5啃擦,然而 tailwindcss 本身就兼容 H5 了引瀑。此時你需要更改配置豺撑,我們以 uni-app 為例:

const isH5 = process.env.UNI_PLATFORM === 'h5';
// 然后在 h5 環(huán)境下把 webpack plugin 和 postcss for weapp 給禁用掉
// 我們以 uni-app-vue3-vite 這個 demo為例
// vite.config.ts
import { defineConfig } from 'vite';
import uni from '@dcloudio/vite-plugin-uni';
import { ViteWeappTailwindcssPlugin as vwt } from 'weapp-tailwindcss-webpack-plugin';
// vite 插件配置
const vitePlugins = [uni()];
!isH5 && vitePlugins.push(vwt());

export default defineConfig({
  plugins: vitePlugins
});

// postcss 配置
// 假如不起作用看锉,請使用內(nèi)聯(lián)postcss
const isH5 = process.env.UNI_PLATFORM === 'h5';

const plugins = [require('autoprefixer')(), require('tailwindcss')()];

if (!isH5) {
  plugins.push(
    require('postcss-rem-to-responsive-pixel')({
      rootValue: 32,
      propList: ['*'],
      transformUnit: 'rpx'
    })
  );

  plugins.push(require('weapp-tailwindcss-webpack-plugin/postcss')());
}

module.exports = {
  plugins
};

Related projects

模板 template

uni-app-vite-vue3-tailwind-vscode-template

uni-app-vue3-tailwind-vscode-template

uni-app-vue2-tailwind-vscode-template

weapp-native-mina-tailwindcss-template

預設 tailwindcss preset

tailwindcss-miniprogram-preset

Bugs & Issues

目前這個插件正在快速的開發(fā)中乌叶,如果遇到 Bug 或者想提出 Issue

歡迎提交到此處

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叠聋,一起剝皮案震驚了整個濱河市麻车,隨后出現(xiàn)的幾起案子缀皱,更是在濱河造成了極大的恐慌,老刑警劉巖动猬,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啤斗,死亡現(xiàn)場離奇詭異,居然都是意外死亡赁咙,警方通過查閱死者的電腦和手機钮莲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門免钻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崔拥,你說我怎么就攤上這事极舔。” “怎么了链瓦?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵拆魏,是天一觀的道長。 經(jīng)常有香客問我慈俯,道長渤刃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任贴膘,我火速辦了婚禮卖子,結果婚禮上,老公的妹妹穿的比我還像新娘刑峡。我一直安慰自己洋闽,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布氛琢。 她就那樣靜靜地躺著喊递,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阳似。 梳的紋絲不亂的頭發(fā)上骚勘,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音撮奏,去河邊找鬼俏讹。 笑死,一個胖子當著我的面吹牛畜吊,可吹牛的內(nèi)容都是我干的泽疆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼玲献,長吁一口氣:“原來是場噩夢啊……” “哼殉疼!你這毒婦竟也來了?” 一聲冷哼從身側響起捌年,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤瓢娜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后礼预,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眠砾,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年托酸,在試婚紗的時候發(fā)現(xiàn)自己被綠了褒颈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柒巫。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谷丸,靈堂內(nèi)的尸體忽然破棺而出堡掏,到底是詐尸還是另有隱情,我是刑警寧澤淤井,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布布疼,位于F島的核電站,受9級特大地震影響币狠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜砾层,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一漩绵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肛炮,春花似錦止吐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秕重,卻和暖如春不同,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溶耘。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工二拐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凳兵。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓百新,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庐扫。 傳聞我的和親對象是個殘疾皇子饭望,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容