【发布时间】:2020-08-28 04:01:52
【问题描述】:
首先链接到回购:https://github.com/vmarchesin/react-konami-code
您应该能够构建它(确保取消注释src/index.js 上的导出)并链接到您的项目。也可以使用npm i -S react-konami-code@2.0.0-beta.0 进行尝试并获取钩子的错误。我把 2.0.0-beta.1 的钩子去掉了,因为它坏了。
问题描述
我为我的 npm 模块创建了一个自定义钩子,但在发布或将其用作模块后它不起作用。我怀疑问题在于 webpack 如何捆绑它,但我无法解决它。
采取的步骤
- 我确保在我的 webpack 配置中将
react和react-dom声明为外部变量。
externals: [
{
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react',
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom',
},
},
],
- 在
package.json中将react和react-dom声明为peerDependencies
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
- 挂钩正在工作。如果我声明并使用它,它就可以工作。如果我从模块中导入它(或使用 npm 链接),它不会。这是钩子的代码:
import { useEffect, useState, useCallback } from 'react';
export default (action, {
code = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65],
} = {}) => {
const [input, setInput] = useState([]);
const onKeyUp = useCallback(
(e) => {
const newInput = input;
newInput.push(e.keyCode);
newInput.splice(-code.length - 1, input.length - code.length);
setInput(newInput);
if (newInput.join('').includes(code.join(''))) {
action();
}
},
[input, setInput, code, action],
);
useEffect(() => {
document.addEventListener('keyup', onKeyUp);
return () => {
document.removeEventListener('keyup', onKeyUp);
};
}, [onKeyUp]);
};
- 我没有在类组件中调用钩子。
我正在使用webpack@4.43.0 以及babel@7 和babel-loader@8.1.0。
这是我为 webpack 构建导出索引文件的方式:
import Konami from './Konami';
export default Konami; // disregard this, it works
export { default as useKonami } from './useKonami'; // this doesn't work
这是screenshot 和错误记录:
未处理的运行时错误错误:无效的挂钩调用。钩子只能是 在函数组件的主体内部调用。这可能发生 出于以下原因之一:
- 您可能有不匹配的 React 版本和渲染器(例如 React DOM)
- 您可能违反了 Hooks 规则
- 您可能在同一个应用中拥有多个 React 副本
【问题讨论】:
-
我尝试了github.com/facebook/react/issues/16029 提供的大多数解决方案,但没有任何效果。
-
你能解决这个问题吗,因为我也遇到了同样的错误。
-
@Optimus 如果仍然需要,请在下面尝试我的答案。
标签: reactjs npm webpack react-hooks babeljs