Разбиракодовете повече, отколкото сте предполагали.

Table of Contents
* What is code trace
* What's dotenv
* Assumption: how to design it
* Dive into the codes
  * Find the entry point
  * Break down the function
* Final Thoughts
* References

Какво е проследяване на код

Представете си, че работите съвместно с други, можете да четете документи, да синхронизирате със собственика на кода, да изпълнявате програмите чрез лесен за използване API или извикване на функция, но знаете ли как работи? Можете ли да откриете грешката, когато програмата се срине или не работи?

Проследяването на кода е все едно симулираме компютъра, изпълнявайки програмите ред по ред. Вие не пишете кода, вместо това вие четете кода.

Предимствата на проследяването на код са не само, че можете да разберете напълно услуга, библиотека или проект, но може да ви помогне да научите:

  • Как другите кодират, именуват.
  • Как да проектираме структурата на проекта.
  • Практикуване на способността за проследяване на проблеми.

В тази статия ще проследим dotenv с отворен код ред по ред, нека практикуваме заедно. 🙂

Какво е dotnev

От GitHub:

Dotenv е модул с нулева зависимост, който зарежда променливи на средата от .env файл в process.env. Съхраняването на конфигурация в средата отделно от кода се основава на методологията на приложението Twelve-Factor App.

В реалния живот ние няма да внедрим вашия код директно в производствената среда на вашето приложение, тъй като нито един код не е 100% с нулева грешка, може да разделим различните среди като:

  • визуализация: площадка за разработчиците, без притеснения, ако нещо се счупи (да!)
  • етап: среда, в която можем да внедрим нова функция за клиентите, за да направим тест за приемане от потребителя, известен като UAT.
  • производство: среда за реални продукти.

Представете си, че използваме различни конфигурации за различните среди:

# for preview's database
SQL_USERNAME=dexter
SQL_PASSWORD=ok
# for staging's database
SQL_USERNAME=admin
SQL_PASSWORD=123456789
# for production's database
SQL_USERNAME=prodAdmin
SQL_PASSWORD=asdf12345qwer6789

Не се препоръчва да поставяме secerts на всички среди в един и същ файл, също така трябва да разрешите проблема с дублиращото се именуване.

В този случай dotenv е чудесен инструмент, който може да ви помогне.

Предположение: как да го проектираме

ЗАБЕЛЕЖКА:

1. Проследяваме само основната му употреба.

2. Версията, която проследяваме, е 8.2.0.

Нека да разгледаме употребата:

dotnev зарежда файл със суфикс .env, след което зарежда в process.env, който е обект, който съдържа цялата среда на потребителя.

Тогава в нашия код можем да използваме process.env.<secret name>, за да получим стойността, доста лесно, нали?

Преди да се потопим в кода, нека опитаме дали можем да проектираме толкова елегантна библиотека, колкото него.

Превъртете надолу, след като ви хрумнат някои идеи.

Можем да разделим задачата на:

  1. Зарежда файл със суфикс .env.
  2. Анализира файла ред по ред.
  3. Поставя стойностите в process.env според тайните им имена.

Потопете се в кодовете

Намерете входната точка

Първо, разгледайте структурата (тук се фокусираме само върху важните файлове или папки):

# /
.
├── _lib
│   └── main.js
└── package.json

Когато проследяваме кода, намерете входната точка(в този случай търсим входна точка на експортен модул)е ключът водят до успех. В npm можем да намерим входната точка на програмата вpackage.json:

ЗАБЕЛЕЖКА: От npm Docs:

Основното поле е ID на модул, който е основната входна точка към вашата програма. Тоест, ако вашият пакет е с име foo и потребител го инсталира и след това направи require("foo"), тогава обектът за експортиране на основния ви модул ще бъде върнат.

Разбийте функцията

Обратно към употребата, спомената от GitHub README:

require('dotenv').config()

Нека да отидем на lib/main.js и да преминем към функцията config в line 76 — 110.

По подразбиране опциите могат да бъдат празни и можете да намерите друго извикване на функция:

const parsed = parse(
  fs.readFileSync(dotenvPath, { encoding }), { debug }
)

Преминаване към друга функция parse :

В Line 31 — 74 анотацията казва, че функцията parse е за анализиране на низ към обект.

Обратно към аспекта на дизайна, това е важна функция, която сме пропуснали, като се има предвид простото използване, което споменахме преди:

SQL_USERNAME=dexter
SQL_PASSWORD=ok

Ако можем да имаме вложен или JSON-подобен обект, ще бъде по-лесно за четене, за разширяване, като:

SQL_INFO={"USERNAME": "dexter", "PASSWORD": "ok"}

Така че функцията parse използва Regex, за да работи с низа, да го превърне в обект в JavaScript и върши добра работа по нашите изисквания:

  1. Зарежда файл със суфикс .env.
  2. Анализира файла ред по ред.

Назад към функция config:

Object.keys(parsed).forEach(function (key) {
  if (!Object.prototype.hasOwnProperty.call(process.env, key)) {
    process.env[key] = parsed[key]
  } else if (debug) {
      log(`"${key}" is already defined in \`process.env\` and will not be overwritten`)
  }
})

Тъй като параметърът parsed е съхранил цялата стойност-към-ключ като обект, ние можем:

  1. Използвайте Object.keys, за да получите всички ключове
  2. Използвайте Object.prototype.hasOwnProperty.call(obj, key), за да проверите дали process.env вече съдържа стойността.
  3. Ако не можете да намерите, запазете стойността.

ЗАБЕЛЕЖКА:

Object.prototype.hasOwnProperty.call(obj, key) е подобен на Obj.hasOwnProperty(key), но ще се провали, когато обектът е създаден чрез Object.create(null), което означава, че има null prototype chain. За повече информация вижте тук.

Нашата последна мисия — Поставя стойностите на process.env според тайните им имена, също завърши!

Последни мисли

Благодаря ви, че практикувате проследяването на кода с мен, това е доста приятно пътуване.

Ако имате някакви въпроси или проблеми относно статията, просто оставихте коментар, можете също да ме намерите в Linkedin.

Наздраве 🍻

Препратки

[1] Документация на Node.js — Процес

[2] package.json | npm документи

[3] javascript — Защо да използвате Object.prototype.hasOwnProperty.call(myObj, prop) вместо myObj.hasOwnProperty(prop)? — Препълване на стека