manifest.json 中的环境变量 - Chrome 扩展
Environment variables in manifest.json - Chrome Extension
是否可以在 Chrome 扩展的 manifest.json 文件中设置环境变量?
就像wOxxOm说的,我用webpack来处理manifest.json。
就我而言,我需要在清单文件上自动设置版本。
我添加到 webpack 脚本中:
plugins: [
new CopyWebpackPlugin([
{
from: "public/manifest.json",
to: "manifest.json",
transform(content, path) {
return modify(content)
}
}
]),
]
并且修改函数为参数替换文件中的版本:
function modify(buffer) {
var manifest = JSON.parse(buffer.toString());
let argv = process.argv[2];
if (argv) manifest.version = argv.split("=")[1];
let manifest_JSON = JSON.stringify(manifest, null, 2);
return manifest_JSON;
}
所以,我像 "yarn build --version=x.x" 一样构建,webpack 做我需要的。
PS:如果你要用这个,记得改成:
manifest.json 目录,如有必要;
修改函数中的值,在我的例子中是版本
正如 OP 在 , using the copy-webpack-plugin in the webpack.config.js
file is the way to go if you're building your Chrome Extension with React. However, if your React app is based on create-react-app
, directly editing the webpack.config.js
file (which is located in node_modules/react-scripts/config
) is not recommended 中提到的那样。
在这种情况下,请使用 craco,这是一个 npm 包,可用于基于 create-react-app
自定义应用程序。操作方法如下:
- 使用
npm i @craco/craco
. 将 craco 安装到您的项目中
- 使用
npm i --save-dev copy-webpack-plugin
. 在您的项目中将 copy-webpack-plugin
作为 dev-dependency 安装
- 假设我们正在创建 Chrome 扩展的开发版本和生产版本。我们还假设我们已经在 Chrome 扩展的
manifest.json
中分配了 "version": "0.1.0"
。根据构建类型,我们希望在 Chrome 扩展的 manifest.json
中相应地分配 version_name
字段,例如,"version_name": "0.1.0 dev"
用于开发,"version_name": "0.1.0"
用于生产。在你的 React 应用程序的 package.json
中,引入两个字段(脚本名称可以是任何你想要的),如下所示:
"scripts": {
...
"build-dev": "CRX_ENV=dev craco build", // or "set CRX_ENV=dev&& craco build" in the case of Windows
"build-prod": "CRX_ENV=prod craco build", // or "set CRX_ENV=prod&& craco build" in the case of Windows
...
}
- 在项目的根目录中创建一个名为
craco.config.js
的新文件。根据您的需要,在 craco.config.js
文件中执行类似于以下内容的操作:
const CopyPlugin = require("copy-webpack-plugin")
module.exports = {
webpack: {
plugins: [
new CopyPlugin({
patterns: [
{
from: "public/manifest.json",
to: "manifest.json",
transform(content, path) {
return modifyManifest(content)
},
},
],
}),
],
},
}
function modifyManifest(buffer) {
const manifest = JSON.parse(buffer.toString())
if (process.env.CRX_ENV === "dev") {
manifest.version_name = `${manifest.version} dev`
} else if (process.env.CRX_ENV === "prod") {
manifest.version_name = `${manifest.version}`
}
const manifestJson = JSON.stringify(manifest, null, 2)
return manifestJson
}
- 运行
npm run build-dev
。它将在您的项目根目录中创建一个名为 build
的文件夹。此 build
文件夹是您解压缩的 Chrome 扩展,您可以使用 chrome://extensions
页面上的“加载解压缩”按钮将其加载到 Chrome 中。加载后,您应该能够看到 0.1.0 dev
作为 Chrome 扩展的版本名称。
- 删除上一步创建的
build
文件夹和 运行 npm run build-prod
,然后重复相同的步骤。您应该能够在 chrome://extensions
页面上看到 0.1.0
作为 Chrome 扩展的版本名称。
是否可以在 Chrome 扩展的 manifest.json 文件中设置环境变量?
就像wOxxOm说的,我用webpack来处理manifest.json。
就我而言,我需要在清单文件上自动设置版本。
我添加到 webpack 脚本中:
plugins: [
new CopyWebpackPlugin([
{
from: "public/manifest.json",
to: "manifest.json",
transform(content, path) {
return modify(content)
}
}
]),
]
并且修改函数为参数替换文件中的版本:
function modify(buffer) {
var manifest = JSON.parse(buffer.toString());
let argv = process.argv[2];
if (argv) manifest.version = argv.split("=")[1];
let manifest_JSON = JSON.stringify(manifest, null, 2);
return manifest_JSON;
}
所以,我像 "yarn build --version=x.x" 一样构建,webpack 做我需要的。
PS:如果你要用这个,记得改成:
manifest.json 目录,如有必要;
修改函数中的值,在我的例子中是版本
正如 OP 在 webpack.config.js
file is the way to go if you're building your Chrome Extension with React. However, if your React app is based on create-react-app
, directly editing the webpack.config.js
file (which is located in node_modules/react-scripts/config
) is not recommended 中提到的那样。
在这种情况下,请使用 craco,这是一个 npm 包,可用于基于 create-react-app
自定义应用程序。操作方法如下:
- 使用
npm i @craco/craco
. 将 craco 安装到您的项目中
- 使用
npm i --save-dev copy-webpack-plugin
. 在您的项目中将 - 假设我们正在创建 Chrome 扩展的开发版本和生产版本。我们还假设我们已经在 Chrome 扩展的
manifest.json
中分配了"version": "0.1.0"
。根据构建类型,我们希望在 Chrome 扩展的manifest.json
中相应地分配version_name
字段,例如,"version_name": "0.1.0 dev"
用于开发,"version_name": "0.1.0"
用于生产。在你的 React 应用程序的package.json
中,引入两个字段(脚本名称可以是任何你想要的),如下所示:"scripts": { ... "build-dev": "CRX_ENV=dev craco build", // or "set CRX_ENV=dev&& craco build" in the case of Windows "build-prod": "CRX_ENV=prod craco build", // or "set CRX_ENV=prod&& craco build" in the case of Windows ... }
- 在项目的根目录中创建一个名为
craco.config.js
的新文件。根据您的需要,在craco.config.js
文件中执行类似于以下内容的操作:const CopyPlugin = require("copy-webpack-plugin") module.exports = { webpack: { plugins: [ new CopyPlugin({ patterns: [ { from: "public/manifest.json", to: "manifest.json", transform(content, path) { return modifyManifest(content) }, }, ], }), ], }, } function modifyManifest(buffer) { const manifest = JSON.parse(buffer.toString()) if (process.env.CRX_ENV === "dev") { manifest.version_name = `${manifest.version} dev` } else if (process.env.CRX_ENV === "prod") { manifest.version_name = `${manifest.version}` } const manifestJson = JSON.stringify(manifest, null, 2) return manifestJson }
- 运行
npm run build-dev
。它将在您的项目根目录中创建一个名为build
的文件夹。此build
文件夹是您解压缩的 Chrome 扩展,您可以使用chrome://extensions
页面上的“加载解压缩”按钮将其加载到 Chrome 中。加载后,您应该能够看到0.1.0 dev
作为 Chrome 扩展的版本名称。 - 删除上一步创建的
build
文件夹和 运行npm run build-prod
,然后重复相同的步骤。您应该能够在chrome://extensions
页面上看到0.1.0
作为 Chrome 扩展的版本名称。
copy-webpack-plugin
作为 dev-dependency 安装