我正在开发一个 React 应用程序,并使用了一些 npm 模块,其中一个我必须自己构建。(我的 NPM 包: https://www.npmjs.com/package/modale-react-rm)。
这是一个简单的模式,以 打开和关闭useState()。
useState()
导入我的包后,我的控制台出现一个错误,几秒钟后突然出现,没有执行任何操作。
Uncaught (in promise) localhost/:1 >{message: 'A listener indicated an asynchronous response by r…age channel closed before a response was received'} message: "A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received" >[[Prototype]]: Object >constructor: ƒ () >[[Prototype]]: Object /* sometimes there are specific elements in addition but I could not check when they appear and when not */ Promise.then (asynchrone) (anonyme) @content_script_bundle.js:108 handleNewFeatures @content_script_bundle.js:101 handleUpdatedNodes @content_script_bundle.js:101 (anonyme) @content_script_bundle.js:101 childlist(asynchrone) 0 @purplebox.js:1 (anonyme) @purplebox.js:1 v @purplebox.js:1
它不会阻止我的页面,也不会妨碍其功能的正常运行,但这是一个错误,我认为应该修复它,也许可以帮助其他遇到同样问题的人。
我指定在这个项目中不进行任何异步请求。一切都是本地的,我使用的少量数据直接以原始格式导入。我也不知道Purplebox.js是从哪里来的。
根据你的描述,控制台中的错误似乎是由异步操作引起的,但你的项目中并没有直接进行任何异步请求。这种错误可能是由第三方脚本或浏览器扩展程序引起的。下面是一些解决问题的步骤:
首先,尝试禁用所有浏览器扩展程序,看看错误是否仍然存在。浏览器扩展程序(如广告拦截器、隐私工具或自定义开发工具)可能会在页面中注入脚本并导致意外行为。
检查你的项目中的 HTML 和 JavaScript 文件,看看是否有加载 purplebox.js 或 content_script_bundle.js 的第三方脚本。
purplebox.js
content_script_bundle.js
创建一个最小可重现的示例来隔离你的 modale-react-rm 包的使用,看看问题是否仍然存在。这有助于确定问题是否出在你的包或应用程序的其他部分。
modale-react-rm
创建一个简单的 React 应用程序并测试你的模态包:
create-react-app
npm install modale-react-rm
src/App.js
import React, { useState } from 'react'; import { render } from 'react-dom'; import ModaleReact from 'modale-react-rm'; // 确保这是正确的导入 const App = () => { const [isOpen, setIsOpen] = useState(false); return ( <div> <button onClick={() => setIsOpen(true)}>Open Modal</button> {isOpen && ( <ModaleReact onClose={() => setIsOpen(false)}> <div>Your modal content</div> </ModaleReact> )} </div> ); }; render(<App />, document.getElementById('root'));
npm start
使用浏览器的开发者工具检查 content_script_bundle.js 和 purplebox.js 中错误发生的确切行。这可能会提供更多有关哪个异步操作失败的线索。
如果问题仍然存在于最小可重现示例中,那么问题可能出在你的 modale-react-rm 包中。检查你的包代码,确保没有未处理的异步操作或返回 true 但没有完成的事件监听器。
true
假设你在你的 modale-react-rm 包中发现了一个未处理的异步操作。以下是如何解决它的示例:
检查任何异步操作:在你的包中,检查所有异步操作和 useEffect 钩子。
useEffect
确保正确处理异步操作:
import React, { useState, useEffect } from 'react'; const ModaleReact = ({ onClose, children }) => { const [isOpen, setIsOpen] = useState(false); useEffect(() => { // 假设这里有一些异步操作 const fetchData = async () => { try { // 模拟异步操作 await new Promise(resolve => setTimeout(resolve, 1000)); setIsOpen(true); } catch (error) { console.error('Error fetching data', error); } }; fetchData(); return () => { console.log('Modal component unmounted'); }; }, []); return isOpen ? ( <div className="modal"> <button onClick={onClose}>Close</button> {children} </div> ) : null; }; export default ModaleReact;
通过上述步骤,你应该能够识别并修复控制台中的错误。如果问题是由外部脚本或浏览器扩展程序引起的,禁用它们通常可以解决问题。如果问题出在你的包代码中,确保所有异步操作都得到正确处理,并且没有未处理的返回值。