manifest.json, HTML pages, and special folders. It compiles them with the default SWC (Speedy Web Compiler)-based setup.
Template examples
javascript

content

JavaScript capabilities
| Capability | What it gives you |
|---|---|
| Shared JS/TS pipeline | Compile extension scripts with one default transformer setup |
| Entrypoint discovery | Load script entries from manifest, pages, and special folders |
| Runtime-safe outputs | Emit predictable script artifacts for each extension context |
| Path normalization | Rewrite supported extension-path literals to output-safe paths |
Supported script entrypoints
| Manifest field | File type expected |
|---|---|
background.service_worker | .js, .ts, .mjs, .tsx |
background.scripts | .js, .ts, .mjs, .tsx |
content_scripts.js | .js, .ts, .mjs, .tsx |
user_scripts.api_script | .js, .ts, .mjs, .tsx |
Sample script declaration in manifest.json
Example script declaration in manifest.json:
Development behavior
- Content scripts: Extension.js injects hot module replacement (HMR)/remount flow for fast updates.
- Extension pages: Page scripts follow page HMR behavior.
- Background/service worker: Script updates can trigger a hard extension reload depending on the change type.
- Entrypoint list changes: changing manifest script structure may require a dev server restart.
Script locations and conventions
- Use
scripts/at project root for script-centric extension entries. - Use
pages/for HTML entrypoints with their own scripts. - Keep manifest-referenced paths stable; avoid moving entry files without updating manifest.
Transform and bundling defaults
- SWC is the default transformer for JS/TS/JSX/TSX.
- Extension.js uses browser-first
package.jsonfield resolution (browser,module,main). - Extension.js emits entries predictably and does not split code into separate output files by default.
- Path resolution rewrites static extension-path literals in supported APIs.
Dynamic import caveats
- Content-script dynamic import has runtime constraints; Extension.js uses loader fallbacks where possible.
- Service worker lazy-loading has browser limitations; prefer eager imports in code that must be available immediately when the service worker starts.
Best practices
- Keep entry scripts thin and move feature logic into shared modules.
- Prefer static import paths for extension APIs so path resolution can normalize them safely.
- Avoid unnecessary dynamic import in content scripts and service workers.
- Treat manifest script list edits as structural changes in development workflows.
Next steps
- Understand update outcomes in dev update behavior.
- Learn how to structure files with special folders.
- Continue with background scripts and service workers.

