Я только начал изучать React и пытался создать расширение для Chrome, используя его. Я пытаюсь создать расширение с кнопкой, onClick которой будет выделять определенные слова на веб-странице. Я могу выделить слова в контенте, который я представляю на странице, но не в том контенте, который уже присутствует на странице
Вот код, который я придумал -
На всплывающем HTML есть кнопка с классом highlight-hazardous-words
popup.js (всплывающее окно расширений):
window.onload = () => {
const $highlightHazardousButton = document.querySelector('.highlight-hazardous-words');
$highlightHazardousButton.onclick = () => {
// Get active tab
chrome.tabs.query({
active: true,
currentWindow: true,
}, (tabs) => {
// Send message to script file
chrome.tabs.sendMessage(
tabs[0].id,
{ injectApp: true },
response => window.close()
);
});
};
};
main.js (здесь находится основное содержимое приложения React):
import React from 'react';
import ReactDOM from 'react-dom';
import Highlighter from "react-highlight-words"
class HighlightHazardous extends React.Component {
constructor(props) {
super(props);
this.state = {searchWords : this.props.searchWords, textToHighlight : this.props.textToHighlight}
}
render() {
return (
<Highlighter
highlightClassName = "highlighted-text"
searchWords = {this.state.searchWords}
autoEscape = {true}
textToHighlight = {document.body.innerText}
/>
)
}
}
// Message Listener function
chrome.runtime.onMessage.addListener((request, sender, response) => {
// If message is injectApp
if (request.injectApp) {
// Inject our app to DOM and send response
injectApp();
response({
startedExtension: true,
});
}
});
function injectApp() {
const newDiv = document.createElement("div");
newDiv.setAttribute("id", "chromeExtensionReactApp");
document.body.appendChild(newDiv);
ReactDOM.render(<HighlightHazardous searchWords = {['hazardous', 'alcoholic']}/>, newDiv);
}
Здесь добавленный newDiv выделил слова по всему телу страницы, я хочу выделить опасные или алкогольные напитки в любом месте на любой веб-странице, а не в новом div, в основном, я не хочу вводить этот новый div и изменять содержимое страницы уже присутствует.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Единственный способ получить доступ к содержимому DOM веб-страницы - использовать компонент Content Scripts, где Расширения Chrome использует сценарии содержимого для упоминания файла JS и CSS в manifest.json, который необходимо внедрить на нижележащую страницу.
Как указано ниже:
The problem with our
create-react-appis that the build step will generate the output JS file in different name each time (if the content changed). So we have no way to know the actual file name of the JS file, hence we can’t mention it in our manifest.json file.
Обходной путь для этого - извлечь из create-react-app и вручную изменить конфигурацию веб-пакета, чтобы создать отдельную точку входа для сценария содержимого.
Источники:
И еще один вариант заключается в том, что вы можете перепрограммировать свою сборку, чтобы предотвратить разделение кода (и дать выходному JS-файлу статическое имя), как описано здесь: mtm.dev/disable-code-splitting-create-react-app
Этот ответ все еще верен?
Другой вариант - внедрить iframe в DOM и загрузить
index.htmlреагирующего приложения во фрейм.