В предыдущей статье я описал, как я реализовал переменные окружения в моих Stencil’s проектах или в моих проектах, созданных с помощью Ionic PWA toolkit.

После этой публикации мы начали активно работать над нашим новым редактором презентаций PWA, DeckDeckGo, и, поскольку проект имеет открытый исходный код и опубликован на Github, мы подумали, что, возможно, было бы неплохо не публиковать наши ключи API и другие токены Firebase онлайн в нашем публичном репо 😉

По этой причине мне пришлось пойти на шаг дальше, чем в моем предыдущем посте, соответственно, мне пришлось найти и разработать решение для отдельного сохранения наших ключей. Поэтому я рад поделиться своим решением в этом новом сообщении в блоге 😃

Примечание

Да, мы знаем, что наши переменные среды будут содержаться в нашем клиентском пакете и, следовательно, доступны любому, кто имеет немного ретро-инженерии, но мы подумали, что было бы немного чище не помещать их в репозиторий Git.

Начиная

В проектах Stencil используется Rollup, поэтому мы не собираемся изобретать велосипед, мы просто будем использовать подключаемый модуль Rollup rollup-plugin-replace, который мы устанавливаем с помощью следующей командной строки:

npm install rollup-plugin-replace --save-dev

Этот плагин позволит нам заменять значения во время сборки.

Настройка сред

После установки плагина мы могли редактировать нашу конфигурацию в наших классах начальной загрузки, соответственно, мы могли редактировать наш app.ts файл, чтобы заменить значения, которые мы хотим скрыть. В этом конкретном посте мы собираемся скрыть URL-адрес API. Для этого мы собираемся заменить значения уникальным селектором (который будет автоматически заменен реальными значениями во время объединения, как только мы реализуем все решение):

import {setupConfig} from 
                '../app/services/environment/environment-config’;

setupConfig({
    url: '<@API_URL@>',
    production: true
});

В моей предыдущей статье мы определили две разные среды, и поэтому я все равно буду предполагать, что наша цель - обрабатывать две среды, соответственно production и development.

Точно так же мы собираемся заменить URL-адрес API нашим селектором в конфигурации разработки, соответственно, в файле app-dev.ts:

import {setupConfig} from 
                '../app/services/environment/environment-config’;

setupConfig({
    url: '<@API_URL@>',
    production: false
});

Обратите внимание, что мы используем <@ и @>, чтобы сделать наш селектор действительно уникальным. Эти атрибуты не статичны. Если вы предпочитаете использовать другие, это зависит от вас, не проблема. Затем вам следует просто отразить позже в этом руководстве свои изменения при настройке плагина.

Определение значений селекторов

Чтобы завершить настройку, теперь мы должны создать «где-нибудь» файлы, которые будут содержать реальные значения для наших селекторов. Лично я выбрал решение, в котором я обрабатываю значения в json файлах, помещенных в корень моего проекта и исключенных из Git (я добавил их в список файлов Git .ignored). Поэтому мы могли бы, например, создать новый файл config.prod.json в корне проекта и отредактировать его с помощью нашего селектора и реальных значений:

{
  "API_URL": "https://api.production.com"
}

Конечно, теперь мы также должны создать другой файл конфигурации config.dev.json для селектора и значений или нашей среды разработки:

{
  "API_URL": "https://localhost:3002"
}

Запуск приложения

Теперь, когда наша конфигурация готова, нам нужно просто настроить и использовать плагин, который мы установили ранее, чтобы заменить селектор реальными значениями во время сборки. Для этого мы собираемся отредактировать stencil.config.ts следующим образом:

import replace from 'rollup-plugin-replace';
// See my previous article for development detection
const dev: boolean = process.argv && process.argv.indexOf('--dev') > -1;
import devConfig from './config.dev.json';
import prodConfig from './config.prod.json';
const configValues = dev ? devConfig : prodConfig;
export const config: Config = {
    ...
    plugins: [
      replace({
        exclude: 'node_modules/**',
        delimiters: ['<@', '@>'],
        values: configValues
      }),
    ...
};

Вуаля, не больше и не меньше 🎉 С этого момента каждый раз, когда ваше приложение будет объединено, значения конфигурации, которые вы сохранили отдельно или не зафиксировали в своем репо, будут вводиться во время объединения, легко

Вишня на торте 🍒🎂

Как я уже сказал во введении, это решение реализовано в нашем готовящемся к выпуску редакторе презентаций PWA DeckDeckGo, и, поскольку это проект с открытым исходным кодом, мы будем рады вам взглянуть на реализованное мной решение. Вы заметите, что я реализовал тот же код и конфигурацию, что и выше, но вы не найдете ни config.prod.json, ни config.dev.json в нашем репо 😉

https://github.com/deckgo/deckdeckgo/tree/master/studio

До бесконечности и дальше 🚀

Дэйвид