從 v1.x 升級(jí)到 v2.0
Tailwind CSS v2.0 是自2019年5月發(fā)布 v1.0 以來的第一個(gè)新的主要版本,因此它包括一些小的不兼容性變更。
我們不會(huì)輕易作出不兼容性的變更,并努力確保升級(jí)路徑盡可能簡(jiǎn)單。對(duì)于大多數(shù)項(xiàng)目來說,升級(jí)應(yīng)該在30分鐘內(nèi)完成。
如果您的項(xiàng)目使用 ?@tailwindcss/ui
? 插件,請(qǐng)務(wù)必閱讀 Tailwind UI for Tailwind CSS v2.0 升級(jí)指南。
Tailwind CSS v2.0 已經(jīng)更新為最新的 PostCSS 版本,這需要安裝 ?postcss
?和 ?autoprefixer
?作為其依賴,同時(shí)安裝 Tailwind 本身。
更新 Tailwind 并使用 npm 安裝 PostCSS 和 autoprefixer。
npm install tailwindcss@latest postcss@latest autoprefixer@latest
如果您遇到問題,您可能需要使用我們的 PostCSS 7兼容性版本。
在v2.0之前,我們盡力確保我們?cè)?nbsp;Tailwind 中包含的功能盡可能在 IE 11 中工作。這增加了相當(dāng)大的維護(hù)負(fù)擔(dān),以及增加了構(gòu)建的大?。词乖谇謇砦词褂玫臉邮剑晕覀儧Q定從v2.0開始放棄對(duì)IE 11的支持。
如果您需要支持 IE 11,我們建議繼續(xù)使用 Tailwind CSS v1.9,直到您不再需要支持 IE。
Tailwind CSS v2.0 不再支持 Node.js 8或10。要建立您的 CSS,您需要確保您在本地和 CI 環(huán)境中運(yùn)行 Node.js 12.13.0或更高版本。
如果您正在使用 ?@tailwindcss/typography
?,您需要升級(jí)到 v0.3.0,它增加了 Tailwind CSS v2.0 的支持。
如果您正在使用 ?@tailwindcss/custom-forms
?,您將需要遷移到 ?@tailwindcss/forms
? 來取代它。
?@tailwindcss/custom-forms
? 插件與 Tailwind CSS v2.0不兼容。
從 v2.0 開始,就沒有 ?future
?或 ?experimental
?選項(xiàng)了,所以您可以從您的 tailwind.config.js 文件中刪除任何這樣的配置。
module.exports = {
future: {
defaultLineHeights: true,
purgeLayersByDefault: true,
removeDeprecatedGapUtilities: true,
},
experimental: {
additionalBreakpoint: true,
extendedFontSizeScale: true,
extendedSpacingScale: true,
},
// ...
}
未來我們會(huì)繼續(xù)使用 ?experimental
?選項(xiàng)來實(shí)現(xiàn)新的功能想法,但 ?future
?可能不會(huì)使用該選項(xiàng)。
在 v2.0 中,有一小部分功能類被重新命名。
舊名 | 新名 |
---|---|
whitespace-no-wrap
|
whitespace-nowrap
|
flex-no-wrap
|
flex-nowrap
|
col-gap-{n}
|
gap-x-{n}
|
row-gap-{n}
|
gap-y-{n}
|
您應(yīng)該能夠在整個(gè)項(xiàng)目中非常安全地全局查找和替換這些類,因?yàn)樗鼈兪欠浅2煌淖址?/p>
更新 ?whitespace-no-wrap
? 和 ?flex-no-wrap
? 只是直接替換,對(duì)于 gap 功能類,我們建議將 ?col-gap-
? 替換為 ?gap-x-
?,將 ?row-gap-
? 替換為 ?gap-y-
?,以便一次性處理所有尺寸。
fontWeight 插件的 ?hover
?和 ?focus
?變體已經(jīng)被默認(rèn)禁用,因?yàn)橄襁@樣改變字體重量往往會(huì)導(dǎo)致布局混亂,所以無(wú)論如何都不會(huì)真正這么做。
如果您在項(xiàng)目中需要這些,請(qǐng)?jiān)谀?nbsp;tailwind.config.js 文件中重新啟用它們:
// tailwind.config.js
module.exports = {
variants: {
extend: {
fontWeight: ['hover', 'focus']
}
}
}
?clearfix
?類已被刪除,因?yàn)?nbsp;?flow-root
? 是現(xiàn)代瀏覽器中相同問題的更簡(jiǎn)單解決方案。
<div class="clearfix">
<div class="flow-root">
<img class="float-left" src="..." alt="..." />
<p>Lorem ipsum...</p>
</div>
在 Tailwind CSS v2.0中,100 和 200 字體權(quán)重的類名已經(jīng)改變。
字體權(quán)重 | 舊名稱 | 新名稱 |
---|---|---|
100 | font-hairline
|
font-thin
|
200 | font-thin
|
font-extralight
|
由于 ?font-thin
? 在 v1 和 v2 中出現(xiàn)的權(quán)重不同,我們建議按以下順序更新您的類:
font-extralight
? 替換 ?font-thin
?font-thin
? 替換 ?font-hairline
?Tailwind CSS v2.0 引入了一套新的 ?ring
?功能類,讓您以一種自動(dòng)與 Tailwind 的其他箱形陰影功能類相結(jié)合的方式添加輪廓陰影/焦點(diǎn)環(huán)。
這些都是比 ?shadow-outline
? 和 ?shadow-xs
? 類更好更強(qiáng)大的選擇,所以我們已經(jīng)刪除了這些類。
用 ?ring
?替換 ?shadow-outline
?:
<div class="... focus:shadow-outline">
<div class="... focus:ring">
用 ?ring-1 ring-black ring-opacity-5
? 替換 ?shadow-xs
?:
<div class="... shadow-xs">
<div class="... ring-1 ring-black ring-opacity-5">
另外,您也可以將 ?shadow-outline
? 和 ?shadow-xs
? 添加到您的配置文件中,而不影響您的 HTML。
module.exports = {
theme: {
extend: {
boxShadow: {
xs: '0 0 0 1px rgba(0, 0, 0, 0.05)',
outline: '0 0 0 3px rgba(66, 153, 225, 0.5)',
}
}
}
}
Tailwind CSS v2.0 添加了一個(gè)新的 ?2xl
?斷點(diǎn),它將影響您使用 ?container
?類的任何情況。如果這對(duì)您有影響,請(qǐng)通過使用現(xiàn)有斷點(diǎn)覆蓋 ?screens
?來刪除 ?2xl
?斷點(diǎn):
// tailwind.config.js
module.exports = {
purge: [
// ...
],
theme: {
screens: {
sm: '640px',
md: '768px',
lg: '1024px',
xl: '1280px',
}
// ...
},
variants: {
// ...
}
}
如果您已經(jīng)在使用自定義調(diào)色板,則無(wú)需更改,您可以安全地跳過此步驟。
Tailwind CSS v2.0 中的默認(rèn)調(diào)色板發(fā)生了很大變化,并且并非旨在替代 v1.0 中包含的調(diào)色板。
如果您使用的是默認(rèn)調(diào)色板,您應(yīng)該明確配置它以使用您的網(wǎng)站已經(jīng)使用的顏色覆蓋新的默認(rèn)調(diào)色板。
下面是一個(gè)包含v1版默認(rèn)顏色的 tailwind.config.js
文件的例子:
// tailwind.config.js
module.exports = {
theme: {
colors: {
transparent: 'transparent',
current: 'currentColor',
black: '#000',
white: '#fff',
gray: {
100: '#f7fafc',
200: '#edf2f7',
300: '#e2e8f0',
400: '#cbd5e0',
500: '#a0aec0',
600: '#718096',
700: '#4a5568',
800: '#2d3748',
900: '#1a202c',
},
red: {
100: '#fff5f5',
200: '#fed7d7',
300: '#feb2b2',
400: '#fc8181',
500: '#f56565',
600: '#e53e3e',
700: '#c53030',
800: '#9b2c2c',
900: '#742a2a',
},
orange: {
100: '#fffaf0',
200: '#feebc8',
300: '#fbd38d',
400: '#f6ad55',
500: '#ed8936',
600: '#dd6b20',
700: '#c05621',
800: '#9c4221',
900: '#7b341e',
},
yellow: {
100: '#fffff0',
200: '#fefcbf',
300: '#faf089',
400: '#f6e05e',
500: '#ecc94b',
600: '#d69e2e',
700: '#b7791f',
800: '#975a16',
900: '#744210',
},
green: {
100: '#f0fff4',
200: '#c6f6d5',
300: '#9ae6b4',
400: '#68d391',
500: '#48bb78',
600: '#38a169',
700: '#2f855a',
800: '#276749',
900: '#22543d',
},
teal: {
100: '#e6fffa',
200: '#b2f5ea',
300: '#81e6d9',
400: '#4fd1c5',
500: '#38b2ac',
600: '#319795',
700: '#2c7a7b',
800: '#285e61',
900: '#234e52',
},
blue: {
100: '#ebf8ff',
200: '#bee3f8',
300: '#90cdf4',
400: '#63b3ed',
500: '#4299e1',
600: '#3182ce',
700: '#2b6cb0',
800: '#2c5282',
900: '#2a4365',
},
indigo: {
100: '#ebf4ff',
200: '#c3dafe',
300: '#a3bffa',
400: '#7f9cf5',
500: '#667eea',
600: '#5a67d8',
700: '#4c51bf',
800: '#434190',
900: '#3c366b',
},
purple: {
100: '#faf5ff',
200: '#e9d8fd',
300: '#d6bcfa',
400: '#b794f4',
500: '#9f7aea',
600: '#805ad5',
700: '#6b46c1',
800: '#553c9a',
900: '#44337a',
},
pink: {
100: '#fff5f7',
200: '#fed7e2',
300: '#fbb6ce',
400: '#f687b3',
500: '#ed64a6',
600: '#d53f8c',
700: '#b83280',
800: '#97266d',
900: '#702459',
},
}
}
}
我們不建議更新現(xiàn)有網(wǎng)站以使用新的默認(rèn)調(diào)色板。這些數(shù)字并不意味著可以轉(zhuǎn)移,所以例如 v2 中的 bg-red-600 并不僅僅是 v1 中的 bg-red-600 的 “更好 “版本—它有不同的對(duì)比特性。如果您對(duì)您的網(wǎng)站的外觀很滿意,就沒有必要花上幾個(gè)小時(shí)來更新您的 HTML。舊的顏色也很好
如果您已經(jīng)使用了自定義的排版比例,則無(wú)需更改,您可以安全地跳過這一步。
在v2.0中,每個(gè)字體大小功能類默認(rèn)都包含一個(gè)合理的特定行高,例如 ?text-sm
? 會(huì)自動(dòng)設(shè)置 ?1.25rem
? 的行高。
如果您沒有在 ?font-size
? 功能類旁明確添加 ?leading
?功能類,這將會(huì)改變您的網(wǎng)站在任何地方的外觀。
解決這個(gè)問題的最快方法是顯式配置您的 ?font-size
? 比例,使用 v1 的比例:
// tailwind.config.js
module.exports = {
theme: {
fontSize: {
xs: '0.75rem',
sm: '0.875rem',
base: '1rem',
lg: '1.125rem',
xl: '1.25rem',
'2xl': '1.5rem',
'3xl': '1.875rem',
'4xl': '2.25rem',
'5xl': '3rem',
'6xl': '4rem',
},
}
}
另外,您也可以檢查您的 HTML,并在任何依賴?yán)^承行高的地方明確添加一個(gè) ?leading
?功能類。
<p class="text-lg">...</p>
<p class="text-lg leading-normal">...</p>
在Tailwind CSS v1.x中, tailwind.config.js的各個(gè)主題部分的 ?default
?關(guān)鍵字有時(shí)意味著 “不要給類名添加后綴”。
例如,這個(gè)配置:
// tailwind.config.js
module.exports = {
theme: {
borderRadius: {
none: '0',
sm: '0.125rem',
default: '0.25rem',
md: '0.375rem',
lg: '0.5rem',
},
}
}
會(huì)生成一個(gè) ?border-radius
? 為 ?0.25rem
? 的 ?rounded
?類,而不是一個(gè) ?rounded-default
? 類。
在 Tailwind CSS v2.0 中,我們已經(jīng)更新了所有對(duì) ?default
?的特殊用法,改為大寫的 ?DEFAULT
?。
// tailwind.config.js
module.exports = {
theme: {
borderRadius: {
none: '0',
sm: '0.125rem',
DEFAULT: '0.25rem',
md: '0.375rem',
lg: '0.5rem',
},
}
}
小寫的 ?default
?會(huì)像其他字符串一樣被處理,所以在 ?borderRadius
?下的默認(rèn)值會(huì)在 Tailwind CSS v.2.0 中生成一個(gè)四舍五入的 ?default
?類,您應(yīng)該更新配置文件中所有 ?default
?的用法,除非您真的想生成一個(gè) ?{utility}-default
? 類。
您應(yīng)該把配置文件中所有 ?default
?的用法都更新為 ?DEFAULT
?,除非您真的想生成一個(gè) ?{utility}-default
? 類,比如 ?cursor-default
?。
如果您不清楚您自己的配置需要做哪些改變,請(qǐng)參考完整的 default 配置,看看我們現(xiàn)在在哪些地方使用了 ?DEFAULT
?,哪些地方還在使用 ?default
?。
在 Tailwind CSS v1.0 中,?extend
?下的主題變化被淺層次合并。所以這個(gè)配置會(huì)覆蓋所有的紫色。
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
purple: {
light: '#E9D8FD',
medium: '#9F7AEA',
dark: '#553C9A',
}
}
}
}
}
在 v2.0 中,這些都是深度合并的,所以上面的配置仍然會(huì)生成默認(rèn)的紫色-100到紫色-900色調(diào),此外還有自定義的紫色-淺色、紫色-中色和紫色-深色。
在大多數(shù)情況下,這很有用,但如果您是依靠淺層合并,您會(huì)希望將您的自定義移動(dòng)到頂層,并手動(dòng)合并其他頂層顏色。
const defaultTheme = require('tailwindcss/defaultTheme')
module.exports = {
theme: {
colors: {
...defaultTheme.colors,
purple: {
light: '#E9D8FD',
medium: '#9F7AEA',
dark: '#553C9A',
}
}
}
}
您可能不需要這樣做。
在 v2.0 中,?@apply
? 功能變得更加強(qiáng)大,但需要改變一些行為才能實(shí)現(xiàn)。
以前,類是按照它們?cè)?nbsp;CSS 中出現(xiàn)的順序來應(yīng)用的。
/* Input */
.my-class {
@apply pt-5 p-4;
}
/* Output */
.my-class {
padding-top: 1.25rem;
padding: 1rem;
}
現(xiàn)在,類將按照它們?cè)谠?nbsp;CSS 中出現(xiàn)的順序被應(yīng)用。
/* Input */
.my-class {
@apply pt-5 p-4;
}
/* Output */
.my-class {
padding: 1rem;
padding-top: 1.25rem;
}
這是為了確保行為與 HTML 中的行為一致。
<!-- Here `pt-5` still takes precedence even though it appears first. -->
<div class="pt-5 p-4">...</div>
如果您是依賴舊的行為,您可能會(huì)看到您的網(wǎng)站的渲染方式有一些差異。要解決這個(gè)問題,請(qǐng)使用多個(gè) ?@apply
? 聲明。
.my-class {
@apply pt-5;
@apply p-4;
}
這幾乎不會(huì)影響那些不會(huì)去做奇怪事情的人。
在 Tailwind CSS v1.0 中,即使您配置了一個(gè)前綴,您也可以 @apply 無(wú)前綴的功能類。
這在 v2.0 中不再支持,所以如果您為您的網(wǎng)站配置了一個(gè)前綴(如 ?tw-
? ),您需要確保在您使用 ?@apply
? 時(shí)包含這個(gè)前綴。
.my-class {
@apply tw-p-4 tw-bg-red-500;
}
我們?cè)?jīng)支持用可選的 ?.
? 字符來編寫 ?@apply
? 語(yǔ)句。
.my-class {
@apply .p-4 .bg-red-500;
}
我們不再支持這個(gè)了,所以更新任何 ?@apply
? 語(yǔ)句并刪除點(diǎn)。
.my-class {
@apply p-4 bg-red-500;
}
以下正則表達(dá)式可用于查找和刪除 ?@apply
? 語(yǔ)句中的前導(dǎo)點(diǎn):
(?<=@apply.*)\.
truncate
功能類現(xiàn)在是 textOverflow
核心插件的一部分,所以如果您為了使用 truncate
類而為 wordBreak
插件啟用了任何額外的變體(比如 group-hover
),您現(xiàn)在也要為 textOverflow
啟用這些變體。
// tailwind.config.js
module.exports = {
variants: {
wordBreak: ['responsive', 'group-hover'],
textOverflow: ['responsive', 'group-hover'],
}
}
由于 iOS 13 不再支持 ?-webkit-overflow-scrolling
? 屬性,我們已經(jīng)從 v2.0 中刪除了這兩個(gè)功能。
如果您仍然需要它們,因?yàn)槟跒槔习姹镜?nbsp;iOS 構(gòu)建一些東西,您可以自己將它們添加為自定義功能。
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer utilities {
@responsive {
.scrolling-touch {
-webkit-overflow-scrolling: touch;
}
.scrolling-auto {
-webkit-overflow-scrolling: auto;
}
}
}
在 v2.0 中,?theme
?功能(在 CSS、tailwind.config.js文件和插件 API 中)更加智能,不再需要您手動(dòng)加入數(shù)組或明確訪問第一個(gè)索引。
// tailwind.config.js
const plugin = require('tailwindcss/plugin')
module.exports = {
theme: {
fontSize: {
// ...
xl: ['20px', { lineHeight: '28px' }]
}
},
plugins: [
plugin(({ addBase, theme }) => {
addBase({
h1: {
// Before
fontSize: theme('fontSize.xl')[0],
fontFamily: theme('fontFamily.sans').join(','),
// Now
fontSize: theme('fontSize.xl'),
fontFamily: theme('fontFamily.sans'),
}
})
})
]
}
如果出于任何原因您想訪問原始數(shù)據(jù)結(jié)構(gòu),您可以使用 ?config
? 函數(shù)來代替。
我們?cè)?jīng)有一個(gè)特殊的規(guī)則,在使用 ?space-x/y
? 和 ?divide-x/y
? 功能類時(shí)忽略模板元素,主要是為了讓 Alpine.js 用戶更加方便。
我們已經(jīng)更新了工作方式,不再對(duì)模板元素進(jìn)行特殊處理,而是明確地忽略任何具有隱藏屬性的元素。
要更新您的代碼以適應(yīng)這一變化,只需在您的 ?template
?標(biāo)簽中添加 ?hidden
?即可:
<div class="space-y-4">
<template x-for="item in items">
<template x-for="item in items" hidden>
<!-- ... -->
</template>
</div>
在內(nèi)部,我們已經(jīng)升級(jí)到了 PurgeCSS 3.0,所以您通過選項(xiàng)鍵傳遞到 PurgeCSS 的任何原始選項(xiàng)都需要更新,以匹配 PurgeCSS 3.0 中的選項(xiàng)。
例如,如果您使用的是 ?whitelist
?,您就需要更新為 ?safelist
?:
// tailwind.config.js
module.exports = {
purge: {
content: [
// ...
],
options: {
whitelist: ['my-class']
safelist: ['my-class']
}
}
}
如果您沒有使用 ?option
?鍵,您不需要做任何事情。
在 v1.0 中,如果您使用一個(gè)自定義的提取器,Tailwind 忽略了 ?preserveHtmlElements
?選項(xiàng)。這個(gè)選項(xiàng)現(xiàn)在在 v2.0 中得到了適當(dāng)?shù)淖鹬?,所以如果您想禁用它,您需要顯式地這樣做:
// tailwind.config.js
module.exports = {
purge: {
content: [
// ...
],
preserveHtmlElements: false,
options: {
defaultExtractor: () => {
// ...
}
}
}
}
如果您已經(jīng)在您的 ?tailwind.config.js
? 文件中配置了一個(gè)前綴,Tailwind v2.0 將自動(dòng)應(yīng)用該前綴到您的主題中的任何 ?keyframes
?聲明。
如果您在自定義 CSS 中引用任何配置的 keyframes,您需要確保添加您的前綴。
.my-class {
animation: spin 1s infinite;
animation: tw-spin 1s infinite;
}
這僅在您配置了前綴并且在自定義 CSS 文件中引用配置的關(guān)鍵幀時(shí)才重要。
更多建議: