readme.md
June 23, 2025 ยท View on GitHub
wext-manifest-loader
Webpack Loader for Webextension manifest
๐โโ๏ธ Made by @abhijithvijayan
Generate browser tailored manifest.json for Web Extensions that you specify properties to appear only in specific browsers.
โค๏ธ it? โญ๏ธ it on GitHub or Tweet about it.
Table of Contents
Browser Support
![]() | ![]() | ![]() | ![]() |
|---|---|---|---|
| โ | โ | โ | โ |
This loader will take a definition input for the manifest, and return you content for the specified browser.
Looking for Web Extension starter
Checkout web-extension-starter that uses this package
Installation
Ensure you have Node.js 10 or later installed. Then run the following:
# via npm
npm install --save-dev wext-manifest-loader wext-manifest-webpack-plugin
# or yarn
yarn add wext-manifest-loader wext-manifest-webpack-plugin --dev
Usage
You can easily use this module together with the wext-manifest-webpack-plugin to output the manifest.json as part of your build process without any additional js bundle and with auto rebundling on file change.
Note: Make sure you pass a TARGET_BROWSER env variable with one of chrome/firefox/edge/opera value
Sample manifest with vendor prefixed keys
https://github.com/abhijithvijayan/web-extension-starter/blob/react-typescript/source/manifest.json
webpack.config.js
// ... other plugins
const WextManifestWebpackPlugin = require("wext-manifest-webpack-plugin");
const targetBrowser = process.env.TARGET_BROWSER;
const destPath = path.join(__dirname, 'extension');
module.exports = {
entry: {
manifest: './src/manifest.json',
// ...
},
output: {
path: path.join(destPath, targetBrowser),
filename: 'js/[name].bundle.js',
},
module: {
rules: [
{
type: 'javascript/auto', // prevent webpack handling json with its own loaders,
test: /manifest\.json$/,
use: 'wext-manifest-loader',
exclude: /node_modules/,
},
]
},
plugins: [
new WextManifestWebpackPlugin(),
// ...
],
};
Options
usePackageJSONVersion
Type: Boolean
Default: false
If true, updates manifest.json version field with package.json version. It is often useful for easy release of web-extension.
webpack.config.js
module.exports = {
module: {
rules: [
{
type: 'javascript/auto', // prevent webpack handling json with its own loaders,
test: /manifest\.json$/,
use: {
loader: 'wext-manifest-loader',
options: {
usePackageJSONVersion: true,
},
},
exclude: /node_modules/,
},
],
},
};
FAQs
1.What are vendor prefixed manifest keys
Vendor prefixed manifest keys allow you to write one manifest.json for multiple vendors.
{
"__chrome__name": "AwesomeChrome",
"__firefox__name": "AwesomeFirefox",
"__edge__name": "AwesomeEdge",
"__opera__name": "AwesomeOpera"
}
if the TARGET_BROWSER is chrome this compiles to:
{
"name": "AwesomeChrome",
}
Add keys to multiple vendors by seperating them with | in the prefix
{
__chrome|opera__name: "AwesomeExtension"
}
if the vendor is chrome or opera, this compiles to:
{
"name": "AwesomeExtension"
}
2. How can I conditionally set keys based on environment
{
"__dev__name": "NameInDevelopment",
"__prod__name": "NameInProduction",
"__chrome|firefox|dev__description": "DescriptionInDevelopmentForSetOfBrowsers",
"__chrome|firefox|prod__description": "DescriptionInProductionForSetOfBrowsers"
}
if the NODE_ENV is production and the TARGET_BROWSER is chrome this compiles to:
{
"name": "NameInProduction",
"description": "DescriptionInProductionForSetOfBrowsers"
}
else
{
"name": "NameInDevelopment",
"description": "DescriptionInDevelopmentForSetOfBrowsers"
}
Issues
Looking to contribute? Look for the Good First Issue label.
๐ Bugs
Please file an issue here for bugs, missing documentation, or unexpected behavior.
Linting & TypeScript Config
- Shared Eslint & Prettier Configuration -
@abhijithvijayan/eslint-config - Shared TypeScript Configuration -
@abhijithvijayan/tsconfig
Credits
Thanks to @fregante for suggesting to convert initial (wext-manifest) module to webpack loader(wext-manifest-loader)
License
MIT ยฉ Abhijith Vijayan



