TLDR: Как настроить библиотеку во время выполнения webpack.config.js и передать ее в пакет.
Что я пытаюсь сделать:
Я пытаюсь создать инструмент, который поможет внешнему коду моей команды соответствовать спецификациям OpenApi (или swagger.json).Я начал проект здесь .Я назвал его Hakuna Matata, потому что это не должно означать никаких забот, но сейчас это Hakuna Ma-nada.
Основные характеристики:
- Клиент Javascript, который разработчик может использовать для совершения звонковAPI.(Например,
api.addPet({...})
вместо axios.post('/api/pets/', {...})
- Клиент Javascript проверяет ответы API для модульного тестирования.
- Клиент Javascript обеспечивает выполнение модульных тестов и кода в соответствии со спецификацией API.
- Запуск проверки работоспособности API во время развертываний.
С этим поворотом:
Поскольку наши API меняются и адаптируются со временем, может быть несколько состояний, в которых API живет.(итерации версий, разработка, производство, функциональные ветки и т. д.) Я бы хотел, чтобы мой интерфейсный код указывал на правильный URL-адрес API в зависимости от среды компиляции. Для этого я добавил config.json
файл в корне проекта, который выглядит как this .
Где я сейчас нахожусь:
Во время компиляции я читаю файл config.json
ивыберите, какой URL API использовать в зависимости от среды. ( здесь работает ) (это ключ к тому, что этот конфигурационный файл , а не превращает его в пакет веб-пакета, так как он выставляет нашиURL-адреса производственного API) Если спецификацией API является URL-адрес, синхронно (я знаю,ш, время сборки будь проклято, но это должно происходить только при начальной компиляции) прочитайте спецификацию с URL.
Кстати, я уже прочитал этот ответ несколько раз, и этоне охватывает то, что я хочу сделать.
Тогда у нас есть пара вариантов:
Вариант 1: (Это мой предпочтительный метод, но я не могу заставить его работать.) Возьмите спецификацию, прочитайте ее в swagger-client и используйте тот же метод, что и ProvidePlugin , чтобы добавить клиента в качестве глобальной переменной.( здесь не работает )
ProvidePlugin просто заменяет libraryUsage
на require('package')
, и кажется, что кеш require (). Из webpack.config.js
недоступен в комплекте, поэтомупакет пытается включить resolSpec.js , который использует fs
и sync-request
, которые не могут войти в пакет.
Опция 2: (работает, но не нравится) Возьмите спецификацию, сохраните ее в глобальной константе с DefinePlugin
.Затем в записи index.js
используйте глобальную константу для создания клиента и используйте функцию global.
веб-пакета для установки глобальной переменной.У меня это работало, но мне это не нравится.
Мне не нравится эта опция, потому что это означает, что код запускается в любое время, когда index.js
компилируется.
Итак, вот вопрос:
Можно ли настроить библиотеку во время webpack.config.js, а затем использовать что-то вроде DefinePlugin или ProvidePlugin для передачи синглтона в пакет?
Например, следующий код не работает, но я хотел бы сделать нечто подобное.
webpack.config.js:
const HakunaMatata = require('hakuna-matata');
const ApiClient = new HakunaMatata({
config: process.env.NODE_ENV === "production" ? "option1" : "option2"
});
...
module.exports = {
...
plugins: [
webpack.ProvidePlugin({api: ApiClient}),
// or
webpack.DefinePlugin({api: ApiClient}),
]}
Затем использовать этот клиент в файле:
запись.js:
api.listPets().then(()=>console.log)