Различная конфигурация разработки и сборки с помощью web-ext
Я работаю над проектом расширения браузера и хочу, чтобы в background.js
во время разработки и сборки. Я хочу сделать это, не забывая менять код между разработкой и сборкой. В серверном проекте я бы просто использовал переменные dotenv / environment, но они недоступны для расширений, которые эффективно работают на стороне клиента.
В 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/'
а также .env.production
(или .env.build
) из;
API_BASE_URL='http://a.domain.com/v1/'
Это тоже проблема manifest.json
где мне нужно внести в белый список разные URL-адреса в permissions
например
"permissions": [
"storage",
"tabs",
"https://a.domain.com/v1/*",
"http://127.0.0.1:8000/v1/*"
]
Это не параметр времени выполнения для каждого пользователя, поэтому browser.storage
а также options.js
это не то, что мы ищем.
1 ответ
Я понял это, но основной ответ - добавить веб-пакет и использовать dotenv-webpack
для файлов ввода, таких как background.js
а также 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.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