使用 web-ext 进行不同的开发和构建配置

2024-04-16

我正在处理一个浏览器扩展项目,并希望在其中使用不同的 URLbackground.js在开发时间和构建时间。我想做到这一点,而不必记住在开发和构建之间更改代码。对于服务器项目,我只需使用 dotenv/环境变量,但这不适用于有效运行客户端的扩展。

In background.js我有一个fetch使用这个api_base_url(我们也开发API);

...
const api_base_url = 'http://127.0.0.1:8000/v1/'
...

在我构建之前(web-ext build)我必须手动将其更改为类似的内容;

...
const api_base_url = 'http://a.domain.com/v1/'
...

理想情况下它会是这样的;

...
const api_base_url = ENV['API_BASE_URL']
...

我会有一个.env在本地开发中;

API_BASE_URL='http://127.0.0.1:8000/v1/'

and .env.production (or .env.build) of;

API_BASE_URL='http://a.domain.com/v1/'

这也是一个问题manifest.json我需要将不同的 URL 列入白名单permissions e.g.

"permissions": [
    "storage",
    "tabs",
    "https://a.domain.com/v1/*",
    "http://127.0.0.1:8000/v1/*"
  ]

这不是每个用户的运行时选项,因此browser.storage and options.js不是我们要找的。


我已经弄清楚了这一点,但基本答案是添加 webpack 并使用dotenv-webpack对于像这样的入口文件background.js and copy-webpack-plugin对于非条目文件,例如manifest.json。这些插件将替换出现的字符串process.env.YOUR_VARIABLE_NAME的值来自process.env.YOUR_VARIABLE_NAME.

这确实发生了,我花了几次尝试才理解它。

// .env
API_BASE_URL='http://127.0.0.1:8000/v1/'

// ./background.js
const api_base_url = process.env.API_BASE_URL

// manifest.json
"permissions": [
  "tabs",
  "process.env.API_BASE_URL*"
],

// webpack => ./dist/main.js
const api_base_url = 'http://127.0.0.1:8000/v1/'

// webpack => ./dist/manifest.json
"permissions": [
  "tabs",
  "http://127.0.0.1:8000/v1/*"
],

这是 webpack 配置;

// ./webpack.config.js
const CopyPlugin = require('copy-webpack-plugin')
const DotenvPlugin = require('dotenv-webpack')
module.exports = (env) => {
  const dotenvPath = __dirname + '/.env.' + env

  const replaceWithProcessEnv = (content) => {
    for (var key in require('dotenv').config({ path: dotenvPath }).parsed) {
      content = content.replace(new RegExp('process.env.' + key, 'g'), process.env[key])
    }
    return content
  }

  return {
    plugins: [
      new DotenvPlugin(
        {
          path: dotenvPath,
          safe: true
        }
      ),
      new CopyPlugin(
        [
          {
            from: 'src/manifest.json',
            transform(content) {
              return replaceWithProcessEnv(content.toString())
            }
          }
        ]
      )
    ]
  }
}

我在这里做了一个完整的工作示例;https://github.com/paulmwatson/web-ext-environments https://github.com/paulmwatson/web-ext-environments

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 web-ext 进行不同的开发和构建配置 的相关文章

随机推荐