Я столкнулся по сути с той же проблемой, хотя я пишу без всяких сборщиков, так что код попроще для понимания, так что возможно кому-то ещё может пригодится мой подход.
Короче, в моём случае, я тоже хотел вынести общие функции в отдельный файл и импортить его где необходимо.
У меня изначально всего один background-скрипт и ещё пара для меню. Вот мой изначальный манифест (очевидно не целиком, а лишь значимые части):
{
...
"background": {
"scripts": ["queryParamsRemover.js"]
},
"browser_action": {
"browser_style": true,
"default_icon": "icons/panelicon.png",
"default_title": "Eraser",
"default_popup": "panel/panelMenu.html"
},
...
}
Соответственно, код с логикой panelMenu у меня подключался просто через тег в теле
panel/panelMenu.html:
<script src="panelMenu.js"></script>
Естессна, никакие импорты внутри panelMenu.js не работали, вылетала ошибка
Uncaught SyntaxError: import declarations may only appear at top level of a module. Очевидно, при попытке импортить что-либо в queryParamsRemover.js ошибка была аналогичная.
Как выяснилось, решения у данной проблемы два:
1. В файл
panelMenu.html скрипт встраивается с атрибутом type="module":
<script src="panelMenu.js" type="module"></script>
После этого внутри
panelMenu.js уже работают привычные импорты (кому-то хватит и этого, полагаю).
Далее, чтобы импорты заработали и в основном background-скрипте (у меня это queryParamsRemover), придётся немного изменить подход. Решение (как по мне) выглядит несколько коряво, но именно так предлагает делать официальная документация:
https://developer.mozilla.org/ru/docs/Mozilla/Add-...
Итак, нужно изменить манифест:
"background": {
"page": "background.html"
}
А уже в этом самом
background.html вставлять основной скрипт всё с тем же атрибутом module:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="module" src="queryParamsRemover.js"></script>
</head>
</html>
Собсна, вуаля. Теперь всё работает везде, хотя (как по мне), лишняя веб-страница выглядит каким-то костылём. Почему нельзя было какой-нить атрибут в манифест добавить, что скрипт как модуль выполнялся - непонятно сршна.