How to build a Chrome Extension
Tags: javascript, react, webdev
Published: 2020-09-27 15:11:38

# Chrome Extension Manifest Version 3 is out now!

Go check out our [CHROME EXTENSION V3](https://anobjectisa.wixsite.com/website "CHROME EXTENSION V3") course for easy to follow video lessons.

If you sign up for our [newsletter](https://mailchi.mp/0229e1903ef8/upgrade-to-chrome-extension-v3 "newsletter"), **you can get 20% off the purchase price!**

----------------

#**There are 5 parts to a Chrome extension**
1. the manifest file
2. the background script
3. the foreground script
4. the popup page
5. the options page

. . .

##**1.**
###**Everything begins with the 'manifest.json' file.**

How, where, and when our extension interacts with the user's browser, is all contained within the manifest.

The manifest establishes the name, version, and description of our chrome extension as well as the background script, popup and options pages.

It also establishes where we can inject foreground scripts (*more on that later...*).

```
{
    "name": "obj ext",
    "description": "my ext",
    "version": "0.1.0",
    "manifest_version": 2,
    "icons": {
        "16": "./obj-16x16.png",
        "32": "./obj-32x32.png",
        "48": "./obj-48x48.png",
        "128": "./obj-128x128.png"
    },
    "background": {
        "scripts": ["./background.js"]
    },
    "options_page": "./options.html",
    "browser_action": {
        "default_popup": "popup.html"
    },
    "permissions": [
        "tabs",
        "https://www.google.com/*",
        "storage"
    ] 
}
```
&nbsp;
&nbsp;
##**2.**
###**The background script ('background.js') is a JavaScript script that runs once our extension either gets installed or the user refreshes the extension manually.**
&nbsp;
***THIS IS CRUCIAL TO NOTE***
The background script doesn't actually have access to any of the webpages your user is viewing, so your background script can't manipulate the **DOM**.

>So how do we get our chrome extension to do stuff on the user's webpage then?

**That's where the foreground script comes in.**

Our background script has the ability to inject foreground scripts, as well as CSS if you want, into the page.

This is how we can manipulate the **DOM** of a webpage with a Chrome Extension.

>How do we inject our foreground script into the foreground?

**In the background.js script...**

```
let active_tab_id = 0;

chrome.tabs.onActivated.addListener(tab => {
    chrome.tabs.get(tab.tabId, current_tab_info => {
        active_tab_id = tab.tabId;

        if (/^https:\/\/www\.google/.test(current_tab_info.url)) {
            chrome.tabs.insertCSS(null, { file: './mystyles.css' });
            chrome.tabs.executeScript(null, { file: './foreground.js' }, () => console.log('i injected'))
        }
    });
});
```
...where we have a listener watching what we do with our tabs.
If the current tab we're on is the Google homepage, we inject our script into that tab.

The '**null**' indicates the current tab we're viewing.
&nbsp;
From there, our foreground.js script acts like any other script influencing an index.html page.
*We have access to the window and document(DOM).*
&nbsp;
We can make the Google homepage's logo spin if we wanted to.
&nbsp;
&nbsp;
##**3.**
###**In the 'foreground.js' we write...**

```
document.querySelector('#hplogo').classList.add('spinspinspin');
```

...in the '**mystyles.css**' we write...

```
.spinspinspin {
    animation-name: spin;
    animation-duration: 1.0s;
    animation-iteration-count: infinite;
}

@keyframes spin {
    0% {
        transform: rotate(0deg);
    }
    100% {
        transform: rotate(1440deg);
    }
}
```
&nbsp;
...and just like that, when we navigate to the Google homepage, our foreground script injects and that logo will spin.
&nbsp;
&nbsp;
##**4.**
###**The 'popup.html' page is optional.**

The popup page is what shows when the user clicks on our extension icon in the top right.
It's an html page with a script attached if you want.

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>I'm the popup</h1>
    <script></script>
</body>
</html>
```
&nbsp;
##**5.**
###**The 'options.html' page is just like the popup page.**

It's what the user sees when they navigate to their extensions tab and click for the options.
It's also an html page with a script attached if you want.

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>I'm the options</h1>
    <script></script>
</body>
</html>
```

. . .


So it's this relationship between the background and foreground--just like a front-end and back-end--that ties a **Google Chrome Extension** together.
&nbsp;
If you want to check out a more in-depth guide, including how the foreground communicates with the background as well as state management in a Chrome Extension, check out my full video tutorial on YouTube, **An Object Is A**.


###**How To Build A Chrome Extension (2020 Web Development)**
{% youtube -dhMbVEreII %}

. . .
&nbsp;
####Ready to tackle React Chrome Extensions?
Check it out here: 
{% link https://dev.to/anobjectisa/build-a-chrome-extension-using-reactjs-38o7 %}