【发布时间】:2022-07-01 19:31:31
【问题描述】:
我有一个现有的 React 17 应用程序,它以带有 TypeScript 选项的 create-react-app 输出开始。我想更改 package.json 以包含 react@18.0.0 和 react-dom@18.0.0 然后启动应用程序,这一步工作正常。
然后我尝试按照 React 18 迁移说明告诉您的方式更改 index.tsx 文件,方法是将 index.tsx 中的相关段更改为:
ReactDOM.createRoot(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
npm run build 或 npm run start 给我编译错误,说 createRoot 没有定义。这可能是因为我依赖于@types/react@17.0.43 和@types/react-dom@17.0.14。对于 React 18,DefinitelyTyped 中的这些文件似乎还没有任何更新版本。
所以,我回去用npx create-react-app react18 --template typescript 创建了一个全新的应用程序。它现在需要react@18 和react-dom@18,但仍然有旧的@types/ 依赖项。当您从 render() 切换到 createRoot() 时,它也会给出相同的编译错误。
作为进一步的步骤,我问自己“如果我们省略 TypeScript 会发生什么?”使用npx create-react-app react18js 创建了另一个应用程序。正如预期的那样,它依赖于react@18.0.0 和react-dom@18.0.0,但仍会在其index.js 输出中生成ReactDOM.render()。
这可行,但将ReactDOM.render 更改为ReactDOM.createRoot 不会出现编译错误,但如果尝试npm run start,也不会出现可见输出。它似乎根本没有渲染 <App/> 组件。
我错过了什么吗?说明还不够充分吗?
【问题讨论】:
-
可以尝试在原始文件中删除并重新生成您的 package-lock.json 文件。
-
请注意,这实际上并不是您使用 createRoot 的方式:reactjs.org/blog/2022/03/08/…。
-
@Ross 试过了,也删除了 node_modules -- 没有变化。
-
@jonrsharpe - 将逻辑更改为此使其在 JS 版本中工作。在打字稿版本中,构建仍然失败,并在导入时显示“TS2305:模块'“react-dom”'没有导出的成员'createRoot'”。
-
不,它没有。正确的导入来自
"react-dom/client",它是:github.com/DefinitelyTyped/DefinitelyTyped/blob/…
标签: reactjs typescript