我一直在尝试使用 rollup 捆绑一个简单的 React 应用程序。根据最近的合并(10 月 2 日),他们使用配置中的 jsx 选项将 jsx 转译添加到 js 作为核心功能。 我在 React 应用程序上使用了它,当从浏览器中的 html 文件导入时,我得到的包将无法工作。 以下是我的 rollup.config.mjs 文件的内容:
import {nodeResolve} from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
export default [
{
input: 'main.jsx',
output: {
file: 'bundle.js',
format: 'esm',
exports: 'named',
name: 'theBundle',
},
jsx: true,
plugins: [
nodeResolve(),
commonjs(),
]
}
];
我的 main.jsx 文件:
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.jsx";
createRoot(document.getElementById('root')).render(
<StrictMode>
<App/>
</StrictMode>
);
我的App.jsx文件:
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.jsx";
createRoot(document.getElementById('root')).render(
<StrictMode>
<App/>
</StrictMode>
);
以及我使用 VS Code 的实时服务器插件访问的 index-prod.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>React + Rollup</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="./bundle.js"></script>
</body>
</html>
在浏览器上访问该页面时,我在控制台中收到以下错误消息:
Uncaught ReferenceError: process is not defined
requireReact http://127.0.0.1:5500/bundle.js:2772
<anonymous> http://127.0.0.1:5500/bundle.js:2780
最后这是 npm list 的输出:
rollup-tut@ C:\rollup-demo
├── @babel/[email protected]
├── @rollup/[email protected]
├── @rollup/[email protected]
├── @rollup/[email protected]
├── @rollup/[email protected]
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected]
bundle.js
中有几个地方尝试访问变量process.env
。但这仅在节点环境 AFAIK 的上下文中才有可能。
那么如何将浏览器的 React 应用程序与汇总开发人员添加的这个新 jsx 选项正确捆绑在一起?或者如果这是不可能的,你能告诉我常规方法,使用 babel 等吗?我似乎找不到任何最新信息。
我尝试将汇总配置中的 jsx 设置为“react”和“react-jsx”,但结果是相同的。
我解决了这个问题,对于任何想知道如何解决的人,这里是新的汇总配置:
import {nodeResolve} from '@rollup/plugin-node-resolve';
import commonjs from "@rollup/plugin-commonjs";
import replace from '@rollup/plugin-replace';
export default [
{
input: 'main.jsx',
output: {
file: 'bundle.js',
format: 'esm',
name: 'theBundle',
},
jsx: 'react-jsx',
plugins: [
nodeResolve(),
commonjs(),
replace({
preventAssignment: true,
values: {
'process.env.NODE_ENV': JSON.stringify('production'),
}
}),
]
}
];
您需要安装 rollup 替换插件(撰写本文时为 npm i --save-dev @rollup/plugin-replace)并将 jsx 选项设置为“react-jsx”。 替换插件将替换 process.env.NODE_ENV 变量,从而消除错误。