首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用web-ext的不同开发和构建配置

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

Stack Overflow用户
提问于 2020-02-11 09:56:41
回答 1查看 375关注 0票数 2

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

background.js中,我有一个使用这个api_base_urlfetch (我们也开发了api_base_url);

代码语言:javascript
复制
...
const api_base_url = 'http://127.0.0.1:8000/v1/'
...

在我构建(web-ext build)之前,我必须手动构建类似的东西;

代码语言:javascript
复制
...
const api_base_url = 'http://a.domain.com/v1/'
...

理想的情况是:

代码语言:javascript
复制
...
const api_base_url = ENV['API_BASE_URL']
...

我会有一个.env在当地的开发;

代码语言:javascript
复制
API_BASE_URL='http://127.0.0.1:8000/v1/'

.env.production (或.env.build);

代码语言:javascript
复制
API_BASE_URL='http://a.domain.com/v1/'

这也是manifest.json中的一个问题,我需要在permissions中白名单不同的URL。

代码语言:javascript
复制
"permissions": [
    "storage",
    "tabs",
    "https://a.domain.com/v1/*",
    "http://127.0.0.1:8000/v1/*"
  ]

这不是每个用户运行时的选项,所以browser.storageoptions.js不是我们要找的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-12 12:15:26

我已经知道了这一点,但基本的答案是添加webpack,并使用dotenv-webpack作为输入文件,如background.jscopy-webpack-plugin的非条目文件,如manifest.json。这些插件将用来自process.env.YOUR_VARIABLE_NAME的值替换process.env.YOUR_VARIABLE_NAME中出现的字符串。

这真的发生了,我花了几次努力去理解它。

代码语言:javascript
复制
// .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的配置;

代码语言:javascript
复制
// ./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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60166173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档