Skip to content

Commit b4bebe1

Browse files
committed
fix: avoid v3 hmr content rescan
1 parent 04f6184 commit b4bebe1

3 files changed

Lines changed: 53 additions & 1 deletion

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"weapp-tailwindcss": patch
2+
---
3+
4+
修复 Tailwind CSS v3 自定义生成引擎在显式候选驱动的增量生成中重复扫描配置 content 的问题,避免 uni-app Vite 热更新时生成 CSS 持续膨胀并拖慢 HMR。

packages/weapp-tailwindcss/src/tailwindcss/v3-engine/generator.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,25 @@ function normalizeConfigObject(config: Config | undefined) {
124124
return config
125125
}
126126

127+
function hasExplicitContentInput(options: TailwindV3GenerateOptions) {
128+
return options.candidates !== undefined || options.sources !== undefined
129+
}
130+
131+
function createExplicitContentConfig(rawEntries: Array<{ raw: string, extension: string }>) {
132+
return {
133+
relative: true,
134+
files: rawEntries,
135+
}
136+
}
137+
127138
function createTailwindConfig(source: TailwindV3ResolvedSource, options: TailwindV3GenerateOptions) {
128139
const config = {
129140
...(normalizeConfigObject(source.configObject) ?? {}),
130141
} as Config
131142
const rawEntries = createRawContentEntries(options.candidates ?? [], options.sources ?? [])
132-
config.content = mergeContent(config.content, rawEntries) as Config['content']
143+
config.content = hasExplicitContentInput(options)
144+
? createExplicitContentConfig(rawEntries) as Config['content']
145+
: mergeContent(config.content, rawEntries) as Config['content']
133146
return config
134147
}
135148

packages/weapp-tailwindcss/test/tailwindcss/v3-engine.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,41 @@ describe('tailwindcss v3 engine', () => {
249249
expect(second.css.match(/\.bg-blue-500/g) ?? []).toHaveLength(1)
250250
})
251251

252+
it('does not rescan configured content when explicit candidates drive v3 incremental generation', async () => {
253+
const source = await resolveTailwindV3Source({
254+
css: '@tailwind utilities;',
255+
base: process.cwd(),
256+
config: undefined,
257+
})
258+
source.configObject = {
259+
content: [
260+
{
261+
raw: '<view class="text-[88rpx] bg-[#4268EA]"></view>',
262+
extension: 'html',
263+
},
264+
],
265+
}
266+
const engine = createTailwindV3Engine(source)
267+
268+
const first = await engine.generate({
269+
candidates: ['bg-[#4268EA]'],
270+
incrementalCache: true,
271+
})
272+
const second = await engine.generate({
273+
candidates: ['bg-[#4268EA]', 'bg-[red]'],
274+
incrementalCache: true,
275+
})
276+
277+
expect(first.classSet).toEqual(new Set(['bg-[#4268EA]']))
278+
expect(first.css).toContain('.bg-_b_h4268EA_B')
279+
expect(first.css).not.toContain('88rpx')
280+
expect(second.classSet).toEqual(new Set(['bg-[#4268EA]', 'bg-[red]']))
281+
expect(second.css).toContain('.bg-_bred_B')
282+
expect(second.css).not.toContain('88rpx')
283+
expect(second.css.length - first.css.length).toBeLessThan(400)
284+
expect(second.css.match(/\.bg-_b_h4268EA_B/g) ?? []).toHaveLength(1)
285+
})
286+
252287
it('normalizes default export configs before generating plugin components', async () => {
253288
const source = await resolveTailwindV3Source({
254289
css: '@tailwind components;',

0 commit comments

Comments
 (0)