Skip to main content

Documentation Index

Fetch the complete documentation index at: https://extension.js.org/llms.txt

Use this file to discover all available pages before exploring further.

Create production extension artifacts for one or more browser targets. build compiles your extension in production mode and writes output to dist/<browser>. For monorepo/submodule projects, see Environment variables for configuration-time env resolution (project root first, then workspace-root fallback).

When to use build

  • Preparing extension packages for Chrome Web Store, Edge Add-ons, or Firefox Add-ons.
  • Running continuous integration (CI) jobs that produce repeatable production artifacts.
  • Validating production bundle output and browser-target differences before submission.

Build command capabilities

CapabilityWhat it gives you
Production compilationGenerate optimized extension artifacts per target
Multi-target outputBuild multiple browser targets in one command
Packaging supportCreate distribution zip artifacts with optional source bundle
CI-friendly behaviorKeep build outputs and naming predictable in automation

Usage

extension build [project-path] [options]

Build output

After running build, Extension.js generates optimized files for the selected browser targets. Output goes to dist/ with one subfolder per target. Each folder contains bundled JavaScript, CSS, HTML, and required runtime assets. Example output structure:
dist/
├── chrome/
│   ├── manifest.json
│   ├── background/service_worker.js
│   ├── content_scripts/content-0.js
├── edge/
│   ├── manifest.json
│   ├── background/service_worker.js
│   ├── content_scripts/content-0.js

Browser target matrix

Target styleExamplesNotes
Named targetschromium, chrome, edge, firefoxBuild one specific browser target
Engine targetschromium-based, gecko-based, firefox-basedUseful for engine-family workflows
Multi-targetchrome,firefoxComma-separated targets

Arguments and flags

FlagAliasWhat it doesDefault
[path]-Builds a local extension project.process.cwd()
--browser <browser>-Browser/engine target (chromium, chrome, edge, firefox, engine aliases, or comma-separated values).chromium
--polyfill [boolean]-Enables browser.* API compatibility polyfill for Chromium targets.false
--zip [boolean]-Creates a packaged zip artifact.false
--zip-source [boolean]-Includes source files in zip output.false
--zip-filename <name>-Sets custom zip filename.extension name + version
--silent [boolean]-Suppresses build logs.false
--mode <mode>-Bundler mode override (development, production, or none). Also sets NODE_ENV.production
--extensions <list>-Comma-separated companion extensions or store URLs.unset
--install [boolean]-Install project dependencies when missing.command behavior default
--author--author-modeEnable maintainer diagnostics.disabled

Shared global options

Also supports Global flags.

Mode override

--mode overrides the bundler mode and NODE_ENV for the build. Accepts development, production, or none. Use it to mirror Vite/webpack workflows where you need a non-production bundle for staging or debugging.
extension build ./my-extension --mode development
Invalid values exit with an error; the default remains production.

Zip behavior

OptionEffectTypical use
--zipCreates a packaged artifact zipStore submission/manual distribution
--zip-filenameSets custom zip nameCI naming conventions
--zip-sourceAdds source archive alongside artifactsCompliance/review pipelines

Examples

Building with zip output and custom filename

extension build ./my-extension --browser=edge,chrome --zip --zip-filename=my-extension.zip
In this example, the build targets Edge and Chrome, zips the output, and saves it as my-extension.zip.

Building with polyfill support

extension build ./my-extension --browser=chrome,firefox --polyfill
In this example, the build targets Chrome and Firefox and includes polyfill support where relevant.

Building source and artifact zip

extension build ./my-extension --zip --zip-source

Best practices

  • Check build logs: Review logs for warnings and missing assets after each build.
  • Optimize your manifest: Keep manifest.json compatible with every target browser.
  • Name artifacts intentionally: Use --zip-filename for stable CI artifact naming.
  • Validate target output: Check each dist/<browser> folder before publishing.

Next steps