[Фронтенд-инжиниринг] Переменная среды. Файл .env

Node.js
[Фронтенд-инжиниринг] Переменная среды. Файл .env

прелюдия

в современном фронтенд проекте.envФайлы видны везде, и в проекте есть некоторые элементы конфигурации, которые можно использовать в проекте.Хотя это незаметная вещь, эти.envФайлы полезны и значимы во фронтенд-инжиниринге.

Давайте посмотрим на эту короткую статью.

process.env

Текущие интерфейсные проекты все используютNodeкак вспомогательный инструмент разработки, аprocessдаNode.jsГлобальная переменная в , которая предоставляет информацию о текущем процессе Node.js и управляет им. а такжеprocessсерединаenvОн возвращает объект, содержащий контекст пользователя.

Другими словами, можно пройтиprocess.envПолучить информацию о текущей среде выполнения проекта.

Основная информация о среде под Mac:

// index.js
console.log(Object.keys(process.env));

mac环境

Установить переменные среды

1. Командная строка

Когда вам нужно добавить некоторые пользовательские конфигурации в переменные среды, вы можете установить их непосредственно через командную строку:

console.log(process.env.PROT)
PROT=10086 node index.js

На этом этапе переменные среды запуска проекта имеютPROT.

Если вам нужно настроить другие переменные, вы можете продолжить добавлять параметры в виде ключевых значений:

PROT=10086 NDOE_DEV=development node index.js

Хотя этот метод очень прост, он также имеет много недостатков:

  • Низкая читабельность: не могу интуитивно увидеть конфигурацию переменных среды (острые глаза)
  • Легко ошибиться: если не только номер порта, но и информацию базы данных, ключ приложения и т. д., введите все в одну строку (ручная собачья голова)
  • Сложно управлять: как запомнить или управлять всеми переменными окружения и их значениями (ручная собачья голова)

Итак, есть следующий способ.

2. .env-файл

Создайте

Создается непосредственно в корневом каталоге проекта.envфайл и введите переменные среды и их значения.

NDOE_ENV=development
PROT=10086
APP_KEY=***********
HOST_URL=**********

⚠️Внимание:не делай.envТекст помещен в управление версиями кода, потому что эти переменные среды являются закрытыми данными в проекте, иначе они рискуют быть раскрытыми.

читать

Создайте.envфайл, вы можете написать свой собственный код, чтобы найти и проанализировать файл и записать его в свой проект, или использовать стороннийnpmпакеты, такие какdotenv, нажмитездесьПроверьте репо.

yarn add dotenv
// .env
PROT=10086
const dotenv = require('dotenv');
dotenv.config(); 

console.log(process.env.PROT); // 10086

Теперь, когда вы выполняете командный сценарий, вам не нужно передавать переменную среды и ее значение в.envКонфигурация каждой переменной среды также может быть просмотрена и более интуитивно управляема в файле.

Лучшая организация

Если вы не упорядочите переменные окружения, при их использовании это будет выглядеть так:

process.env.PORT

Но раз уж переменных окружения много, везде ли это используется? Или лучше централизованно управлять всеми переменными среды?

Очевидно последнее.

Рефакторинг и обслуживание более сложны, потому что переменные напрямую ссылаются везде, где они необходимы, а не централизованно управляют ими.

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

Организовать вручную

Создатьconfig.jsфайл, затем запишите переменные, назовите их для удобочитаемых свойств, сопоставьте их и экспортируйте.

Например:

const dotenv = require('dotenv'); 

dotenv.config(); 

module.exports = { 
  hostUrl:process.env.HOST_URL,
  secretKey:process.env.API_KEY,
  port:process.env.PORT 
};

Затем вы можете использовать его следующим образом:

const {port} = require('./ config'); 
console.log(`端口为:$ {port}`); // 10086

Какая от этого польза?

  • Организация файлов проекта стала более интуитивно понятной и разумной.
  • Четко знать взаимосвязь отображения переменных среды
  • Переменные переименованы в более читаемые свойства.
  • Свойства конфигурации, которые могут добавлять другие переменные, не относящиеся к среде

Но если вы хотите добавить новую переменную среды, вы должны добавить ее вconfigв модуле.

Это ручной способ, так есть ли автоматический способ собрать его?

Конечно, есть!

автоматическая организация

вышеупомянутые третьи лицаNPMМешокdotenvпросто сделай это.

// config.js 
const dotenv = require('dotenv');
const result = dotenv.config();

if (result.error) {
  throw result.error;
}

const { parsed: envs } = result;

console.log(envs);

module.exports = envs;

Затем на него можно ссылаться в других модулях следующим образом:

const { HOST_URL, API_KEY, PROT } = require('./config');

Итак, какой способ вам нужно использовать сейчас, зависит от вас, независимо от того, каким образом вы должны учитывать следующее:dotenvСтать зависимостью для прогона проекта.

Рекомендуется использовать ручной способ организации переменных окружения, чтобы можно было также удалитьdotenvЗависимости, но только если вам нужно сделать что-то еще: Предварительно загрузить переменные среды.

уменьшить зависимость

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

но как удалитьdotnevКак насчет зависимостей времени выполнения, а затем сохранения его функций?

1. Во время установкиdotenvПри установке в качестве зависимости разработки (dev) удалитеdotenvВесь соответствующий код.

2. Затем используйте-require(-r)этот вариант для предварительной загрузкиdotenv.

// config.js
module.exports = {
    port: process.env.PORT
};
// index.js
const {port} = require('./config');

console.log(`端口号为:${port}`); 
node -r dotenv/config index.js

Производственная среда

Увидев это, некоторые люди скажут, что среду разработки (разработки) можно пройти черезdotenvpreload для чтения переменных среды, но как насчет производства?

В 12-факторном руководстве по созданию приложений также указано, что приложение должно быть отделено от конфигурации.Лучший способ — сохранить его в переменных среды, думая, что эти конфигурации в основном являются частной информацией, такой как номера портов, учетные данные служебной учетной записи, ссылки на базы данных и т. д. Если конфигурация в проекте сохранена в коде или добавлено управление версиями кода, то ваш проект имеет высокую вероятность раскрытия этой частной информации.

Если вы не знаете, что такое 12 элементов, вы можете прочитать «Расширение знаний! Создайте свое приложение с помощью этих 12 элементов».

Итак, согласноЭлемент конфигурации (config)От этого фактора,.envФайл является частным файлом и не должен находиться под контролем версий.

Если он работает на облачном сервере, для его настройки можно использовать функции, предоставляемые поставщиком облачных услуг. Или используйте стороннюю сервисную платформуAzureдля управления переменными среды. Вы можете запустить проект Node через его интерфейс командной строки, а затем получить информацию о переменных среды с платформы облачных служб.

если вDockerработаете, вы можете использоватьDockerфункция для загрузки переменных окружения.

Подробная информация о том, как настроить переменные среды в производственной среде, будет объяснена в следующей статье.

Как поделиться

из-за.envФайл предназначен для сохранения информации о конфигурации проекта.Эта информация является частной и не может быть раскрыта внешнему миру.Так как же одновременно поделиться этой информацией о конфигурации с другими участниками проектной группы?

.env.example

Может быть создан в корневом каталоге проекта.env.exampleфайл, запишите значения ключей всех переменных среды, а затем запишите ложные значения или описания значений ключей, в файле проектаREADME.mdВ документации объясняется, как получить значение установленной переменной среды.

Например:

// .env.example
APP_ENV=development
NODE_ENV=development
HOST=app.test.com
PORT=10086
GOOGLE_MAP_API_KEY=the-google-map-api-key

Информация о конфигурации переменных среды также может храниться в сторонних системах управления хранением, таких какVaultОбеспечивает безопасное хранение (ключ/значение) и управление токенами, паролями, сертификатами, ключами API и т. д.

постоянная конфигурация

через самодельные сервисы илиAzureСлужба постоянной конфигурации с открытым исходным кодом, а затем используйте SDK для получения переменных среды на сервере.

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

служба шифрования

Если уровень безопасности проекта относительно высок, то можно использовать услуги шифрования.

  • Зарегистрируйтесь на платформе шифрования и получите ключ
  • Установите переменные среды на платформе шифрования, и платформа шифрования зашифрует содержимое.
  • Используйте Node SDK для получения зашифрованного текста, выводимого платформой шифрования.
  • Расшифровать в открытый текст с помощью SDK и ключа

наконец

Переменные среды должны существовать вне кода проекта и доступны только во время выполнения проекта, чтобы конфигурация проекта не была связана с его кодом, что позволяет легко развертывать проект в различных средах.

дляNode.jsВ качестве современного внешнего приложения для вспомогательной разработки вы можете использовать переменные среды через глобальную переменную process.env или задавать переменные среды при выполнении команд узла, или использоватьdotenv.

Наконец, обратите внимание.envФайлы никогда не должны существовать в репозитории исходного кода, присоединяйтесь к управлению версиями кода.

Справочная статья: