Skip to content

Commit 9e2a1ea

Browse files
authored
fix(plugin-react): broken optimized deps dir check (#8255)
1 parent d98c8a7 commit 9e2a1ea

File tree

4 files changed

+20
-18
lines changed

4 files changed

+20
-18
lines changed

docs/guide/features.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ The above will throw an error in the browser. Vite will detect such bare module
1414

1515
1. [Pre-bundle](./dep-pre-bundling) them to improve page loading speed and convert CommonJS / UMD modules to ESM. The pre-bundling step is performed with [esbuild](http://esbuild.github.io/) and makes Vite's cold start time significantly faster than any JavaScript-based bundler.
1616

17-
2. Rewrite the imports to valid URLs like `/node_modules/.vite/my-dep.js?v=f3sf2ebd` so that the browser can import them properly.
17+
2. Rewrite the imports to valid URLs like `/node_modules/.vite/deps/my-dep.js?v=f3sf2ebd` so that the browser can import them properly.
1818

1919
**Dependencies are Strongly Cached**
2020

packages/plugin-react/src/index.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import path from 'path'
12
import type { ParserOptions, TransformOptions, types as t } from '@babel/core'
23
import * as babel from '@babel/core'
34
import { createFilter } from '@rollup/pluginutils'
45
import resolve from 'resolve'
6+
import { normalizePath } from 'vite'
57
import type { Plugin, PluginOption, ResolvedConfig } from 'vite'
68
import {
79
addRefreshWrapper,
@@ -91,6 +93,7 @@ declare module 'vite' {
9193
export default function viteReact(opts: Options = {}): PluginOption[] {
9294
// Provide default values for Rollup compat.
9395
let base = '/'
96+
let resolvedCacheDir: string
9497
let filter = createFilter(opts.include, opts.exclude)
9598
let isProduction = true
9699
let projectRoot = process.cwd()
@@ -119,6 +122,7 @@ export default function viteReact(opts: Options = {}): PluginOption[] {
119122
configResolved(config) {
120123
base = config.base
121124
projectRoot = config.root
125+
resolvedCacheDir = normalizePath(path.resolve(config.cacheDir))
122126
filter = createFilter(opts.include, opts.exclude, {
123127
resolve: projectRoot
124128
})
@@ -209,8 +213,12 @@ export default function viteReact(opts: Options = {}): PluginOption[] {
209213
// By reverse-compiling "React.createElement" calls into JSX,
210214
// React elements provided by dependencies will also use the
211215
// automatic runtime!
216+
// Avoid parsing the optimized react-dom since it will never
217+
// contain compiled JSX and it's a pretty big file (800kb).
218+
const isOptimizedReactDom =
219+
id.startsWith(resolvedCacheDir) && id.includes('/react-dom.js')
212220
const [restoredAst, isCommonJS] =
213-
!isProjectFile && !isJSX
221+
!isProjectFile && !isJSX && !isOptimizedReactDom
214222
? await restoreJSX(babel, code, id)
215223
: [null, false]
216224

packages/plugin-react/src/jsx-runtime/restore-jsx.ts

-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ export async function restoreJSX(
2727
code: string,
2828
filename: string
2929
): Promise<RestoredJSX> {
30-
// Avoid parsing the optimized react-dom since it will never
31-
// contain compiled JSX and it's a pretty big file (800kb).
32-
if (filename.includes('/.vite/react-dom.js')) {
33-
return jsxNotFound
34-
}
35-
3630
const [reactAlias, isCommonJS] = parseReactAlias(code)
3731

3832
if (!reactAlias) {

packages/vite/src/node/__tests__/plugins/import.spec.ts

+10-10
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { describe, expect, test } from 'vitest'
22
import { transformCjsImport } from '../../plugins/importAnalysis'
33

44
describe('transformCjsImport', () => {
5-
const url = './node_modules/.vite/react.js'
5+
const url = './node_modules/.vite/deps/react.js'
66
const rawUrl = 'react'
77

88
test('import specifier', () => {
@@ -14,7 +14,7 @@ describe('transformCjsImport', () => {
1414
0
1515
)
1616
).toBe(
17-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
17+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
1818
'const useState = __vite__cjsImport0_react["useState"]; ' +
1919
'const Component = __vite__cjsImport0_react["Component"]'
2020
)
@@ -24,7 +24,7 @@ describe('transformCjsImport', () => {
2424
expect(
2525
transformCjsImport('import React from "react"', url, rawUrl, 0)
2626
).toBe(
27-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
27+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
2828
'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react'
2929
)
3030

@@ -36,7 +36,7 @@ describe('transformCjsImport', () => {
3636
0
3737
)
3838
).toBe(
39-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
39+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
4040
'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react'
4141
)
4242
})
@@ -45,7 +45,7 @@ describe('transformCjsImport', () => {
4545
expect(
4646
transformCjsImport('import * as react from "react"', url, rawUrl, 0)
4747
).toBe(
48-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
48+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
4949
'const react = __vite__cjsImport0_react'
5050
)
5151
})
@@ -69,7 +69,7 @@ describe('transformCjsImport', () => {
6969
0
7070
)
7171
).toBe(
72-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
72+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
7373
'const useState = __vite__cjsImport0_react["useState"]; ' +
7474
'const Component = __vite__cjsImport0_react["Component"]; ' +
7575
'export { useState, Component }'
@@ -83,7 +83,7 @@ describe('transformCjsImport', () => {
8383
0
8484
)
8585
).toBe(
86-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
86+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
8787
'const useStateAlias = __vite__cjsImport0_react["useState"]; ' +
8888
'const ComponentAlias = __vite__cjsImport0_react["Component"]; ' +
8989
'export { useStateAlias, ComponentAlias }'
@@ -94,7 +94,7 @@ describe('transformCjsImport', () => {
9494
expect(
9595
transformCjsImport('export { default } from "react"', url, rawUrl, 0)
9696
).toBe(
97-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
97+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
9898
'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' +
9999
'export default __vite__cjsExportDefault_0'
100100
)
@@ -107,7 +107,7 @@ describe('transformCjsImport', () => {
107107
0
108108
)
109109
).toBe(
110-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
110+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
111111
'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' +
112112
'export { React }'
113113
)
@@ -120,7 +120,7 @@ describe('transformCjsImport', () => {
120120
0
121121
)
122122
).toBe(
123-
'import __vite__cjsImport0_react from "./node_modules/.vite/react.js"; ' +
123+
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
124124
'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react["Component"]; ' +
125125
'export default __vite__cjsExportDefault_0'
126126
)

0 commit comments

Comments
 (0)