Solid Content Scripts
CRXJS brings an authentic Vite HMR experience to content scripts. Let's add a Solid content script to your Chrome Extension.
A content script is JavaScript from a Chrome Extension that the browser executes on a designated web page. The page where the script runs is called the host page. The content script shares the DOM with the host page but has a separate JavaScript environment.
Add a content script
We declare content scripts with a list of JavaScript files and match patterns
for the pages where Chrome should execute our content script. In
manifest.json
, create the field content_scripts
with an array of objects:
{
// other fields...
"content_scripts": [
{
"js": ["src/content.jsx"],
"matches": ["https://www.google.com/*"]
}
]
}
Here we're telling Chrome to execute src/content.jsx
on all pages that start
with https://www.google.com
.
Create the root element
Content scripts don't use an HTML file, so we need to create our root element and append it to the DOM before mounting our Solid app.
import { render } from 'solid-js/web';
import './index.css';
import App from './App';
render(
() => <App />,
// this element doesn't exist
document.getElementById('root')
);
Let's add that root element. Make a copy of src/index.jsx
and name it
src/content.jsx
. Add the highlighted code.
import { render } from 'solid-js/web';
import './index.css';
import App from './App';
const root = document.createElement('div')
root.id = 'crx-root'
document.body.append(root)
render(
() => <App />,
root
);
Get the right URL
Content scripts share the origin of the page where they run.
The browser treats the imported value logo
as a URL from the host page. If the
content script is running on https://google.com
, the img
tag will
try to load from https://google.com/logo.svg
.
Images first must be specified in the web_accessible_resources
field in your manifest.json
file:
"web_accessible_resources": [
{
"resources": [ "icons/*.png"],
"matches": []
}
]
Then you reference the image in your content script using the chrome.runtime.getURL method:
<img
src={chrome.runtime.getURL('icons/logo.png')}
className='App-logo'
alt='logo'
/>