Chrome 上浏览器扩展内容脚本的 ReactJS 渲染问题
ReactJS Render issue for Browser Extension Content Scripts on Chrome
我制作了一个浏览器扩展,它将 iframe 注入到 DOM 中,其中包含一些 html。我一直在尝试将 React 组件呈现到 iframe 中,但它不会呈现,并且我收到以下错误 Invariant Violation: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
我尝试过渲染到 iframe,甚至通过内容脚本直接渲染到 DOM,但我仍然遇到同样的问题。我知道正在调用组件的渲染函数,因为我在其中放置了一个 console.log 并显示了消息;我也调试过它,断点在渲染函数中停止。此外,我添加了生命周期方法 componentWillUpdate
和 componentDidUpdate
,但它们甚至都没有被调用。
//Index.jsx
import React from "react";
import ReactDOM from "react-dom";
class Index extends React.Component{
constructor(props){
super(props);
}
componentWillUpdate(){
console.log('componentWillUpdate');
}
componentDidUpdate(){
console.log('componentDidUpdate');
}
render() {
console.log('render');
return <div>Hello!</div>;
}
}
ReactDOM.render(<Index/>, document.getElementById("g-root"))
// Including this code to show how I was adding the react component to the DOM if it is loaded immediately via manifest.json
// const app = document.createElement('div');
// app.id = "g-root";
// document.body.appendChild(app);
// ReactDOM.render(<Index />, app);
//webpack.config
const path = require('path');
module.exports = (env, args) => {
return {
mode,
devtool,
entry: {
react: path.join(__dirname, './Index.jsx')
},
module: {
rules: [{
test: /\.jsx$/,
use: {
loader: 'babel-loader',
options: {
presets: ['env', 'react', 'es2015']
}
}
}]
},
output: {
path: path.join(__dirname, './'),
filename: 'react.bundle.js'
}
}
};
<!--This gets loaded into the iframe-->
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="g-root"></div>
<script src="react/react.bundle.js"></script>
</body>
</html>
//manifest.json *included just to show that it has the same issue on page load.
{
"content_scripts":
[{
"js":["react/react.bundle.js"],
"run_at": "document_end",
"matches": ["<all_urls>"]
}]
}
应该注意的是,在我开始尝试将 React 添加到项目之前,注入 iframe 和整个扩展一直运行良好。
事实证明这是一个内部库的问题,该库必须使用我的 React 组件渲染 Web 组件。
我制作了一个浏览器扩展,它将 iframe 注入到 DOM 中,其中包含一些 html。我一直在尝试将 React 组件呈现到 iframe 中,但它不会呈现,并且我收到以下错误 Invariant Violation: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
我尝试过渲染到 iframe,甚至通过内容脚本直接渲染到 DOM,但我仍然遇到同样的问题。我知道正在调用组件的渲染函数,因为我在其中放置了一个 console.log 并显示了消息;我也调试过它,断点在渲染函数中停止。此外,我添加了生命周期方法 componentWillUpdate
和 componentDidUpdate
,但它们甚至都没有被调用。
//Index.jsx
import React from "react";
import ReactDOM from "react-dom";
class Index extends React.Component{
constructor(props){
super(props);
}
componentWillUpdate(){
console.log('componentWillUpdate');
}
componentDidUpdate(){
console.log('componentDidUpdate');
}
render() {
console.log('render');
return <div>Hello!</div>;
}
}
ReactDOM.render(<Index/>, document.getElementById("g-root"))
// Including this code to show how I was adding the react component to the DOM if it is loaded immediately via manifest.json
// const app = document.createElement('div');
// app.id = "g-root";
// document.body.appendChild(app);
// ReactDOM.render(<Index />, app);
//webpack.config
const path = require('path');
module.exports = (env, args) => {
return {
mode,
devtool,
entry: {
react: path.join(__dirname, './Index.jsx')
},
module: {
rules: [{
test: /\.jsx$/,
use: {
loader: 'babel-loader',
options: {
presets: ['env', 'react', 'es2015']
}
}
}]
},
output: {
path: path.join(__dirname, './'),
filename: 'react.bundle.js'
}
}
};
<!--This gets loaded into the iframe-->
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="g-root"></div>
<script src="react/react.bundle.js"></script>
</body>
</html>
//manifest.json *included just to show that it has the same issue on page load.
{
"content_scripts":
[{
"js":["react/react.bundle.js"],
"run_at": "document_end",
"matches": ["<all_urls>"]
}]
}
应该注意的是,在我开始尝试将 React 添加到项目之前,注入 iframe 和整个扩展一直运行良好。
事实证明这是一个内部库的问题,该库必须使用我的 React 组件渲染 Web 组件。