This article was original posted on myweekinjsThis week I set out to create a chrome extension and utilise JavaScript and React to inject a component into a website. The result is a beautiful combination of Mutation Observers and JavaScript goodness!
The code can be found on Github
Lets get ready!
To start, I downloaded a starter for a chrome extension from the Chrome Developer website. If you want to learn the basics of extension development, I definitely recommend looking at the website. I immediately deleted theoptions.js, options.html, and popup.js files. In the manifest.json file I removed the options_page key as well as the storage value from the permissions array. Next, you want to add https://www.myweekinjs.com/ to the permissions array.
I will be referencing myweekinjs a few times, this could be any website that you wish to inject a React component into.
Next, I created an app.js with a simple console.log to test that the script works, and updated the background.js to;
background.js script will do the following;
- Listen for page/tab changes
- Check if the current page is (http|https)://www.myweekinjs.com/inject-me
- If it is, it will load our
app.jsfile
Let’s get scripting!
Next step is to create ourwebpack.config.js file to compile our React and Javascript. At this point, I’d recommend creating a dist folder with the current files (minus the app.js), and unpacking that folder as our extension. This way you can compile into this dist folder and won’t include your node_modules into the extension.
We’ll use this awesome resource to generate our webpack and .babelrc files createapp.dev
- Open the resource ^
- Check React, Babel. Uncheck React hot loader
- Run
npm init -yand install the packages outlined by the resource - Copy the
webpack.config.jsand.babelrcfiles into your project - Copy the
scriptsfrom thepackage.json
webpack.config.js change the entry and output settings;
build-dev script to;
.babelrc, they should be easy to fix though, mainly issues about using double quotes.
Running the build-prod script will compile the app.js file. After a unpack and reload, you should be greeted with the same console.log as before. A long process to get where we were, but now things get interesting!
Let’s get appy!
We want our app to do a few things;- Wait for the page to load completely
- Watch for mutations on a target container
- Insert our React root
- Render a React component
load and contains our main callback function which I called app.
Step 1 is done! Onwards!
Next, we’ll be adding a Mutation Observer which gives us the superpower to watch for changes in the DOM tree. It is pretty sweet. For our project, we are going to be observing thetarget-test div on our test page. The following code is added to the load callback.
Lets get reacting!
Now that we have our React root we can finally create and render our component. I will just be creating a simple React component in the same file. However, you can create any component you choose to, it is up to you! Once you’ve added your component, unpack your extension and reload the test page and you should see the component appear!BOOM!
We did it! This is only scratching the surface of what you are able to do with chrome extensions and using React. Using the same technique, you’ll be able to add features to websites. Similar to extensions like Grammarly or LastPass. The possibilities are almost endless!Wrapping up
This was a pretty cool project I think. I definitely didn’t think something like this was possible with chrome extensions. Using the Mutation Observer for this example may be overkill. However, when you encounter a website that dynamically renders content, being able to wait until the content you need is ready is super cool! If you have any questions about the code or process please reach out to me over Twitter, I’d love to keep talking about this and improving my code.👋 until next time!
Read my latest 'paper'
These 'papers' are bigger articles I write on topics around development and how to do it better.Module Driven Development
Discover the benefits of Module-Driven Development (MDD) in software development. Learn how MDD can improve the efficiency, reliability, and maintainability of large and complex systems. Read the article now to find out how your organization can benefit from MDD.