Create React browser extensions with no build configuration.
This is a fork of create-react-app to make creating Browser Extensions in React more accessible and following Create-React-App's(CRA) philosophy, especially convention over configuration.
- Same CRA Developer Experience for your browser extension projects (
service worker functionality) - Webpack dev server hot reloads extension on changes (NOTE: contentScript hot reloading not supported)
- Supports any combination of background, content, options and popup chrome extensions
- Automated fork watcher to stay updated with the original CRA
- Add support for automated deployments and docs to help users with what to do after having built their extension.
- Add e2e test suite similar to the original CRA and run with automated pipeline.
- Add some kind of dependency watcher (e.g. greenkeeper) to stay up to date with the dependencies that are not managed by CRA
see Create a browser extension for a more in depth start guide see CRA user guide for more information on different configurations and functionality available.
If something doesn’t work, please file an issue.
npx create-react-app my-browser-extension --scripts-version react-browser-extension-scripts --template browser-extension
cd my-browser-extension
npm start
If you've previously installed create-react-app
globally via npm install -g create-react-app
, we recommend you uninstall the package using npm uninstall -g create-react-app
to ensure that npx always uses the latest version.
(npx comes with npm 5.2+ and higher, see instructions for older npm versions)
Then open Chrome, and unpack the newly created /dev
folder to see your extension added locally to your browser.
When you’re ready to ship your extension, create an optimized build with npm run build
.
It follows mostly the same conventions as CRA.
There are different types of chrome extensions which can be any combination of:
- Popup UI which renders your
index.js
when you click on your extension in the browser extension icon. - Background script which will run in the background from
/background/index.js
and can be use for things like state-management. - Content script from
/contentScript/index.js
which will run on configured web pages - Options UI which renders your
/options/
when you click on your extension in the browser extension icon. - Dev tools page ❎ Does not support yet
These are all controlled by the all important /public/manifest.json
which is configurable by you to control what kind of extension you want build.
Do not delete any of the entry files, this is a convention to remind you what your extensions could be. The build will notify you and fail if you remove any of these important files.
You’ll need to have Node 10.16.0 or later version on your local development machine (but it’s not required on the server). We recommend using the latest LTS version. You can use nvm (macOS/Linux) or nvm-windows to switch Node versions between different projects.
To create a new browser extension, you may choose one of the following methods:
npx create-react-app my-browser-extension --scripts-version react-browser-extension-scripts --template browser-extension
(npx is a package runner tool that comes with npm 5.2+ and higher, see instructions for older npm versions)
npm init react-app my-browser-extension --scripts-version react-browser-extension-scripts --template browser-extension
npm init <initializer>
is available in npm 6+
yarn create react-app my-browser-extension --scripts-version react-browser-extension-scripts --template browser-extension
yarn create <starter-kit-package>
is available in Yarn 0.25+
It will create a directory called my-browser-extension
inside the current folder.
Inside that directory, it will generate the initial project structure and install the transitive dependencies:
my-browser-extension
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│ ├── img
│ │ ├── icon-16.png
│ │ ├── icon-48.png
│ │ ├── icon-128.png
│ ├── popup.html
│ ├── options.html
│ └── manifest.json
└── src
├── background
│ ├── index.js
├── contentScripts
│ ├── index.js
├── options
│ ├── index.js
│ ├── Options.js
├── App.css
├── App.js
├── App.test.js
├── index.css
├── index.js
├── logo.svg
No configuration or complicated folder structures, only the files you need to build your extension.
Once the installation is done, you can open your project folder:
cd my-browser-extension
Inside the newly created project, you can run some built-in commands:
Runs the browser extension in development mode. You will see a /dev
folder has been created in your project with the extension.
To view the extension in your browser, open up chrome and unpack extension.
The extension will automatically reload if you make changes to the code.
You will see the build errors and lint warnings in the console.
Runs the test watcher in an interactive mode.
By default, runs tests related to files changed since the last commit.
Builds the app for production to the build
folder.
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.
Your app is ready to be deployed.
You can find detailed instructions on using Create React App and many tips in its documentation.
Please refer to the User Guide for this and other information.
-
One Dependency: There is only one build dependency. It uses webpack, Babel, ESLint, and other amazing projects, but provides a cohesive curated experience on top of them.
-
No Configuration Required: You don't need to configure anything. A reasonably good configuration of both development and production builds is handled for you so you can focus on writing code.
-
No Lock-In: You can “eject” to a custom setup at any time. Run a single command, and all the configuration and build dependencies will be moved directly into your project, so you can pick up right where you left off.
Your environment will have everything you need to build a modern single-page React app:
- React, JSX, ES6, TypeScript and Flow syntax support.
- Language extras beyond ES6 like the object spread operator.
- Autoprefixed CSS, so you don’t need
-webkit-
or other prefixes. - A fast interactive unit test runner with built-in support for coverage reporting.
- A live development server that warns about common mistakes.
- A build script to bundle JS, CSS, and images for production, with hashes and sourcemaps.
- An offline-first service worker and a web app manifest, meeting all the Progressive Web App criteria. (Note: Using the service worker is opt-in as of
react-scripts@2.0.0
and higher) - Hassle-free updates for the above tools with a single dependency.
Check out this guide for an overview of how these tools fit together.
The tradeoff is that these tools are preconfigured to work in a specific way. If your project needs more customization, you can "eject" and customize it, but then you will need to maintain this configuration.
Check out this awesome browser extensions list for more great packages to help you create a great web extension
We'd love to have your helping hand on create-react-extension
! See CONTRIBUTING.md for more information on what we're looking for and how to get started.
We are grateful to everyone who has been a part of the following existing related projects for their ideas and collaboration:
- Create-React-App
- How to Fork CRA Post to help me create this successfully
- React-chrome-extension-boilerplate and create-chrome-extension, both of unfortunately don't look like they're actively supported, but have been inspiration and shown an appetite for building extensions in the community.
- I have no doubt this will grow as the project grows.
Create React Extension is open source software licensed as MIT.