Ras*_*mon 7 javascript npm reactjs webpack package.json
我正在本地开发一个 React 模块。为此,我正在使用npm link. 模块已成功导入,但模块内部的挂钩失败。它抛出以下错误:
无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一而发生的: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本同一个应用程序 请参阅https://reactjs.org/link/invalid-hook-call以获取有关如何调试和解决此问题的提示。
检查React docs 中的建议,我可以确认我的应用程序正在使用 React 的重复版本,因为以下代码返回 false:
// node_modules/mymodule/src/index.js
export { default as ReactFromModule } from 'react'
Run Code Online (Sandbox Code Playgroud)
// src/index.js
import React from 'react'
import { ReactFromModule } from 'mymodule'
console.log(React === ReactFromModule) //false
Run Code Online (Sandbox Code Playgroud)
这个问题充满了建议,但它们令人困惑。我该如何解决?
注意:我没有违反钩子规则,错误仅在从应用程序导入模块时出现。
Ras*_*mon 32
在您正在开发的模块中,将冲突的包添加到(并从或 中peerDependencies删除它们):dependenciesdevDependencies
// package.json
"peerDependencies": {
"react": "16.13.1",
"react-dom": "16.13.1"
},
Run Code Online (Sandbox Code Playgroud)
npm install在您的模块中执行。
现在将react和添加到模块react-dom的 webpack 配置中。这些包不应包含在模块的捆绑包中(使用该模块的应用程序将提供它们):externals
// webpack.config.js
module.exports = {
/*
rest of config...
*/
output: {
filename: "index.js",
pathinfo: false,
libraryTarget: 'umd', // In my case, I use libraryTarget as 'umd'. Not sure if relevant
},
externals: {
// Use external version of React
"react": {
"commonjs": "react",
"commonjs2": "react",
"amd": "react",
"root": "React"
},
"react-dom": {
"commonjs": "react-dom",
"commonjs2": "react-dom",
"amd": "react-dom",
"root": "ReactDOM"
}
},
};
Run Code Online (Sandbox Code Playgroud)
然后,在构建模块后,您可以在应用程序中检查两个版本现在是否相同:
// node_modules/mymodule/src/index.js
export { default as ReactFromModule } from 'react'
Run Code Online (Sandbox Code Playgroud)
// src/index.js
import React from 'react'
import { ReactFromModule } from 'mymodule'
console.log(React === ReactFromModule) // true :)
Run Code Online (Sandbox Code Playgroud)
L. *_*rto 19
添加reactandreact-dom一样对我peerDependencies不起作用package.json。
我必须向 webpack 配置文件添加一个别名:
// webpack.config.js
resolve: {
alias: {
react: path.resolve('./node_modules/react'),
}
Run Code Online (Sandbox Code Playgroud)
作为对另一条评论的回应,仅仅将 React 移至对等依赖项并不能充分解决所有情况下的问题。我会直接回复该评论,但 StackOverflow 需要更高的声誉才能回复错误答案,而不是发布错误答案。
我有一个使用 Webpack 构建的共享 React 组件模块,并且遇到了同样的问题。我在下面的评论中概述了一个可能的修复方法,该修复方法需要修改 peerDependency 并以类似于 mtkopone 共享的答案的方式使用 npm 链接。 https://github.com/facebook/react/issues/13991#issuecomment-841509933
我的解决方案有点老套,我不建议长期使用它。如果您正在使用 Webpack(您将这个问题标记为),本文可能会详细介绍更永久的解决方案(https://medium.com/codex/duplicate-copy-of-react-errors-when-using-npm-link -e5011de0995d)。我还没有尝试过,但作者似乎已经尝试了所有(不正确的)解决方案,并且在尝试构建共享组件库时也遇到了钩子问题。
该文章的作者正在尝试调试 Create-React-App 应用程序。虽然 CRA 在底层使用 webpack,但您无法直接访问 webpack.config,因此作者必须执行一些解决方法才能做到这一点。如果您不使用 CRA,而只是使用普通 Webpack,那么您可以考虑使用 webpack.config 的resolve.alias 部分来确保没有 React 的重复副本(请参阅: https: //blog.maximeheckel.com/posts /重复依赖项-npm-link/ )
| 归档时间: |
|
| 查看次数: |
4512 次 |
| 最近记录: |