@vitejs/plugin-react 4.4.0-beta.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -94,6 +94,16 @@ This option does not enable _code transformation_. That is handled by esbuild.
94
94
 
95
95
  Here's the [complete list of Babel parser plugins](https://babeljs.io/docs/en/babel-parser#ecmascript-proposalshttpsgithubcombabelproposals).
96
96
 
97
+ ### reactRefreshHost
98
+
99
+ The `reactRefreshHost` option is only necessary in a module federation context. It enables HMR to work between a remote & host application. In your remote Vite config, you would add your host origin:
100
+
101
+ ```js
102
+ react({ reactRefreshHost: 'http://localhost:3000' })
103
+ ```
104
+
105
+ Under the hood, this simply updates the React Fash Refresh runtime URL from `/@react-refresh` to `http://localhost:3000/@react-refresh` to ensure there is only one Refresh runtime across the whole application. Note that if you define `base` option in the host application, you need to include it in the option, like: `http://localhost:3000/{base}`.
106
+
97
107
  ## Middleware mode
98
108
 
99
109
  In [middleware mode](https://vite.dev/config/server-options.html#server-middlewaremode), you should make sure your entry `index.html` file is transformed by Vite. Here's an example for an Express server:
package/dist/index.cjs CHANGED
@@ -17,7 +17,7 @@ window.$RefreshReg$ = () => {};
17
17
  window.$RefreshSig$ = () => (type) => type;`;
18
18
  const getPreambleCode = (base) => preambleCode.replace("__BASE__", base);
19
19
  const avoidSourceMapOption = Symbol();
20
- function addRefreshWrapper(code, map, pluginName, id) {
20
+ function addRefreshWrapper(code, map, pluginName, id, reactRefreshHost = "") {
21
21
  const hasRefresh = refreshContentRE.test(code);
22
22
  const onlyReactComp = !hasRefresh && reactCompRE.test(code);
23
23
  const normalizedMap = map === avoidSourceMapOption ? null : map;
@@ -58,7 +58,7 @@ if (import.meta.hot && !inWebWorker) {
58
58
  }
59
59
  }
60
60
  const sharedHead = removeLineBreaksIfNeeded(
61
- `import * as RefreshRuntime from "${runtimePublicPath}";
61
+ `import * as RefreshRuntime from "${reactRefreshHost}${runtimePublicPath}";
62
62
  const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
63
63
 
64
64
  `,
@@ -190,7 +190,10 @@ function viteReact(opts = {}) {
190
190
  { skipEnvCheck: true }
191
191
  ]);
192
192
  }
193
- if (opts.jsxRuntime === "classic" && isJSX) {
193
+ if (opts.jsxRuntime === "classic" && isJSX && // OXC injects self and source so these plugins are not needed for rolldown-vite
194
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
195
+ // @ts-ignore -- this.meta.rolldownVersion only exists in rolldown-vite
196
+ !this.meta.rolldownVersion) {
194
197
  if (!isProduction) {
195
198
  plugins.push(
196
199
  await loadPlugin("@babel/plugin-transform-react-jsx-self"),
@@ -241,7 +244,8 @@ function viteReact(opts = {}) {
241
244
  result.code,
242
245
  result.map,
243
246
  "@vitejs/plugin-react",
244
- id
247
+ id,
248
+ opts.reactRefreshHost
245
249
  );
246
250
  }
247
251
  }
package/dist/index.d.cts CHANGED
@@ -21,6 +21,14 @@ interface Options {
21
21
  babel?: BabelOptions | ((id: string, options: {
22
22
  ssr?: boolean;
23
23
  }) => BabelOptions);
24
+ /**
25
+ * React Fast Refresh runtime URL prefix.
26
+ * Useful in a module federation context to enable HMR by specifying
27
+ * the host application URL in the Vite config of a remote application.
28
+ * @example
29
+ * reactRefreshHost: 'http://localhost:3000'
30
+ */
31
+ reactRefreshHost?: string;
24
32
  }
25
33
  type BabelOptions = Omit<TransformOptions, 'ast' | 'filename' | 'root' | 'sourceFileName' | 'sourceMaps' | 'inputSourceMap'>;
26
34
  /**
package/dist/index.d.mts CHANGED
@@ -21,6 +21,14 @@ interface Options {
21
21
  babel?: BabelOptions | ((id: string, options: {
22
22
  ssr?: boolean;
23
23
  }) => BabelOptions);
24
+ /**
25
+ * React Fast Refresh runtime URL prefix.
26
+ * Useful in a module federation context to enable HMR by specifying
27
+ * the host application URL in the Vite config of a remote application.
28
+ * @example
29
+ * reactRefreshHost: 'http://localhost:3000'
30
+ */
31
+ reactRefreshHost?: string;
24
32
  }
25
33
  type BabelOptions = Omit<TransformOptions, 'ast' | 'filename' | 'root' | 'sourceFileName' | 'sourceMaps' | 'inputSourceMap'>;
26
34
  /**
package/dist/index.d.ts CHANGED
@@ -21,6 +21,14 @@ interface Options {
21
21
  babel?: BabelOptions | ((id: string, options: {
22
22
  ssr?: boolean;
23
23
  }) => BabelOptions);
24
+ /**
25
+ * React Fast Refresh runtime URL prefix.
26
+ * Useful in a module federation context to enable HMR by specifying
27
+ * the host application URL in the Vite config of a remote application.
28
+ * @example
29
+ * reactRefreshHost: 'http://localhost:3000'
30
+ */
31
+ reactRefreshHost?: string;
24
32
  }
25
33
  type BabelOptions = Omit<TransformOptions, 'ast' | 'filename' | 'root' | 'sourceFileName' | 'sourceMaps' | 'inputSourceMap'>;
26
34
  /**
package/dist/index.mjs CHANGED
@@ -14,7 +14,7 @@ window.$RefreshReg$ = () => {};
14
14
  window.$RefreshSig$ = () => (type) => type;`;
15
15
  const getPreambleCode = (base) => preambleCode.replace("__BASE__", base);
16
16
  const avoidSourceMapOption = Symbol();
17
- function addRefreshWrapper(code, map, pluginName, id) {
17
+ function addRefreshWrapper(code, map, pluginName, id, reactRefreshHost = "") {
18
18
  const hasRefresh = refreshContentRE.test(code);
19
19
  const onlyReactComp = !hasRefresh && reactCompRE.test(code);
20
20
  const normalizedMap = map === avoidSourceMapOption ? null : map;
@@ -55,7 +55,7 @@ if (import.meta.hot && !inWebWorker) {
55
55
  }
56
56
  }
57
57
  const sharedHead = removeLineBreaksIfNeeded(
58
- `import * as RefreshRuntime from "${runtimePublicPath}";
58
+ `import * as RefreshRuntime from "${reactRefreshHost}${runtimePublicPath}";
59
59
  const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
60
60
 
61
61
  `,
@@ -187,7 +187,10 @@ function viteReact(opts = {}) {
187
187
  { skipEnvCheck: true }
188
188
  ]);
189
189
  }
190
- if (opts.jsxRuntime === "classic" && isJSX) {
190
+ if (opts.jsxRuntime === "classic" && isJSX && // OXC injects self and source so these plugins are not needed for rolldown-vite
191
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
192
+ // @ts-ignore -- this.meta.rolldownVersion only exists in rolldown-vite
193
+ !this.meta.rolldownVersion) {
191
194
  if (!isProduction) {
192
195
  plugins.push(
193
196
  await loadPlugin("@babel/plugin-transform-react-jsx-self"),
@@ -238,7 +241,8 @@ function viteReact(opts = {}) {
238
241
  result.code,
239
242
  result.map,
240
243
  "@vitejs/plugin-react",
241
- id
244
+ id,
245
+ opts.reactRefreshHost
242
246
  );
243
247
  }
244
248
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitejs/plugin-react",
3
- "version": "4.4.0-beta.1",
3
+ "version": "4.4.0",
4
4
  "license": "MIT",
5
5
  "author": "Evan You",
6
6
  "description": "The default Vite plugin for React projects",
@@ -48,11 +48,11 @@
48
48
  },
49
49
  "homepage": "https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#readme",
50
50
  "dependencies": {
51
- "@babel/core": "^7.26.0",
51
+ "@babel/core": "^7.26.10",
52
52
  "@babel/plugin-transform-react-jsx-self": "^7.25.9",
53
53
  "@babel/plugin-transform-react-jsx-source": "^7.25.9",
54
54
  "@types/babel__core": "^7.20.5",
55
- "react-refresh": "^0.14.2"
55
+ "react-refresh": "^0.17.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"