138 lines
7.6 KiB
Markdown
Executable File
138 lines
7.6 KiB
Markdown
Executable File
## Installation
|
|
|
|
1. Clone this repository.( ```git clone https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite``` )
|
|
2. Ensure your node version is >= than in `.nvmrc` file, recommend to use [nvm](https://github.com/nvm-sh/nvm?tab=readme-ov-file#intro)
|
|
3. Edit `/packages/i18n/locales/`{your locale(s)}/`messages.json`
|
|
4. In the objects `extensionDescription` and `extensionName`, change the `message` fields (leave `description` alone)
|
|
5. Install pnpm globally: `npm install -g pnpm`
|
|
6. Run `pnpm install`
|
|
7. Check if you have that configuration in your IDE/Editor:
|
|
- <b>VS Code</b>:
|
|
- Installed [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
|
|
- Installed [Prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
|
|
- Enabled `Typescript Workbench version` in settings:
|
|
- CTRL + SHIFT + P -> Search: `Typescript: Select Typescript version...` -> `Use Workbench version`
|
|
- [Read more](https://code.visualstudio.com/docs/languages/typescript#_using-newer-typescript-versions)
|
|
- Optional, for imports to work correctly in WSL, you might need to install the [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) extension and connect to WSL remotely from VS Code. See overview section in the extension page for more information.
|
|
- <b>WebStorm</b>:
|
|
- Configured [ESLint](https://www.jetbrains.com/help/webstorm/eslint.html#ws_eslint_configure_run_eslint_on_save)
|
|
- Configured [Prettier](https://prettier.io/docs/en/webstorm.html)
|
|
- Optional, but useful `File | Settings | Tools | Actions on Save`\
|
|
-> `Optimize imports` and `Reformat code`
|
|
8. Run `pnpm update-version <version>` for change the `version` to the desired version of your extension.
|
|
|
|
> [!IMPORTANT]
|
|
> On Windows, make sure you have WSL enabled and Linux distribution (e.g. Ubuntu) installed on WSL.
|
|
>
|
|
> [Installation Guide](https://learn.microsoft.com/en-us/windows/wsl/install)
|
|
|
|
<b>Then, depending on the target browser:</b>
|
|
|
|
### For Chrome: <a name="installation-chrome"></a>
|
|
|
|
1. Run:
|
|
- Dev: `pnpm dev` (on Windows, you should run as administrator;
|
|
see [issue#456](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/456))
|
|
- Prod: `pnpm build`
|
|
2. Open in browser - `chrome://extensions`
|
|
3. Check - <kbd>Developer mode</kbd>
|
|
4. Click - <kbd>Load unpacked</kbd> in the upper left corner
|
|
5. Select the `dist` directory from the boilerplate project
|
|
|
|
### For Firefox: <a name="installation-firefox"></a>
|
|
|
|
1. Run:
|
|
- Dev: `pnpm dev:firefox`
|
|
- Prod: `pnpm build:firefox`
|
|
2. Open in browser - `about:debugging#/runtime/this-firefox`
|
|
3. Click - <kbd>Load Temporary Add-on...</kbd> in the upper right corner
|
|
4. Select the `./dist/manifest.json` file from the boilerplate project
|
|
|
|
> [!NOTE]
|
|
> In Firefox, you load add-ons in temporary mode. That means they'll disappear after each browser close. You have to
|
|
> load the add-on on every browser launch.
|
|
|
|
## Install dependency for turborepo: <a name="install-dependency"></a>
|
|
|
|
### For root: <a name="install-dependency-for-root"></a>
|
|
|
|
1. Run `pnpm i <package> -w`
|
|
|
|
### For module: <a name="install-dependency-for-module"></a>
|
|
|
|
1. Run `pnpm i <package> -F <module name>`
|
|
|
|
`package` - Name of the package you want to install e.g. `nodemon` \
|
|
`module-name` - You can find it inside each `package.json` under the key `name`, e.g. `@extension/content-script`, you
|
|
can use only `content-script` without `@extension/` prefix
|
|
|
|
## How do I disable modules I'm not using?
|
|
|
|
[Read here](packages/module-manager/README.md)
|
|
|
|
## Environment variables
|
|
|
|
Read: [Env Documentation](packages/env/README.md)
|
|
|
|
## Boilerplate structure <a name="structure"></a>
|
|
|
|
### Chrome extension <a name="structure-chrome-extension"></a>
|
|
|
|
The extension lives in the `chrome-extension` directory and includes the following files:
|
|
|
|
- [`manifest.ts`](chrome-extension/manifest.ts) - script that outputs the `manifest.json`
|
|
- [`src/background`](chrome-extension/src/background) - [background script](https://developer.chrome.com/docs/extensions/mv3/background_pages/)
|
|
(`background.service_worker` in manifest.json)
|
|
- [`public`](chrome-extension/public/) - icons referenced in the manifest; content CSS for user's page injection
|
|
|
|
> [!IMPORTANT]
|
|
> To facilitate development, the boilerplate is configured to "Read and change all your data on all websites".
|
|
> In production, it's best practice to limit the premissions to only the strictly necessary websites. See
|
|
> [Declaring permissions](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions)
|
|
> and edit `manifest.js` accordingly.
|
|
|
|
### Pages <a name="structure-pages"></a>
|
|
|
|
Code that is transpiled to be part of the extension lives in the [pages](pages) directory.
|
|
|
|
- [`content`](pages/content) - Scripts injected into specified pages (You can see it in console)
|
|
- [`content-ui`](pages/content-ui) - React Components injected into specified pages (You can see it at the very bottom of pages)
|
|
- [`content-runtime`](pages/content-runtime/src/) - [injected content scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#functionality)
|
|
This can be injected from e.g. `popup` like standard `content`
|
|
- [`devtools`](pages/devtools/) - [extend the browser DevTools](https://developer.chrome.com/docs/extensions/how-to/devtools/extend-devtools#creating)
|
|
(`devtools_page` in manifest.json)
|
|
- [`devtools-panel`](pages/devtools-panel/) - [DevTools panel](https://developer.chrome.com/docs/extensions/reference/api/devtools/panels)
|
|
for [devtools](pages/devtools/src/index.ts)
|
|
- [`new-tab`](pages/new-tab/) - [override the default New Tab page](https://developer.chrome.com/docs/extensions/develop/ui/override-chrome-pages)
|
|
(`chrome_url_overrides.newtab` in manifest.json)
|
|
- [`options`](pages/options/) - [options page](https://developer.chrome.com/docs/extensions/develop/ui/options-page)
|
|
(`options_page` in manifest.json)
|
|
- [`popup`](pages/popup/) - [popup](https://developer.chrome.com/docs/extensions/reference/api/action#popup) shown when
|
|
clicking the extension in the toolbar
|
|
(`action.default_popup` in manifest.json)
|
|
- [`side-panel`](pages/side-panel/) - [sidepanel (Chrome 114+)](https://developer.chrome.com/docs/extensions/reference/api/sidePanel)
|
|
(`side_panel.default_path` in manifest.json)
|
|
|
|
### Packages <a name="structure-packages"></a>
|
|
|
|
Some shared packages:
|
|
|
|
- `dev-utils` - utilities for Chrome extension development (manifest-parser, logger)
|
|
- `env` - exports object which contain all environment variables from `.env` and dynamically declared
|
|
- `hmr` - custom HMR plugin for Vite, injection script for reload/refresh, HMR dev-server
|
|
- `i18n` - custom internationalization package; provides i18n function with type safety and other validation
|
|
- `shared` - shared code for the entire project (types, constants, custom hooks, components etc.)
|
|
- `storage` - helpers for easier integration with [storage](https://developer.chrome.com/docs/extensions/reference/api/storage), e.g. local/session storages
|
|
- `tailwind-config` - shared Tailwind config for entire project
|
|
- `tsconfig` - shared tsconfig for the entire project
|
|
- `ui` - function to merge your Tailwind config with the global one; you can save components here
|
|
- `vite-config` - shared Vite config for the entire project
|
|
|
|
Other useful packages:
|
|
|
|
- `zipper` - run `pnpm zip` to pack the `dist` folder into `extension-YYYYMMDD-HHmmss.zip` inside the newly created
|
|
`dist-zip`
|
|
- `module-manager` - run `pnpm module-manager` to enable/disable modules
|
|
- `e2e` - run `pnpm e2e` for end-to-end tests of your zipped extension on different browsers
|
|
|