Есть ли лучший способ получить доступ к данным массива в package.json

В моем package.json есть небольшой фрагмент конфигурации:

{
    "name": "who-rules-app",
    "config": {
        "foo": "bar",
        "words": [
            "tpr",
            "rules"
        ]
    },
    "scripts": {
        "start": "node src/index.js"
    }
}

Насколько я могу судить, люди обычно получают доступ к ключу config с помощью process.env['npm_package_${keyname}'], например:

process.env['npm_package_config_foo']
//> "bar"

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

process.env['npm_package_config_words_0']
//> "tpr"
process.env['npm_package_config_words_1']
//> "rules"

Я всегда мог просто прочитать файл с диска с помощью fs, но, насколько я понимаю, выполнение действий с помощью process.env позволяет этому материалу взаимодействовать с переменными среды, что является довольно отличным способом обработки конфигурации в разных средах.

В идеале хотелось бы:

process.env['npm_package_config_words']
//> [ "tpr", "rules" ]

Есть ли способ лучше? Хорошо протестированный модуль? Классный узор?

Любая помощь приветствуется.

не уверен, действительно ли вам нужна ваша конфигурация внутри файла package.json, но если нет, я обычно использую эту библиотеку для установки переменных env npmjs.com/package/dotenv

Flavio 01.05.2018 22:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
1
764
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо того, чтобы использовать хакерский метод process.env, любая последняя версия Node с радостью загрузит файлы .json прямо из коробки, поэтому просто напишите что-нибудь вроде:

let package = require('./package.json');
let config = package.config || {};
let words = config.words || [];

И это все, что вам нужно сделать.

Конечно, загрузка файла напрямую будет работать отлично. Но, как я уже сказал, я боюсь потерять любое взаимодействие с env vars, которое в настоящее время происходит как часть взлома process.env. Вы говорите, что их нет? Или вы предлагаете повторно реализовать это поведение поверх обычного чтения файла?

Tom 03.05.2018 17:20

Зачем было бы взаимодействие? Вы, как программист, несете ответственность за то, какое значение вы используете; ваша среда выполнения и ваш package.json не влияют друг на друга. Если вам нужны значения из вашего package.json, загрузите package.json. Если вам нужны значения из вашего env, используйте process.env, а если вам нужен лучший контроль env, начните использовать реальный пакет среды, такой как dotenv (который по-прежнему не взаимодействует с вашим package.json - ваша среда не имеет ничего общего со значениями в ваш package.json)

Mike 'Pomax' Kamermans 03.05.2018 17:42

Я использую пакет dotenv для переменных среды.

Dotenv is a zero-dependency module that loads environment variables from a .env file into process.env

В вашем config.js

require('dotenv').config()

.env файл

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

Вы можете использовать их как

const db = require('db')
db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
})

Другие вопросы по теме