Π Π°Π·Π½ΠΎΠ΅

Node js config js: GitHub — lorenwest/node-config: Node.js Application Configuration

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ Β· Jest

УстановитС Jest с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ yarn:

Или npm:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: докумСнтация Jest ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ yarn, Π½ΠΎ npm Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ yarn ΠΈ npm Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ yarn, здСсь.

Для Π½Π°Ρ‡Π°Π»Π° напишСм тСст для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая складываСт Π΄Π²Π° числа. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ… создайтС Ρ„Π°ΠΉΠ» sum.js:

Π—Π°Ρ‚Π΅ΠΌ создайтС Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ sum.test.js. Он Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сам тСст:

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» Π² package.json:

НаконСц, запуститС yarn test ΠΈΠ»ΠΈ npm run test ΠΈ Jest Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ это сообщСниС:

Π’Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ написали ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ тСст с использованиСм Jest!

Π”Π°Π½Π½Ρ‹ΠΉ тСст ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ expect ΠΈ toBe для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ идСнтичности Π΄Π²ΡƒΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Ρ‰Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с использованиСм Jest, смотритС использованиС сопоставлСний.

Запуск ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки#

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Jest прямо ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки (Ссли ΠΎΠ½ глобально доступСн Π² PATH, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ yarn global add jest ΠΈΠ»ΠΈ npm install jest --global) с мноТСством ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Jest для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… с my-test, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ config.json Π² качСствС Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ для отобраТСния Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ увСдомлСния ОБ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ:

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с jest Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° страницу ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Jest.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ конфигурация#

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ#

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· Π²Π°ΡˆΠΈΡ… Π½ΡƒΠΆΠ΄, Jest задаст Π²Π°ΠΌ нСсколько вопросов ΠΈ создаст Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ описаниСм для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ:

Б использованиСм Babel#

Для использования Babel, установитС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ зависимости Ρ‡Π΅Ρ€Π΅Π· yarn:

НастройтС Babel Π½Π° Π²Π°ΡˆΡƒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Node Js, создав Ρ„Π°ΠΉΠ» babel. config.js Π² ΠΊΠΎΡ€Π½Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

ИдСальная конфигурация для Babel Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Babel для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

**Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Babel Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° врСмя запуска Jest**

Jest автоматичСски установит для process.env.NODE_ENV Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'test' Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΎΠΏΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ настройки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя запуска Jest, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: babel-jest автоматичСски устанавливаСтся ΠΏΡ€ΠΈ установкС Jest ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ Ссли Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π΅ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ конфигурация babel. Для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ повСдСния, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ явно ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ transform Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

**ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Babel 6**

Π’ 24-ΠΉ вСрсии Jest ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Babel 6. ΠœΡ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π²Π°ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Babel 7, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ поддСрТиваСтся. Однако, Ссли Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Babel 7, Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Jest 23, Π»ΠΈΠ±ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ΡΡŒ Π΄ΠΎ Jest 24 Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π² babel-jest Π½Π° 23-ΠΉ вСрсии, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Π₯отя ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π²Π΅Ρ€ΡΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Jest, Π΄Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ Jest с Babel 6.

Б использованиСм Webpack#

Jest ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… webpack для управлСния рСсурсами, стилями ΠΈ компиляциСй. Webpack Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ привносит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности, способныС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ программистам, Π² сравнСнии с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ инструмСнтами. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Π΄Π΅Π»Ρƒ руководство ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Webpack для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ.

Б использованиСм Parcel#

Jest ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… parcel-bundler для управлСния изобраТСниями, стилями ΠΈ компиляциСй Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ webpack Parcel Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ настройки ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Б использованиСм TypeScript#

Jest ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ TypeScript, Ρ‡Π΅Ρ€Π΅Π· Babel. Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ слСдовали инструкциям ΠΏΠΎ настройкС Babel Π²Ρ‹ΡˆΠ΅. Π”Π°Π»Π΅Π΅ установитС @babel/preset-typescript Ρ‡Π΅Ρ€Π΅Π· yarn:

Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ @babel/preset-typescript Π² список прСсСтов Π² ваш babel.config.js.

Однако, Π΅ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉ Π² использовании TypeScript вмСстС с Babel. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ TypeScript поддСрТиваСтся Π² Babel Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Jest Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π²Π°ΡˆΠΈΡ… тСстах ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ts-jest Π²Π·Π°ΠΌΠ΅Π½, ΠΈΠ»ΠΈ просто запуститС компилятор TypeScript tsc ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ (ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ вашСго процСсса сборки).

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ @types/jest для вСрсии Jest ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ тСкста ΠΏΡ€ΠΈ написании Π²Π°ΡˆΠΈΡ… тСстов с TypeScript.

Для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ @types/* рСкомСндуСтся ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Jest с вСрсиСй связанного модуля. НапримСр, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ 26.4.0 Π²Π΅Ρ€ΡΠΈΡŽ jest , Ρ‚ΠΎ использованиС 26.4.x ΠΈΠ· @types/jest являСтся ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ. Π’ Ρ†Π΅Π»ΠΎΠΌ, ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ максимально ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚ΡŒ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ (26) ΠΈ ΠΌΠΈΠ½ΠΎΡ€Π½ΡƒΡŽ (4) Π²Π΅Ρ€ΡΠΈΡŽ.

Configuring Jest Β· Jest

Jest’s configuration can be defined in the package.json file of your project, or through a jest.config.js, or jest.config.ts file or through the --config <path/to/file.js|ts|cjs|mjs|json> option. If you’d like to use your package.json to store Jest’s config, the "jest" key should be used on the top level so Jest will know how to find your settings:

Or through JavaScript:

Or through TypeScript (if ts-node is installed):

Please keep in mind that the resulting configuration must be JSON-serializable.

When using the --config option, the JSON file must not contain a «jest» key:

Options#

These options let you control Jest’s behavior in your package. json file. The Jest philosophy is to work great by default, but sometimes you just need more configuration power.

Defaults#

You can retrieve Jest’s default options to expand them if needed:


Reference#

automock [boolean]#

Default: false

This option tells Jest that all imported modules in your tests should be mocked automatically. All modules used in your tests will have a replacement implementation, keeping the API surface.

Example:

Note: Node modules are automatically mocked when you have a manual mock in place (e.g.: __mocks__/lodash.js). More info here.

Note: Core modules, like fs, are not mocked by default. They can be mocked explicitly, like jest.mock('fs').

bail [number | boolean]#

Default: 0

By default, Jest runs all tests and produces all errors into the console upon completion. The bail config option can be used here to have Jest stop running tests after n failures. Setting bail to true is the same as setting bail to 1.

cacheDirectory [string]#

Default: "/tmp/<path>"

The directory where Jest should store its cached dependency information.

Jest attempts to scan your dependency tree once (up-front) and cache it in order to ease some of the filesystem raking that needs to happen while running tests. This config option lets you customize where Jest stores that cache data on disk.

clearMocks [boolean]#

Default: false

Automatically clear mock calls and instances before every test. Equivalent to calling jest.clearAllMocks() before each test. This does not remove any mock implementation that may have been provided.

collectCoverage [boolean]#

Default: false

Indicates whether the coverage information should be collected while executing the test. Because this retrofits all executed files with coverage collection statements, it may significantly slow down your tests.

collectCoverageFrom [array]#

Default: undefined

An array of glob patterns indicating a set of files for which coverage information should be collected. If a file matches the specified glob pattern, coverage information will be collected for it even if no tests exist for this file and it’s never required in the test suite.

Example:

This will collect coverage information for all the files inside the project’s rootDir, except the ones that match **/node_modules/** or **/vendor/**.

Note: This option requires collectCoverage to be set to true or Jest to be invoked with --coverage.

Help:If you are seeing coverage output such as…

Most likely your glob patterns are not matching any files. Refer to the micromatch documentation to ensure your globs are compatible.

coverageDirectory [string]#

Default: undefined

The directory where Jest should output its coverage files.

coveragePathIgnorePatterns [array<string>]#

Default: ["/node_modules/"]

An array of regexp pattern strings that are matched against all file paths before executing the test. If the file path matches any of the patterns, coverage information will be skipped.

These pattern strings match against the full path. Use the <rootDir> string token to include the path to your project’s root directory to prevent it from accidentally ignoring all of your files in different environments that may have different root directories. Example: ["<rootDir>/build/", "<rootDir>/node_modules/"].

coverageProvider [string]#

Indicates which provider should be used to instrument code for coverage. Allowed values are babel (default) or v8.

Note that using v8 is considered experimental. This uses V8’s builtin code coverage rather than one based on Babel. It is not as well tested, and it has also improved in the last few releases of Node. Using the latest versions of node (v14 at the time of this writing) will yield better results.

coverageReporters [array<string | [string, options]>]#

Default: ["json", "lcov", "text", "clover"]

A list of reporter names that Jest uses when writing coverage reports. Any istanbul reporter can be used.

Note: Setting this option overwrites the default values. Add "text" or "text-summary" to see a coverage summary in the console output.

Note: You can pass additional options to the istanbul reporter using the tuple form. НапримСр:

For the additional information about the options object shape you can refer to CoverageReporterWithOptions type in the type definitions.

coverageThreshold [object]#

Default: undefined

This will be used to configure minimum threshold enforcement for coverage results. Thresholds can be specified as global, as a glob, and as a directory or file path. If thresholds aren’t met, jest will fail. Thresholds specified as a positive number are taken to be the minimum percentage required. Thresholds specified as a negative number represent the maximum number of uncovered entities allowed.

For example, with the following configuration jest will fail if there is less than 80% branch, line, and function coverage, or if there are more than 10 uncovered statements:

If globs or paths are specified alongside global, coverage data for matching paths will be subtracted from overall coverage and thresholds will be applied independently. Thresholds for globs are applied to all files matching the glob. If the file specified by path is not found, an error is returned.

For example, with the following configuration:

Jest will fail if:

  • The ./src/components directory has less than 40% branch or statement coverage.
  • One of the files matching the ./src/reducers/**/*.js glob has less than 90% statement coverage.
  • The ./src/api/very-important-module.js file has less than 100% coverage.
  • Every remaining file combined has less than 50% coverage (global).

dependencyExtractor [string]#

Default: undefined

This option allows the use of a custom dependency extractor. It must be a node module that exports an object with an extract function. E.g.:

The extract function should return an iterable (Array, Set, etc.) with the dependencies found in the code.

That module can also contain a getCacheKey function to generate a cache key to determine if the logic has changed and any cached artifacts relying on it should be discarded.

displayName [string, object]#

default: undefined

Allows for a label to be printed alongside a test while it is running. This becomes more useful in multi-project repositories where there can be many jest configuration files. This visually tells which project a test belongs to. Here are sample valid values.

or

As a secondary option, an object with the properties name and color can be passed. This allows for a custom configuration of the background color of the displayName. displayName defaults to white when its value is a string. Jest uses chalk to provide the color. As such, all of the valid options for colors supported by chalk are also supported by jest.

errorOnDeprecated [boolean]#

Default: false

Make calling deprecated APIs throw helpful error messages. Useful for easing the upgrade process.

extraGlobals [array<string>]#

Default: undefined

Test files run inside a vm, which slows calls to global context properties (e.g. Math). With this option you can specify extra properties to be defined inside the vm for faster lookups.

For example, if your tests call Math often, you can pass it by setting extraGlobals.

forceCoverageMatch [array<string>]#

Default: ['']

Test files are normally ignored from collecting code coverage. With this option, you can overwrite this behavior and include otherwise ignored files in code coverage.

For example, if you have tests in source files named with .t.js extension as following:

You can collect coverage from those files with setting forceCoverageMatch.

globals [object]#

Default: {}

A set of global variables that need to be available in all test environments.

For example, the following would create a global __DEV__ variable set to true in all test environments:

Note that, if you specify a global reference value (like an object or array) here, and some code mutates that value in the midst of running a test, that mutation will not be persisted across test runs for other test files. In addition, the globals object must be json-serializable, so it can’t be used to specify global functions. For that, you should use setupFiles.

globalSetup [string]#

Default: undefined

This option allows the use of a custom global setup module which exports an async function that is triggered once before all test suites. This function gets Jest’s globalConfig object as a parameter.

Note: A global setup module configured in a project (using multi-project runner) will be triggered only when you run at least one test from this project.

Note: Any global variables that are defined through globalSetup can only be read in globalTeardown. You cannot retrieve globals defined here in your test suites.

Note: While code transformation is applied to the linked setup-file, Jest will not transform any code in node_modules. This is due to the need to load the actual transformers (e.g. babel or typescript) to perform transformation.

Example:

globalTeardown [string]#

Default: undefined

This option allows the use of a custom global teardown module which exports an async function that is triggered once after all test suites. This function gets Jest’s globalConfig object as a parameter.

Note: A global teardown module configured in a project (using multi-project runner) will be triggered only when you run at least one test from this project.

Note: The same caveat concerning transformation of node_modules as for globalSetup applies to globalTeardown.

haste [object]#

Default: undefined

This will be used to configure the behavior of jest-haste-map, Jest’s internal file crawler/cache system. The following options are supported:

injectGlobals [boolean]#

Default: true

Insert Jest’s globals (expect, test, describe, beforeEach etc.) into the global environment. If you set this to false, you should import from @jest/globals, e.g.

Note: This option is only supported using jest-circus.

maxConcurrency [number]#

Default: 5

A number limiting the number of tests that are allowed to run at the same time when using test.concurrent. $ it may cause hard to spot errors. E.g. relay will replace all modules which contain relay as a substring in its name: relay, react-relay and graphql-relay will all be pointed to your stub.

modulePathIgnorePatterns [array<string>]#

Default: []

An array of regexp pattern strings that are matched against all module paths before those paths are to be considered ‘visible’ to the module loader. If a given module’s path matches any of the patterns, it will not be require()-able in the test environment.

These pattern strings match against the full path. Use the <rootDir> string token to include the path to your project’s root directory to prevent it from accidentally ignoring all of your files in different environments that may have different root directories. Example: ["<rootDir>/build/"].

modulePaths [array<string>]#

Default: []

An alternative API to setting the NODE_PATH env variable, modulePaths is an array of absolute paths to additional locations to search when resolving modules. Use the <rootDir> string token to include the path to your project’s root directory. Example: ["<rootDir>/app/"].

notify [boolean]#

Default: false

Activates notifications for test results.

Beware: Jest uses node-notifier to display desktop notifications. On Windows, it creates a new start menu entry on the first use and not display the notification. Notifications will be properly displayed on subsequent runs

notifyMode [string]#

Default: failure-change

Specifies notification mode. Requires notify: true.

Modes#
  • always: always send a notification.
  • failure: send a notification when tests fail.
  • success: send a notification when tests pass.
  • change: send a notification when the status changed.
  • success-change: send a notification when tests pass or once when it fails.
  • failure-change: send a notification when tests fail or once when it passes.

preset [string]#

Default: undefined

A preset that is used as a base for Jest’s configuration. A preset should point to an npm module that has a jest-preset.json or jest-preset.js file at the root.

For example, this preset foo-bar/jest-preset.js will be configured as follows:

Presets may also be relative to filesystem paths.

prettierPath [string]#

Default: 'prettier'

Sets the path to the prettier node module used to update inline snapshots.

projects [array<string | ProjectConfig>]#

Default: undefined

When the projects configuration is provided with an array of paths or glob patterns, Jest will run tests in all of the specified projects at the same time. This is great for monorepos or when working on multiple projects at the same time.

This example configuration will run Jest in the root directory as well as in every folder in the examples directory. You can have an unlimited amount of projects running in the same Jest instance.

The projects feature can also be used to run multiple configurations or multiple runners. For this purpose, you can pass an array of configuration objects. For example, to run both tests and ESLint (via jest-runner-eslint) in the same invocation of Jest:

Note: When using multi-project runner, it’s recommended to add a displayName for each project. This will show the displayName of a project next to its tests.

reporters [array<moduleName | [moduleName, options]>]#

Default: undefined

Use this configuration option to add custom reporters to Jest. A custom reporter is a class that implements onRunStart, onTestStart, onTestResult, onRunComplete methods that will be called when any of those events occurs.

If custom reporters are specified, the default Jest reporters will be overridden. To keep default reporters, default can be passed as a module name.

This will override default reporters:

This will use custom reporter in addition to default reporters that Jest provides:

Additionally, custom reporters can be configured by passing an options object as a second argument:

Custom reporter modules must define a class that takes a GlobalConfig and reporter options as constructor arguments:

Example reporter:

Custom reporters can also force Jest to exit with non-0 code by returning an Error from getLastError() methods

For the full list of methods and argument types see Reporter interface in packages/jest-reporters/src/types.ts

resetMocks [boolean]#

Default: false

Automatically reset mock state before every test. Equivalent to calling jest.resetAllMocks() before each test. This will lead to any mocks having their fake implementations removed but does not restore their initial implementation.

resetModules [boolean]#

Default: false

By default, each test file gets its own independent module registry. Enabling resetModules goes a step further and resets the module registry before running each individual test. This is useful to isolate modules for every test so that the local module state doesn’t conflict between tests. This can be done programmatically using jest. resetModules().

resolver [string]#

Default: undefined

This option allows the use of a custom resolver. This resolver must be a node module that exports a function expecting a string as the first argument for the path to resolve and an object with the following structure as the second argument:

The function should either return a path to the module that should be resolved or throw an error if the module can’t be found.

Note: the defaultResolver passed as an option is the Jest default resolver which might be useful when you write your custom one. It takes the same arguments as your custom one, e.g. (request, options).

For example, if you want to respect Browserify’s "browser" field, you can use the following configuration:

By combining defaultResolver and packageFilter we can implement a package.json «pre-processor» that allows us to change how the default resolver will resolve modules. For example, imagine we want to use the field "module" if it is present, otherwise fallback to "main":

restoreMocks [boolean]#

Default: false

Automatically restore mock state before every test. Equivalent to calling jest.restoreAllMocks() before each test. This will lead to any mocks having their fake implementations removed and restores their initial implementation.

rootDir [string]#

Default: The root of the directory containing your Jest config file or the package.json or the pwd if no package.json is found

The root directory that Jest should scan for tests and modules within. If you put your Jest config inside your package.json and want the root directory to be the root of your repo, the value for this config param will default to the directory of the package. json.

Oftentimes, you’ll want to set this to 'src' or 'lib', corresponding to where in your repository the code is stored.

Note that using '<rootDir>' as a string token in any other path-based config settings will refer back to this value. So, for example, if you want your setupFiles config entry to point at the env-setup.js file at the root of your project, you could set its value to ["<rootDir>/env-setup.js"].

roots [array<string>]#

Default: ["<rootDir>"]

A list of paths to directories that Jest should use to search for files in.

There are times where you only want Jest to search in a single sub-directory (such as cases where you have a src/ directory in your repo), but prevent it from accessing the rest of the repo.

Note: While rootDir is mostly used as a token to be re-used in other configuration options, roots is used by the internals of Jest to locate test files and source files. This applies also when searching for manual mocks for modules from node_modules (__mocks__ will need to live in one of the roots).

Note: By default, roots has a single entry <rootDir> but there are cases where you may want to have multiple roots within one project, for example roots: ["<rootDir>/src/", "<rootDir>/tests/"].

runner [string]#

Default: "jest-runner"

This option allows you to use a custom runner instead of Jest’s default test runner. Examples of runners include:

Note: The runner property value can omit the jest-runner- prefix of the package name.

To write a test-runner, export a class with which accepts globalConfig in the constructor, and has a runTests method with the signature:

If you need to restrict your test-runner to only run in serial rather than being executed in parallel your class should have the property isSerial to be set as true.

setupFiles [array]#

Default: []

A list of paths to modules that run some code to configure or set up the testing environment. Each setupFile will be run once per test file. Since every test runs in its own environment, these scripts will be executed in the testing environment immediately before executing the test code itself.

It’s also worth noting that setupFiles will execute before setupFilesAfterEnv.

setupFilesAfterEnv [array]#

Default: []

A list of paths to modules that run some code to configure or set up the testing framework before each test file in the suite is executed. Since setupFiles executes before the test framework is installed in the environment, this script file presents you the opportunity of running some code immediately after the test framework has been installed in the environment.

If you want a path to be relative to the root directory of your project, please include <rootDir> inside a path’s string, like "<rootDir>/a-configs-folder".

For example, Jest ships with several plug-ins to jasmine that work by monkey-patching the jasmine API. If you wanted to add even more jasmine plugins to the mix (or if you wanted some custom, project-wide matchers for example), you could do so in these modules.

Note: setupTestFrameworkScriptFile is deprecated in favor of setupFilesAfterEnv.

Example setupFilesAfterEnv array in a jest.config.js:

Example jest.setup.js file

slowTestThreshold [number]#

Default: 5

The number of seconds after which a test is considered as slow and reported as such in the results.

snapshotResolver [string]#

Default: undefined

The path to a module that can resolve test<->snapshot path. This config option lets you customize where Jest stores snapshot files on disk.

Example snapshot resolver module:

snapshotSerializers [array<string>]#

Default: []

A list of paths to snapshot serializer modules Jest should use for snapshot testing.

Jest has default serializers for built-in JavaScript types, HTML elements (Jest 20.0.0+), ImmutableJS (Jest 20.0.0+) and for React elements. See snapshot test tutorial for more information.

Example serializer module:

printer is a function that serializes a value using existing plugins.

To use my-serializer-module as a serializer, configuration would be as follows:

Finally tests would look as follows:

Rendered snapshot:

To make a dependency explicit instead of implicit, you can call expect.addSnapshotSerializer to add a module for an individual test file instead of adding its path to snapshotSerializers in Jest configuration.

More about serializers API can be found here.

testEnvironment [string]#

Default: "jsdom"

The test environment that will be used for testing. The default environment in Jest is a browser-like environment through jsdom. If you are building a node service, you can use the node option to use a node-like environment instead.

By adding a @jest-environment docblock at the top of the file, you can specify another environment to be used for all tests in that file:

You can create your own module that will be used for setting up the test environment. The module must export a class with setup, teardown and runScript methods. You can also pass variables from this module to your test suites by assigning them to this.global object – this will make them available in your test suites as global variables.

The class may optionally expose an asynchronous handleTestEvent method to bind to events fired by jest-circus. Normally, jest-circus test runner would pause until a promise returned from handleTestEvent gets fulfilled, except for the next events: start_describe_definition, finish_describe_definition, add_hook, add_test or error (for the up-to-date list you can look at SyncEvent type in the types definitions). That is caused by backward compatibility reasons and process.on('unhandledRejection', callback) signature, but that usually should not be a problem for most of the use cases.

Any docblock pragmas in test files will be passed to the environment constructor and can be used for per-test configuration. If the pragma does not have a value, it will be present in the object with its value set to an empty string. If the pragma is not present, it will not be present in the object.

To use this class as your custom environment, refer to it by its full path within the project. For example, if your class is stored in my-custom-environment.js in some subfolder of your project, then the annotation might looke like this:

Note: TestEnvironment is sandboxed. Each test suite will trigger setup/teardown in their own TestEnvironment.

Example:

testEnvironmentOptions [Object]#

Default: {}

Test environment options that will be passed to the testEnvironment. The relevant options depend on the environment. For example, you can override options given to jsdom such as {userAgent: "Agent/007"}.

testFailureExitCode [number]#

Default: 1

The exit code Jest returns on test failure.

Note: This does not change the exit code in the case of Jest errors (e.g. invalid configuration).

testMatch [array<string>]#

(default: [ "**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)" ])

The glob patterns Jest uses to detect test files. By default it looks for .js, .jsx, .ts and .tsx files inside of __tests__ folders, as well as any files with a suffix of .test or .spec (e.g. Component.test.js or Component.spec.js). It will also find files called test.js or spec.js.

See the micromatch package for details of the patterns you can specify.

See also testRegex [string | array<string>], but note that you cannot specify both options.

testPathIgnorePatterns [array<string>]#

Default: ["/node_modules/"]

An array of regexp pattern strings that are matched against all test paths before executing the test. If the test path matches any of the patterns, it will be skipped.

These pattern strings match against the full path. Use the <rootDir> string token to include the path to your project’s root directory to prevent it from accidentally ignoring all of your files in different environments that may have different root directories. Example: ["<rootDir>/build/", "<rootDir>/node_modules/"].

testRegex [string | array<string>]#

Default: (/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$

The pattern or patterns Jest uses to detect test files. By default it looks for .js, .jsx, .ts and .tsx files inside of __tests__ folders, as well as any files with a suffix of .test or .spec (e.g. Component.test.js or Component.spec.js). It will also find files called test.js or spec.js. See also testMatch [array<string>], but note that you cannot specify both options.

The following is a visualization of the default regex:

Note: testRegex will try to detect test files using the absolute file path, therefore, having a folder with a name that matches it will run all the files as tests

testResultsProcessor [string]#

Default: undefined

This option allows the use of a custom results processor. This processor must be a node module that exports a function expecting an object with the following structure as the first argument and return it:

testRunner [string]#

Default: jasmine2

This option allows the use of a custom test runner. The default is jasmine2. A custom test runner can be provided by specifying a path to a test runner implementation.

The test runner module must export a function with the following signature:

An example of such function can be found in our default jasmine2 test runner package.

testSequencer [string]#

Default: @jest/test-sequencer

This option allows you to use a custom sequencer instead of Jest’s default. sort may optionally return a Promise.

Example:

Sort test path alphabetically.

Use it in your Jest config file like this:

testTimeout [number]#

Default: 5000

Default timeout of a test in milliseconds.

testURL [string]#

Default: http://localhost

This option sets the URL for the jsdom environment. It is reflected in properties such as location.href.

timers [string]#

Default: real

Setting this value to legacy or fake allows the use of fake timers for functions such as setTimeout. Fake timers are useful when a piece of code sets a long timeout that we don’t want to wait for in a test.

If the value is modern, @sinonjs/fake-timers will be used as implementation instead of Jest’s own legacy implementation. This will be the default fake implementation in Jest 27.

transform [object\<string, pathToTransformer | [pathToTransformer, object]>]#

Default: {"\\.[jt]sx?$": "babel-jest"}

A map from regular expressions to paths to transformers. A transformer is a module that provides a synchronous function for transforming source files. \\\/]+$»]

An array of regexp pattern strings that are matched against all source file paths before transformation. If the test path matches any of the patterns, it will not be transformed.

These pattern strings match against the full path. Use the <rootDir> string token to include the path to your project’s root directory to prevent it from accidentally ignoring all of your files in different environments that may have different root directories.

Example: ["<rootDir>/bower_components/", "<rootDir>/node_modules/"].

Sometimes it happens (especially in React Native or TypeScript projects) that 3rd party modules are published as untranspiled. Since all files inside node_modules are not transformed by default, Jest will not understand the code in these modules, resulting in syntax errors. To overcome this, you may use transformIgnorePatterns to allow transpiling such modules. You’ll find a good example of this use case in React Native Guide.

unmockedModulePathPatterns [array<string>]#

Default: []

An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them. If a module’s path matches any of the patterns in this list, it will not be automatically mocked by the module loader.

This is useful for some commonly used ‘utility’ modules that are almost always used as implementation details almost all the time (like underscore/lo-dash, etc). It’s generally a best practice to keep this list as small as possible and always use explicit jest.mock()/jest.unmock() calls in individual tests. Explicit per-test setup is far easier for other readers of the test to reason about the environment the test will run in.

It is possible to override this setting in individual tests by explicitly calling jest.mock() at the top of the test file.

verbose [boolean]#

Default: false

Indicates whether each individual test should be reported during the run. All errors will also still be shown on the bottom after execution. Note that if there is only one test file being run it will default to true.

watchPathIgnorePatterns [array<string>]#

Default: []

An array of RegExp patterns that are matched against all source file paths before re-running tests in watch mode. If the file path matches any of the patterns, when it is updated, it will not trigger a re-run of tests.

These patterns match against the full path. Use the <rootDir> string token to include the path to your project’s root directory to prevent it from accidentally ignoring all of your files in different environments that may have different root directories. Example: ["<rootDir>/node_modules/"].

Even if nothing is specified here, the watcher will ignore changes to any hidden files and directories, i.e. files and folders that begin with a dot (.).

watchPlugins [array<string | [string, Object]>]#

Default: []

This option allows you to use custom watch plugins. Read more about watch plugins here.

Examples of watch plugins include:

Note: The values in the watchPlugins property value can omit the jest-watch- prefix of the package name.

watchman [boolean]#

Default: true

Whether to use watchman for file crawling.

// [string]#

No default

This option allows comments in package.json. Include the comment text as the value of this key anywhere in package.json.

Example:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ | Vue CLI

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ конфигурация CLI

НСкоторыС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ настройки для @vue/cli, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ваши Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ прСсСты настроСк, сохранСны Π² JSON-Ρ„Π°ΠΉΠ»Π΅ . vuerc Π² вашСм домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ для измСнСния этих настроСк.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ vue config для изучСния ΠΈΠ»ΠΈ измСнСния глобальной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ CLI.

Π¦Π΅Π»Π΅Π²Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ.

vue.config.js

vue.config.js β€” ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ @vue/cli-service Ссли Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (рядом с Ρ„Π°ΠΉΠ»ΠΎΠΌ package.json). Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ vue Π² package.json, Π½ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JSON-совмСстимыми значСниями.

Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с настройками:

baseUrl

Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ опция, начиная с вСрсии Vue CLI 3.3, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ вмСсто Π½Π΅Ρ‘ publicPath.

publicPath

  • Π’ΠΈΠΏ: string

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: '/'

    Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ URL-адрСс сборки вашСго прилоТСния, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ (имСнуСмая ΠΊΠ°ΠΊ baseUrl Π΄ΠΎ вСрсии Vue CLI 3.3). Π­Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ ΠΎΠΏΡ†ΠΈΠΈ webpack output.publicPath, Π½ΠΎ Vue CLI Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… цСлях, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ publicPath вмСсто измСнСния ΠΎΠΏΡ†ΠΈΠΈ output.publicPath.

    По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Vue CLI считаСт, Ρ‡Ρ‚ΠΎ публикация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄ΠΎΠΌΠ΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ https://www.my-app.com/. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ публикуСтся Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ этот ΠΏΡƒΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΎΠΏΡ†ΠΈΠΈ. НапримСр, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ адрСсу https://www.foobar.com/my-app/, установитС publicPath Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ '/my-app/'.

    Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустой строкой ('') ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ (./), Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС рСсурсы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈΡΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ сборку Π² любой ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Cordova.

    ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ publicPath

    ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ publicPath ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния ΠΈ Π΅Π³ΠΎ слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ссли:

    • Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ HTML5 history.pushState;

    • Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ pages для создания многостраничного прилоТСния (MPA).

    ΠžΠΏΡ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈ Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ· корня сайта, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ:

outputDir

  • Π’ΠΈΠΏ: string

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 'dist'

    ΠšΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈ запускС vue-cli-service build Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»Ρ‹ сборки для production. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ удаляСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ сборки (это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ --no-clean Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ сборки).

    Π‘ΠΎΠ²Π΅Ρ‚

    ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ outputDir вмСсто измСнСния ΠΎΠΏΡ†ΠΈΠΈ webpack output.path.

assetsDir

  • Π’ΠΈΠΏ: string

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: ''

    ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ outputDir) для хранСния сгСнСрированных статичСских рСсурсов (js, css, img, fonts).

    Π‘ΠΎΠ²Π΅Ρ‚

    assetsDir игнорируСтся ΠΏΡ€ΠΈ пСрСзаписи ΠΎΠΏΡ†ΠΈΠΉ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° (filename) ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² (chunkFilename) сгСнСрированных рСсурсов.

indexPath

  • Π’ΠΈΠΏ: string

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 'index.html'

    ΠŸΡƒΡ‚ΡŒ ΠΊ сгСнСрированному index.html (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ outputDir). Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ.

filenameHashing

  • Π’ΠΈΠΏ: boolean

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: true

    По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ статичСскиС рСсурсы содСрТат Ρ…ΡΡˆΠΈ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ управлСния ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Однако для этого трСбуСтся Ρ‡Ρ‚ΠΎΠ±Ρ‹ индСксный HTML автоматичСски гСнСрировался Vue CLI. Если Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСксный HTML, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ CLI, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², установив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false.

pages

  • Π’ΠΈΠΏ: Object

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: undefined

    Π‘Π±ΠΎΡ€ΠΊΠ° прилоТСния Π² многостраничном Ρ€Π΅ΠΆΠΈΠΌΠ΅ (MPA). Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ «страницы» Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° (entry) Π² Π²ΠΈΠ΄Π΅ JavaScript-Ρ„Π°ΠΉΠ»Π°. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π³Π΄Π΅ ΠΊΠ»ΡŽΡ‡ β€” имя Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

    • ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт свои entry, template, filename, title ΠΈ chunks (всС ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ entry). Π›ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ свойства, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ рядом с Π½ΠΈΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ нСпосрСдствСнно Π² html-webpack-plugin, для возмоТности Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΎΠΉ настройки этого ΠΏΠ»Π°Π³ΠΈΠ½Π°;
    • ΠΈΠ»ΠΈ строкой, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ свою entry.

    Π‘ΠΎΠ²Π΅Ρ‚

    ΠŸΡ€ΠΈ сборкС Π² многостраничном Ρ€Π΅ΠΆΠΈΠΌΠ΅, конфигурация webpack Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ (Π±ΡƒΠ΄ΡƒΡ‚ нСсколько экзСмпляров html-webpack-plugin ΠΈ preload-webpack-plugin). Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² коррСктности, провСряйтС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ vue inspect, Ссли Π²Ρ‹ измСняСтС настройки для этих ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².

lintOnSave

  • Π’ΠΈΠΏ: boolean | 'warning' | 'default' | 'error'

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: ‘default’

    Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΠΈ Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ сохранСнии Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ eslint-loader. Π­Ρ‚Π° опция дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° установлСн ΠΏΠ»Π°Π³ΠΈΠ½ @vue/cli-plugin-eslint.

    Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true ΠΈΠ»ΠΈ 'warning', eslint-loader ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ошибки Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° ΠΊΠ°ΠΊ прСдупрСТдСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ прСдупрСТдСния выводятся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΈ Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ сборку ошибкой, поэтому это Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

    Для отобраТСния ошибок Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ lintOnSave: 'default'. Π­Ρ‚ΠΎ заставит eslint-loader Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки ΠΈ Π»ΡŽΠ±Ρ‹Π΅ ошибки Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ компиляции сборки.

    Установка значСния Π² 'error' заставит eslint-loader ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС прСдупрСТдСния ошибками, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅.

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ошибок:

    Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ lintOnSave приводится ΠΊ true, eslint-loader Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Ρ‚Π°ΠΊ ΠΈ Π² production. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ eslint-loader ΠΏΡ€ΠΈ сборкС Π² production, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ:

runtimeCompiler

  • Π’ΠΈΠΏ: boolean

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: false

    ИспользованиС сборки Vue которая содСрТит компилятор шаблонов. Установка значСния Π² true ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ template Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Vue, Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ 10 ΠšΠ‘Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π° Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

    Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅: Runtime + ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ vs. Runtime-only.

transpileDependencies

  • Π’ΠΈΠΏ: Array<string | RegExp>

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: []

    По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ babel-loader ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· node_modules. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ явно Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Babel, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² этой ΠΎΠΏΡ†ΠΈΠΈ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Jest

Π­Ρ‚Π° опция Π½Π΅ поддСрТиваСтся ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ cli-unit-jest, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Jest ΠΌΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΠ· node_modules, Ссли Π² Π½Ρ‘ΠΌ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ нСстандартныС возмоТности β€” Node >8.11 ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ послСдниС нововвСдСния ECMAScript.

Однако, Jest ΠΈΠ½ΠΎΠ³Π΄Π° трСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ содСрТимоС ΠΈΠ· node_modules, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ссли Π² этом ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ синтаксис ES6 import/export. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ transformIgnorePatterns Π² Ρ„Π°ΠΉΠ»Π΅ jest.config.js.

Π‘ΠΌ. README ΠΏΠ»Π°Π³ΠΈΠ½Π° для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

productionSourceMap

  • Π’ΠΈΠΏ: boolean

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: true

    Установка Π² false ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ сборку для production, Ссли Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ source maps.

crossorigin

  • Π’ΠΈΠΏ: string

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: undefined

    Настройка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² crossorigin для Ρ‚Π΅Π³ΠΎΠ² <link rel="stylesheet"> ΠΈ <script> Π² сгСнСрированном HTML.

    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, это повлияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‚Π΅Π³ΠΈ, внСдряСмыС html-webpack-plugin β€” Ρ‚Π΅Π³ΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ нСпосрСдствСнно Π² шаблон (public/index.html) Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ΡΡ.

    Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅: настройка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² CORS

integrity

  • Π’ΠΈΠΏ: boolean

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: false

    УстановитС Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Subresource Integrity (SRI) для Ρ‚Π΅Π³ΠΎΠ² <link rel="stylesheet"> ΠΈ <script> Π² сгСнСрированном HTML. Если Ρ„Π°ΠΉΠ»Ρ‹ сборки Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π½Π° CDN, Ρ‚ΠΎ рСкомСндуСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ бСзопасности.

    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, это повлияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‚Π΅Π³ΠΈ внСдряСмыС html-webpack-plugin β€” Ρ‚Π΅Π³ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ нСпосрСдствСнно Π² шаблон (public/index.html) Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ΡΡ.

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ SRI, подсказки preload рСсурсов ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ·-Π·Π° ошибки Π² Chrome, которая заставляСт рСсурсы Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π΄Π²Π°ΠΆΠ΄Ρ‹.

configureWebpack

  • Π’ΠΈΠΏ: Object | Function

    Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½ Π² Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ webpack-merge.

    Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ функция β€” ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Π»ΠΈΠ±ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ, Π˜Π›Π˜ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

    Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅: Π Π°Π±ΠΎΡ‚Π° с Webpack β€” ΠŸΡ€ΠΎΡΡ‚Π°Ρ конфигурация

chainWebpack

css.modules

Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ опция, начиная с вСрсии v4, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ вмСсто Π½Π΅Ρ‘ css.requireModuleExtension.

Π’ вСрсии v3 это ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ css.requireModuleExtension.

css.requireModuleExtension

  • Π’ΠΈΠΏ: boolean

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: true

    По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° *.module.[ext] ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ CSS-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Установка Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ .module ΠΈΠ· ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС *.(css|scss|sass|less|styl(us)?) Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ CSS-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.

    Π‘ΠžΠ’Π•Π’

    Если Π² css.loaderOptions.css Π΅ΡΡ‚ΡŒ настроСнныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ CSS-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ css.requireModuleExtension Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ явно ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² true ΠΈΠ»ΠΈ false, ΠΈΠ½Π°Ρ‡Π΅ нСльзя Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎ всСм CSS-Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

    Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅: Π Π°Π±ΠΎΡ‚Π° с CSS β€” CSS-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

  • Π’ΠΈΠΏ: boolean | Object

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: true Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ production, false Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ development

    Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ CSS ΠΈΠ· Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ CSS-Ρ„Π°ΠΉΠ»Ρ‹ (вмСсто ΠΈΠ½Π»Π°ΠΉΠ½Π° Π² JavaScript ΠΈ динамичСского внСдрСния).

    Π­Ρ‚ΠΎ всСгда ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ сборкС Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (Π² этом случаС ΠΈΠ½Π»Π°ΠΉΠ½ стили Π²Π½Π΅Π΄Ρ€ΡΡŽΡ‚ΡΡ Π² shadowRoot).

    ΠŸΡ€ΠΈ сборкС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² false Ρ‡Ρ‚ΠΎΠ±Ρ‹ вашим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ CSS ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

    Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ CSS ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ development, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ нСсовмСстимо с горячСй ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ CSS. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ всё Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ стилСй всСгда, установив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² true.

    ВмСсто true Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с настройками для mini-css-extract-plugin Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ этого ΠΏΠ»Π°Π³ΠΈΠ½Π°.

css.sourceMap

  • Π’ΠΈΠΏ: boolean

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: false

    ИспользованиС source maps для CSS. Установка этого значСния Π² true ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сборки.

css.loaderOptions

  • Π’ΠΈΠΏ: Object

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: {}

    ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° настроСк Π² Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ относящиСся ΠΊ CSS. НапримСр:

    ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ:

    Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ синтаксис scss ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ sass Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ†ΠΈΡŽ scss.

    Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅: ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° настроСк Π² Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅-процСссоров

    Π‘ΠΎΠ²Π΅Ρ‚

    Π­Ρ‚ΠΎΡ‚ способ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· chainWebpack, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ.

devServer

  • Π’ΠΈΠΏ: Object

    ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС настройки для webpack-dev-server, Π½ΠΎ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

    • НСкоторыС значСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ host, port ΠΈ https, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Ρ„Π»Π°Π³Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

    • НСкоторыС значСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ publicPath ΠΈ historyApiFallback, нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ синхронизированы с publicPath для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

devServer.proxy

  • Π’ΠΈΠΏ: string | Object

    Если вашС Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ бэкСнд сСрвСр API Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ хостС, Ρ‚ΠΎ Π²Π°ΠΌ понадобится Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы ΠΊ API. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ devServer.proxy Π² Ρ„Π°ΠΉΠ»Π΅ vue.config.js.

    devServer.proxy ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ строкой, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π½Π° сСрвСр API для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

    Π­Ρ‚ΠΎ скаТСт сСрвСру Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ нСизвСстныС запросы (запросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ статичСскому Ρ„Π°ΠΉΠ»Ρƒ) Π½Π° адрСс http://localhost:4000.

    ΠŸΠ Π•Π”Π£ΠŸΠ Π•Π–Π”Π•ΠΠ˜Π•

    ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ devServer.proxy строкой Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ XHR-запросы. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ API URL, Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, Π° вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ инструмСнт для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с API (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Postman).

    Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ большС контроля повСдСния прокси-сСрвСра, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΎΠΏΡ†ΠΈΠΉ path: options. Π‘ΠΌ. ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΎΠΏΡ†ΠΈΠΉ http-proxy-middleware:

parallel

  • Π’ΠΈΠΏ: boolean | number

  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: require('os').cpus().length > 1

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ thread-loader для транспиляции Babel ΠΈΠ»ΠΈ TypeScript. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ для production-сборок, ΠΊΠΎΠ³Π΄Π° систСма ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ 1 процСссорных ядСр. Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ числа ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ количСство задСйствованных Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ² (workers).

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ parallel Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с Π½Π΅-сСриализуСмыми опциями Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ рСгулярныС выраТСния, Π΄Π°Ρ‚Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ ошибкам.

pwa

pluginOptions

  • Π’ΠΈΠΏ: Object

    Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ своСй структуры, поэтому ΠΌΠΎΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сторонним ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌ. НапримСр:

Babel

Babel ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ babel.config.js.

Π‘ΠΎΠ²Π΅Ρ‚

Vue CLI ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ babel.config.js β€” Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Babel 7. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ .babelrc ΠΈΠ»ΠΈ поля babel Π² package.json, этот Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° основС располоТСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ примСняСтся ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ зависимости Π²Π½ΡƒΡ‚Ρ€ΠΈ node_modules. РСкомСндуСтся всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ babel.config.js Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Vue CLI вмСсто Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ².

ВсС прилоТСния Vue CLI ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ @vue/babel-preset-app, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя babel-preset-env, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ JSX ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для получСния ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΉ сборки минимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ опциях прСсСта.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠŸΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ этого руководства.

ESLint

ESLint ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· .eslintrc ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅ eslintConfig Π² Ρ„Π°ΠΉΠ»Π΅ package.json.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-eslint.

TypeScript

TypeScript ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· tsconfig.json.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-typescript.

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС

Jest

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-unit-jest.

Mocha (Ρ‡Π΅Ρ€Π΅Π·

mocha-webpack)

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-unit-mocha.

E2E тСстированиС

Cypress

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-e2e-cypress.

Nightwatch

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-e2e-nightwatch.

WebdriverIO

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° страницС ΠΏΠ»Π°Π³ΠΈΠ½Π° @vue/cli-plugin-e2e-webdriverio.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

— npm

примСчания ΠΊ выпуску

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Node-config ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ иСрархичСскиС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΉ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ,
ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΈΡ… для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСд развСртывания (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, qa,
постановка, постановка ΠΈ Π΄Ρ€.).

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ хранятся Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды,
ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ внСшниС источники.

Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ согласованный интСрфСйс ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ
растущий список ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ npm, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… node-config.

Руководство ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

  • ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ — НачнитС быстро
  • ΠœΠΎΡ‰Π½Ρ‹ΠΉ — для ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ·Π»ΠΎΠ²ΠΎΠ³ΠΎ развСртывания Π½Π° прСдприятии
  • Π“ΠΈΠ±ΠΊΠΈΠΉ — ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  • Π›Π΅Π³ΠΊΠΈΠΉ — ΠœΠ°Π»Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΈ памяти
  • Predictable — Π₯ΠΎΡ€ΠΎΡˆΠΎ протСстированная основа для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Быстрый старт

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ прСдставлСны Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON, Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

УстановитС Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

 $ npm ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ $ mkdir
$ vi config / default.json 
 {
  // ΠšΠΎΠ½Ρ„ΠΈΠ³ΠΈ клиСнтского модуля
  "ΠŸΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ": {
    "dbConfig": {
      "хост": "Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ хост",
      Β«ΠΏΠΎΡ€Ρ‚Β»: 5984,
      Β«dbNameΒ»: Β«ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹Β»
    },
    "ΠΊΡ€Π΅Π΄ΠΈΡ‚": {
      "initialLimit": 100,
      // УстанавливаСм Π½ΠΈΠ·ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
      "initialDays": 1
    }
  }
} 

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ пСрСопрСдСлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для производствСнного развСртывания:

 $ vi config / production.json 
 {
  "ΠŸΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ": {
    "dbConfig": {
      "хост": "prod-db-server"
    },
    "ΠΊΡ€Π΅Π΄ΠΈΡ‚": {
      Β«initialDaysΒ»: 30
    }
  }
} 

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² своСм ΠΊΠΎΠ΄Π΅:

 const config = require ('config');
// ...
const dbConfig = config.get ('Customer.dbConfig');
db.connect (dbConfig, ...);

if (config.has ('optionalFeature.detail')) {
  const detail = config.get ('optionalFeature.detail');
  // ...
} 

config.get () выдаст ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ значСния.Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ config.has () , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ЗапуститС сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:

 $ экспорт NODE_ENV = производство
$ node my-app.js 

Работая Π² этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡ€Ρ‚ ΠΈ элСмСнты dbName ΠΈΠ· dbConfig
Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° default.json , Π° элСмСнт host Π±ΡƒΠ΄Π΅Ρ‚
взяты ΠΈΠ· Ρ„Π°ΠΉΠ»Π° пСрСопрСдСлСния production.json .

Π‘Ρ‚Π°Ρ‚ΡŒΠΈ

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

Если Π²Ρ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΡ‰Π΅Ρ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько рСсурсов:

Авторы

ЛицСнзия

ΠœΠΎΠΆΠ΅Ρ‚ свободно Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ MIT.

Copyright (c) 2010-2020 Π›ΠΎΡ€Π΅Π½ Уэст
ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ участники

Node.

js Best Practices — Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Π΅ способы управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ | by Raj Chaudhary

МнС каТСтся ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Node.js для управлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСд (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, тСстированиС, постановка ΠΈ производство).

Π˜Ρ‚Π°ΠΊ, я ΠΏΡ€ΠΈΡˆΠ΅Π» ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ управляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для всСх срСд с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Node.js.

Π‘Π½Π°Ρ‡Π°Π»Π° создадим config.json Π² ΠΏΠ°ΠΏΠΊΠ΅ root / config, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° являСтся срСдой ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ содСрТит всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ повторяСтС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдах, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, тСстовая, промСТуточная ΠΈ производствСнная срСды ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ config_id ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. А ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ производствСнныС срСды Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ node_port.

Π—Π°Ρ‚Π΅ΠΌ Π΄Π°Π²Π°ΠΉΡ‚Π΅ напишСм ΠΊΠΎΠ΄ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ config.js Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ / config, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄:

  1. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ JSON ΠΈΠ· Ρ„Π°ΠΉΠ»Π° root / config.json.
  2. УстанавливаСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΡƒΠ·Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, находящСгося Π² config.json.
  3. УстанавливаСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ срСды для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° срСды, Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² config.json, Π½Π° основС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды NODE_ENV (которая сама ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ссли ΠΎΠ½Π° Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ).
  4. УстанавливаСт ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½Π° объСдинСниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ срСды, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ слияния lodash.
  5. УстанавливаСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ gConfig со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
  6. РСгистрируСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ gConfig.

НаконСц, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим root / server.js, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС это Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Код Π½ΠΈΠΆΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пояснСний. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ это, установив Ρ€Π°Π·Π½Ρ‹Π΅ значСния для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды NODE_ENV.

А Π²ΠΎΡ‚ нСсколько ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ΠΎΠ² ΠΈΠ· тСстирования с установкой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды NODE_ENV Π² server.js для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ постановки. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСды значСния app_name, app_desc ΠΈ json_indentation Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΈ бСрутся ΠΈΠ· срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π³Π΄Π΅ значСния config_id, node_port ΠΈ database ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ.

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΆΡƒΡ€Π½Π°Π»Π° для срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° для срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΆΡƒΡ€Π½Π°Π»Π° для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСды Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСды

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ / Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ рСпозитория GitHub здСсь.

Π’ качСствС бонуса Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π°ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сСкрСты, ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ΠΈ API ΠΈΠ»ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ, Π² config.json. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°ΡˆΠΈΡ„Ρ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π² исходный Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ уровня, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Cloud Key Management Service (KMS) Google Cloud Platform.И Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свой Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ инструмСнт CI / CD.

ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΌΠΎΠΈΠΌ сообщСниСм Π² Π±Π»ΠΎΠ³Π΅ ИспользованиС слуТбы управлСния ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΎΠ±Π»Π°ΠΊΠ° (KMS) Google Cloud Platform для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ / Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ сСкрСтов для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π£Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ кодирования!

GitHub — lorenwest / node-config: ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ прилоТСния Node.js

примСчания ΠΊ выпуску

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Node-config ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ иСрархичСскиС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΉ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ,
ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΈΡ… для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСд развСртывания (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, qa,
постановка, постановка ΠΈ Π΄Ρ€.).

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ хранятся Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды,
ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ внСшниС источники.

Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ согласованный интСрфСйс ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ
растущий список ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ npm, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… node-config.

Руководство ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

  • ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ — НачнитС быстро
  • ΠœΠΎΡ‰Π½Ρ‹ΠΉ — для ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ·Π»ΠΎΠ²ΠΎΠ³ΠΎ развСртывания Π½Π° прСдприятии
  • Π“ΠΈΠ±ΠΊΠΈΠΉ — ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  • Π›Π΅Π³ΠΊΠΈΠΉ — ΠœΠ°Π»Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΈ памяти
  • Predictable — Π₯ΠΎΡ€ΠΎΡˆΠΎ протСстированная основа для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Быстрый старт

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ прСдставлСны Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON, Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

УстановитС Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

 $ npm ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ $ mkdir
$ vi config / default.json 
 {
  // ΠšΠΎΠ½Ρ„ΠΈΠ³ΠΈ клиСнтского модуля
  "ΠŸΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ": {
    "dbConfig": {
      "хост": "Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ хост",
      Β«ΠΏΠΎΡ€Ρ‚Β»: 5984,
      Β«dbNameΒ»: Β«ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹Β»
    },
    "ΠΊΡ€Π΅Π΄ΠΈΡ‚": {
      "initialLimit": 100,
      // УстанавливаСм Π½ΠΈΠ·ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
      "initialDays": 1
    }
  }
} 

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ пСрСопрСдСлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для производствСнного развСртывания:

 $ vi config / production.json 
 {
  "ΠŸΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ": {
    "dbConfig": {
      "хост": "prod-db-server"
    },
    "ΠΊΡ€Π΅Π΄ΠΈΡ‚": {
      Β«initialDaysΒ»: 30
    }
  }
} 

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² своСм ΠΊΠΎΠ΄Π΅:

 const config = require ('config');
// ...
const dbConfig = config.get ('Customer.dbConfig');
db.connect (dbConfig, ...);

if (config.has ('optionalFeature.detail')) {
  const detail = config.get ('optionalFeature.detail');
  // ...
} 

config.get () выдаст ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ значСния.Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ config.has () , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ЗапуститС сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:

 $ экспорт NODE_ENV = производство
$ node my-app. js 

Работая Π² этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡ€Ρ‚ ΠΈ элСмСнты dbName ΠΈΠ· dbConfig
Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° default.json , Π° элСмСнт host Π±ΡƒΠ΄Π΅Ρ‚
взяты ΠΈΠ· Ρ„Π°ΠΉΠ»Π° пСрСопрСдСлСния production.json .

Π‘Ρ‚Π°Ρ‚ΡŒΠΈ

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

Если Π²Ρ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΡ‰Π΅Ρ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько рСсурсов:

Авторы

ЛицСнзия

ΠœΠΎΠΆΠ΅Ρ‚ свободно Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ MIT.

Copyright (c) 2010-2020 Π›ΠΎΡ€Π΅Π½ Уэст
ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ участники

Как ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π₯Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ вашСго прилоТСния Node.js довольно просто — ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² JavaScript ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ JSON, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, прСдставляСт собой просто строковыС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для вас способом. Π‘Π°ΠΌΡ‹ΠΉ простой способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ JSON.parse () ΠΈ JSON.stringify () .

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΎΡ‡Π΅Π½ΡŒ простой (ΠΈ Π½Π°Π΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ) ΠΏΡ€ΠΈΠΌΠ΅Ρ€.Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ простыС Π΄Π°Π½Π½Ρ‹Π΅:

  var fs = require ('fs');

var myOptions = {
  имя: 'ΠŸΡ‚ΠΈΡ‡ΠΈΠΉ',
  дСсСрт: Ρ‚ΠΎΡ€Ρ‚
  Π°Ρ€ΠΎΠΌΠ°Ρ‚: "ΡˆΠΎΠΊΠΎΠ»Π°Π΄Π½Ρ‹ΠΉ",
  Π½Π°ΠΏΠΈΡ‚ΠΎΠΊ: 'ΠΊΠΎΡ„Π΅'
};

var data = JSON.stringify (myOptions);

fs.writeFile ('./ config.json', data, function (err) {
  if (err) {
    console.log (Β«ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка ΠΏΡ€ΠΈ сохранСнии Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.Β»);
    console.log (сообщСниС ΠΎΠ± ошибкС);
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ;
  }
  console.log ('ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ сохранСна.')
});
  

Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ просто — всСго JSON.stringify () , Π° Π·Π°Ρ‚Π΅ΠΌ сохранитС Π΅Π³ΠΎ, ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

  var fs = require ('fs');

var data = fs.readFileSync ('./ config.json'),
    myObj;

ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ {
  myObj = JSON.parse (Π΄Π°Π½Π½Ρ‹Π΅);
  console.dir (myObj);
}
catch (err) {
  console. log ('ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ вашСго JSON.')
  console.log (ошибка);
}
  

Π‘ΠžΠ’Π•Π’

NODE PRO: Π΄Π°ΠΆΠ΅ Ссли Π²Π°ΠΌ Π½Π΅ нравится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ try / catch , это мСсто для Π΅Π³ΠΎ использования. JSON.parse — ΠΎΡ‡Π΅Π½ΡŒ строгий синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ JSON, ΠΈ ошибки Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ часто, Π½ΠΎ самоС Π³Π»Π°Π²Π½ΠΎΠ΅ — JSON.parse ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ throw вмСсто ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, поэтому try / catch — СдинствСнный способ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ошибки.

ИспользованиС встроСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² JSON ΠΌΠΎΠΆΠ΅Ρ‚ увСсти вас Π΄Π°Π»Π΅ΠΊΠΎ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π² случаС со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Node.js, Π² Userland ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ вас Π²ΠΏΠ΅Ρ€Π΅Π΄. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ — nconf . Написанный Π§Π°Ρ€Π»ΠΈ Роббинсом, это ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Node.js, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π² памяти, локальноС Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ бэкэнда redis , прСдставлСнных Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊ ΠΌΡ‹ выполняСм Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ nconf . Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

.

  npm ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ nconf
  

ПослС этого синтаксис становится ΠΏΡ€ΠΎΡ‰Π΅ простого. ВзглянитС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  var nconf = require ('nconf');

nconf.ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ('Ρ„Π°ΠΉΠ»', {Ρ„Π°ΠΉΠ»: './config.json'});
nconf.load ();
nconf.set ('имя', 'Авиан');
nconf.set ('дСсСрт: имя', 'ΠœΠΎΡ€ΠΎΠΆΠ΅Π½ΠΎΠ΅');
nconf.set ('дСсСрт: Π°Ρ€ΠΎΠΌΠ°Ρ‚', 'шоколад');

console.log (nconf.get ('дСсСрт'));

nconf.save (функция (ошибка) {
  if (err) {
    console.error (сообщСниС ΠΎΠ± ошибкС);
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ;
  }
  console.log ('ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ сохранСна.');
});
  

ЕдинствСнноС, Ρ‡Ρ‚ΠΎ здСсь слоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, это Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ — ‘:’. ΠŸΡ€ΠΈ доступС ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ свойствам с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ nconf Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для раздСлСния пространств ΠΈΠΌΠ΅Π½ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΈΠΌΠ΅Π½. Если ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, устанавливаСтся ΠΈΠ»ΠΈ возвращаСтся вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈ использовании nconf для сохранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ», nconf.save () ΠΈ nconf.load () — СдинствСнныС случаи, ΠΊΠΎΠ³Π΄Π° происходит ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ фактичСскоС взаимодСйствиС с Ρ„Π°ΠΉΠ»ΠΎΠΌ. Π’Π΅ΡΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ доступ осущСствляСтся ΠΊ ΠΊΠΎΠΏΠΈΠΈ Π²Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти, которая Π½Π΅ сохранится Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° nconf.save () . Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Ссли Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠ· послСднСго запуска вашСго прилоТСния, ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² памяти Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° nconf.load () , ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅.

ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды | Gatsby

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ своСму сайту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСдах.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… мСстах, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для использования Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСдах развСртывания. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΈΡ… Β«Project Env VarsΒ».

И Π΅ΡΡ‚ΡŒ настоящиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды уровня ОБ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Β«OS Env VarsΒ».

Π’ ΠΎΠ±ΠΎΠΈΡ… случаях Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для срСды, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Gatsby ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 2 срСды:

  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Если Π²Ρ‹ запуститС gatsby develop , Π²Ρ‹ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚Π΅ Π² срСду Β«Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈΒ».
  • ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡ‚Π²ΠΎ. Если Π²Ρ‹ запуститС gatsby build ΠΈΠ»ΠΈ gatsby serve , Ρ‚ΠΎ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π² «производствСнной» срСдС.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСды, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π‘ΠΌ. Β«Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСды» Π½ΠΈΠΆΠ΅. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды CodeSandbox, читая ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

Доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ срСды Π² JavaScript

ВсС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Env ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ОБ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСпосрСдствСнно Π²ΠΎ врСмя сборки, ΠΈΠ»ΠΈ
ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½ Node. js. Они Π½Π΅ доступны сразу Π²ΠΎ врСмя выполнСния клиСнтского ΠΊΠΎΠ΄Π°; OΠ½ΠΈ
Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Ρ‹ ΠΈ встроСны Π² клиСнтский JavaScript.Π­Ρ‚ΠΎ достигаСтся Π²ΠΎ врСмя сборки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DefinePlugin webpack.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды Π±Ρ‹Π»ΠΈ встроСны Π² ΠΊΠΎΠ΄ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΎΠ½ΠΈ становятся доступными ΠΈΠ·
глобальная пСрСмСнная process.env .
ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Env ОБ доступны Π² Node.js ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ process.env .

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ встроСны Π²ΠΎ врСмя сборки, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ сСрвСр Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.
ΠΈΠ»ΠΈ пСрСстройтС свой сайт послС ΠΈΡ… измСнСния.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ JavaScript

Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Project Env, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Π² клиСнтском Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ JavaScript, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ
Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ срСды .env.development ΠΈ / ΠΈΠ»ΠΈ .env.production Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅.
Π’ зависимости ΠΎΡ‚ вашСй Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ срСды Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ срСда, Π° Π΅Π΅ значСния встроСны ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды Π² JavaScript Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ этим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ срСды ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π² Ρ„Π°ΠΉΠ»Π°Ρ… .env. * , Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ
OS Env Vars. OS Env Vars с прСфиксом GATSBY_ станут доступны Π²
Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ JavaScript.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ Node.js

Гэтсби запускаСт нСсколько ΡƒΠ·Π»ΠΎΠ².js Π²ΠΎ врСмя сборки, особСнно gatsby-config.js ΠΈ gatsby-node.js .
OS Env Vars ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны, ΠΊΠΎΠ³Π΄Π° Node Π·Π°ΠΏΡƒΡ‰Π΅Π½, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды
Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ способы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ добавляя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды Ρ‡Π΅Ρ€Π΅Π· ваш инструмСнт хостинга / сборки, Π²Π°ΡˆΡƒ ОБ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π°
Π²Ρ‹Π·ΠΎΠ² Гэтсби ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

Π’ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ… Linux это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

Π’ Windows это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ стСка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ…

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² .env. * Π€Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ доступны сразу послС НЕ
Π² Π²Π°ΡˆΠΈΡ… скриптах Node. js. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ npm dotenv для
ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .env. * ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ эти значСния.
dotenv ΡƒΠΆΠ΅ являСтся Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ Gatsby, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² своСм gatsby-config.js ΠΈΠ»ΠΈ gatsby-node.js ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ доступны Π² процСссС .env ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ .env. * Π² систСму управлСния вСрсиями ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, прСдоставлСнныС поставщиком Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ развСртывания (CD). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся Netlify с Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ срСды сборки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Gatsby ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ DefinePlugin webpack, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды доступными Π²ΠΎ врСмя выполнСния, ΠΈΡ… нСльзя Π΄Π΅ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· process.env ; вмСсто этого Π½Π° Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π΄Π°Π½Ρ‹ ΠΏΠΎΠ»Π½Ρ‹Π΅ ссылки.

GATSBY_API_URL Π±ΡƒΠ΄Π΅Ρ‚ доступСн Π²Π°ΡˆΠ΅ΠΌΡƒ сайту (Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ Π½Π° сторонС сСрвСра) ΠΊΠ°ΠΊ процСсс .env.GATSBY_API_URL .:

Π’ Node Ρƒ вашСго сайта Π΅ΡΡ‚ΡŒ доступ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ API_KEY (Π½Π° сторонС сСрвСра) с использованиСм ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° process.env.API_KEY . Для доступа ΠΊ Π½Π΅ΠΌΡƒ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» .env. * , содСрТащий API_KEY . Однако Π²Π°ΠΌ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹ Π² систСмС управлСния вСрсиями, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ раскрытиС ΠΊΠ»ΡŽΡ‡Π° API являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ бСзопасности. Π’ качСствС Π±ΠΎΠ»Π΅Π΅ бСзопасной Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ прСфикс GATSBY_ (ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅).Π‘ этим прСфиксом Гэтсби автоматичСски встраиваСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠ°ΠΊ process.env.GATSBY \ _ \ * Π² скомпилированный JS, дСлая Π΅Π΅ доступной Π² контСкстС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, Π½Π΅ раскрывая Π΅Π΅ Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅.

Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды:

Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.
для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя сборки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Gatsby Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды ΠΏΡ€ΠΈ запускС локального сСрвСра Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,Π³Ρ€Π°ΠΌΠΌ. npm run develop ):

  • ENABLE_GATSBY_REFRESH_ENDPOINT

Π­Ρ‚ΠΎ позволяСт ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ исходный ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. Π‘ΠΌ. ОбновлСниС содСрТимого.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сборки

Gatsby ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды Π½Π° этапС сборки для Ρ‚ΠΎΡ‡Π½ΠΎΠΉ настройки Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° сборки. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ для Π±ΠΎΠ»Π΅Π΅ слоТных ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ использованиС CI / CD для развСртывания сайта Gatsby.

НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ CI = true Π² качСствС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сцСнарий сборки Gatsby ΠΌΠΎΠ³ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΊ срСдС автоматичСского развСртывания.НСкоторыС инструмСнты CI / CD ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ограничСния подробности Π²Ρ‹Π²ΠΎΠ΄Π° сборки для Π½Π΅ΠΌΡ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ анимация выполнСния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

Gatsby опрСдСляСт ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° для Ρ„Π°Π·Ρ‹ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° gatsby build Π½Π° основС заявлСнного количСства физичСских процСссоров. Для сборок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… срСдах, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ количСство ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды GATSBY_CPU_COUNT .Π‘ΠΌ. ΠœΠ½ΠΎΠ³ΠΎΡΠ΄Π΅Ρ€Π½Ρ‹Π΅ сборки.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСды (ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅, тСстовыС ΠΈ Ρ‚. Π”.)

Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, NODE_ENV — это зарСзСрвированная пСрСмСнная срСды Π² Gatsby, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° систСмС сборки для выполнСния ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ компиляции React ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ срСды ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды доступными для ΠΊΠΎΠ΄Π° Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния ОБ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ срСду, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π‘Π°ΠΌ Gatsby Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с этой ОБ Env Var, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² gatsby-config.js .

Π’ частности, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ dotenv ΠΈ Π²Π°ΡˆΡƒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Env Var ОБ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΉΠ» .env.myCustomEnvironment , Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ module.exports для хранСния этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Project Env Π² Ρ‚ΠΎΠΌ мСстС, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ клиСнтский JavaScript ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ значСния (Ρ‡Π΅Ρ€Π΅Π· запросы GraphQL).

Google Analytics env var example

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ срСду с настраиваСмым ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ отслСТивания Google Analytics ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ apiUrl , Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ .env.staging Π² ΠΊΠΎΡ€Π½Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ вашСго gatsby-config.js :

Π­Ρ‚ΠΎ Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ значСния ΠΈΠ· Ρ„Π°ΠΉΠ»Π° .env. * ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ срСды ΠΈ сдСлаСт ΠΈΡ… доступными Ρ‡Π΅Ρ€Π΅Π· запросы GraphQL ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ. соотвСтствСнно.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ тСстированиС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСды ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСкрСтами Node.js | Π‘Π΅Ρ€Π³Π΅ΠΉ Π§ΠΈΠΊΠΈΠ½

Π€ΠΎΡ‚ΠΎ Эмиля ΠŸΠ΅Ρ€Ρ€ΠΎΠ½Π° Π½Π° Unsplash

Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ Π² LinkedIn Β»

Π—Π° послСдниС ΠΏΠ°Ρ€Ρƒ Π»Π΅Ρ‚ я Π±Ρ‹Π» Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Node.js, ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ — это Ρ‚ΠΎ, ΠΊΠ°ΠΊ люди ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ сСкрСтами.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, это основныС аспСкты Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ управлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ / сСкрСтами.

Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ являСтся ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π½ΠΎ это добавляСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы ΠΈ замСдляСт процСсс ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ / исправлСния. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΈ поэтому ΠΎΠ½ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ всСх Π·Π½Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ значСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ случай:

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, построСнноС Π½Π° Scala (Akka), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ typesafe-config для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сСрвСра ΠΈ вмСстС с Π½ΠΈΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² / диспСтчСра. Π’ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ достаточным ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ прилоТСния (ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ прСдставлСния ΠΎ ΠΏΡƒΠ»Π°Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π΅Ρ‰Π΅ мСньшС Π·Π½Π°ΡŽΡ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ участники / Ρ„ΡŒΡŽΡ‡Π΅Ρ€ΡΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² ΠΊΠ°ΠΊΠΈΡ… ΠΏΡƒΠ»Π°Ρ…), процСсс исправлСния Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  1. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° локально
  2. Π˜Π½ΠΆΠ΅Π½Π΅Ρ€-программист Π½Π°ΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ послС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ настройки для ΠΏΡƒΠ»ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²
  3. Π˜Π½ΠΆΠ΅Π½Π΅Ρ€-программист обратится ΠΊ Ops, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ

На этом этапС процСсса 3 Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ настроСн Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ CI / CD ΠΈ ΡΠΎΠ±Π»ΡŽΠ΄Π΅Π½Ρ‹ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ — шаг 3 Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠΊΡΠΏΠ΅Ρ€Ρ‚Π½ΡƒΡŽ ΠΎΡ†Π΅Π½ΠΊΡƒ ΠΈ Π½Π΅ отслСТиваСтся ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ

Π•Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ распространСнный случай — ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ для особая услуга. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это самому?

Учитывая, Ρ‡Ρ‚ΠΎ сущСствуСт экспСртная ΠΎΡ†Π΅Π½ΠΊΠ°, это ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΊΠ°ΠΊ ΠΈ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

Π‘Π΅ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ значСния (ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π‘Π”, ΠΊΠ»ΡŽΡ‡ΠΈ доступа ΠΊ API ΠΈ Ρ‚. Π”.) Никогда Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² Ρ€Π΅ΠΏΠΎ.ΠŸΠ΅Ρ€ΠΈΠΎΠ΄.

Π­Ρ‚ΠΎΡ‚ аспСкт Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ «Гибкости», Π½ΠΎ Π΅Π³ΠΎ довольно Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Как? Π£ вас Π΅ΡΡ‚ΡŒ всС нСсСкрСтныС значСния Π² Ρ€Π΅ΠΏΠΎ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ сСкрСтныС значСния Π²ΠΎ врСмя развСртывания (я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ENV)

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΡŒ

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСобходимости ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ всю ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ срСды. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ систСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π·Π°Π΄Π°Π² порядок ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ с самого ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ значСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.Если Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позволяСт это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ — я Π±Ρ‹ взял это Π² любой дСнь.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: настройки ΠΏΡƒΠ»Π° соСдинСний с Π‘Π” ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ для всСх срСд (допустим, ΠΌΠΈΠ½: 2, макс: 10). Но для производствСнной срСды Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π±ΠΎΠ»Π΅Π΅ агрСссивный ΠΏΡƒΠ» (ΠΌΠΈΠ½: 10, макс: 80). Они Π΄Π΅Π»Π°ΡŽΡ‚ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ config

default.js:

  const  config = {
database: {
client: 'mysql',
connection: {
host: 'localhost',
user: '',
password: '',
database: '',
},
pool: {
min: 2,
max: 10,
},
},
}

ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.export = config;

production.js:

  const  config = {
database.pool: {
min: 10,
max: 80,
},
}

module.exports = config;

ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°

Π”ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ достиг ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²Π° Π½Π΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‡Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Π° ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ Π½Π΅Ρ‡Π΅Π³ΠΎ ΡƒΠ±ΠΈΡ€Π°Ρ‚ΡŒ.

Антуан Π΄Π΅ Π‘Π΅Π½Ρ‚-Π­ΠΊΠ·ΡŽΠΏΠ΅Ρ€ΠΈ

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ряд Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.Вопрос Π² Ρ‚ΠΎΠΌ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² свою инфраструктуру Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ количСства ошибок, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ

НСкоторыС ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я использовал:

  1. HashiCorp Vault — Ρ…ΠΎΡ€ΠΎΡˆΠΎ для управлСния сСкрСтами, Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ излишнС, Ссли Ρƒ вас Π½Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ 9000 микросСрвисов Π² дСсятках Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ΠΎΠ²
  2. Chef / Puppet / Ansible для управлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ — ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ, это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ инструмСнты для настройки сСрвСров, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ настраиваСмой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ всСгда ломаСтся
  3. БистСмы консСнсуса — ZooKeeper / etcd / consul.НСкоторыС люди ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΌ всю ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ Π·Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ прилоТСния Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв люди Π΄Π΅Π»Π°ΡŽΡ‚ это, ΠΊΠΎΠ³Π΄Π° Ρƒ Π½ΠΈΡ… ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈΠ· этих систСм (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ людСй, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Kubernetes, Π΅ΡΡ‚ΡŒ etcd ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ).

Π― Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ… с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ успСхом. Π•ΡΡ‚ΡŒ извСстная русская ΠΈΠ΄ΠΈΠΎΠΌΠ° Β«Π·Π°Π±ΠΈΡ‚ΡŒ Π³Π²ΠΎΠ·Π΄ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ микроскопа», ΠΈ ΠΌΠ½Π΅ всСгда казалось, Ρ‡Ρ‚ΠΎ это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Π΅ΠΌ я занимаюсь

Мой ΠΏΡƒΡ‚ΡŒ

Π’ Node.JS Π΅ΡΡ‚ΡŒ прСкрасная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, которая выполняСт всС Ρ‚Ρ€ΡŽΠΊΠΈ ΠΈ ΠΎΠ±ΠΌΠ°Π½ Π·Π° мСня. .Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

/
- package.json
- / src
- / config
- - /local.js
- - /default.js
- - /development.js
- - /production.js
- - /.js
- - /custom-environment-variables.js

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • local.js — содСрТит ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² .gitignore ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ появляСтся Π² Ρ€Π΅ΠΏΠΎ
  • default.js — содСрТит ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎ всСх срСдах, с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ сСкрСтными значСниями
  • — содСрТит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ пСрСопрСдСлСния для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ срСды. Π‘Ρ€Π΅Π΄Π° опрСдСляСтся с использованиСм NODE_ENV ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды
  • custom-environment-variables.js — сопоставляСт сСкрСтныС ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ env, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ·ΠΆΠ΅ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π²ΠΎ врСмя выполнСния

Π― ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π΅Π³ΠΎ с Kubernetes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сСкрСтныС значСния ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ рСпозитория находится здСсь

Π£Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ° ΠΈ Π½Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°ΠΉΡ‚Π΅ вСлосипСд!

Aerospike Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: ΠΊΠΎΠ½Ρ„ΠΈΠ³.js

 // ******************************************** ********************************
// АвторскоС ΠΏΡ€Π°Π²ΠΎ 2013-2020 Aerospike, Inc.
//
// Под Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ Apache License, вСрсия 2.0 («ЛицСнзия»)
// Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ„Π°ΠΉΠ», ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Π² соотвСтствии с Π›ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ.
// Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ копию Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ ΠΏΠΎ адрСсу
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Если это Π½Π΅ трСбуСтся Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°ΠΊΠΎΠ½ΠΎΠ΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ согласовано Π² письмСнной Ρ„ΠΎΡ€ΠΌΠ΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС
// распространяСтся ΠΏΠΎ Π›ΠΈΡ†Π΅Π½Π·ΠΈΠΈ распространяСтся Π½Π° ΠžΠ‘ΠΠžΠ’Π• "КАК Π•Π‘Π’Π¬",
// Π‘Π•Π— КАКИΠ₯-Π›Π˜Π‘Πž Π“ΠΠ ΠΠΠ’Π˜Π™ Π˜Π›Π˜ Π£Π‘Π›ΠžΠ’Π˜Π™, явных ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌΡ‹Ρ….// Π‘ΠΌ. Π›ΠΈΡ†Π΅Π½Π·ΠΈΡŽ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… языков, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ
// ограничСния ΠΏΠΎ Π›ΠΈΡ†Π΅Π½Π·ΠΈΠΈ.
// *********************************************** *****************************

'ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строго'

const policy = require ('./ policy')

const inspect = Symbol.for ('nodejs.util.inspect.custom')

/ **
 * Класс Config содСрТит настройки для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Aerospike.
 * экзСмпляр, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ список исходных хостов, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅
 * настройки.
 *
 * @throws {TypeError} Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ нСдопустимыС значСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.*
 * @ΠΏΡ€ΠΈΠΌΠ΅Ρ€
 *
 * const Aerospike = require ('aerospike')
 *
 * let config = {
 * хосты: '192.168.1.10,192.168.1.11',
 * ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ: process.env.DATABASE_USER,
 * ΠΏΠ°Ρ€ΠΎΠ»ΡŒ: process.env.DATABASE_PASSWORD,
 * policy: {
 * Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅: Π½ΠΎΠ²Ρ‹ΠΉ Aerospike.ReadPolicy ({
 * totalTimeout: 500
 *})
 *},
 *   Π±Ρ€Π΅Π²Π½ΠΎ: {
 * ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ: Aerospike.log.INFO,
 * file: 2 // Π²ΠΎΠΉΡ‚ΠΈ Π² stderr
 *}
 *}
 *
 * Aerospike.connect (ΠΊΠΎΠ½Ρ„ΠΈΠ³)
 * .then (client => {
 * // ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π³ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
 * ΠΊΠ»ΠΈΠ΅Π½Ρ‚.Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ()
 *})
 * .catch (error => {
 * console.error ('НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ кластСру:% s', error.message)
 *})
 * /
class Config {
  / **
   * Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ· Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
   *
   * @param {Object} [config] значСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
   * /
  constructor (config) {
    config = config || {}

    / **
     * @name Config # ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ
     * @summary Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для использования ΠΏΡ€ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² кластСрС.
     * @description ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ пустым для кластСров, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π±Π΅Π· управлСния доступом.* (Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ бСзопасности доступны Π² Aerospike Database Enterprise
     * ВСрсия.)
     * @type {строка}
     * /
    if (typeof config.user === 'строка') {
      this.user = config.user
    }

    / **
     * @name Config # ΠΏΠ°Ρ€ΠΎΠ»ΡŒ
     * @summary ΠŸΠ°Ρ€ΠΎΠ»ΡŒ для использования ΠΏΡ€ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² кластСрС.
     * @type {строка}
     * /
    if (typeof config.password === 'строка') {
      this.password = config.password
    }

    / **
     * @name Config # authMode
     * @summary Π Π΅ΠΆΠΈΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ / пароля.* @description Один ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² {@link module: aerospike.auth}.
     * @type {number}
     * @see ΠΌΠΎΠ΄ΡƒΠ»ΡŒ: aerospike.auth
     * /
    if (typeof config.authMode === 'number') {
      this.authMode = config.authMode
    }

    / **
     * @ имя Config # имя кластСра
     * @summary ОТидаСмоС имя кластСра.
     * @description Если Π½Π΅  null , сСрвСрныС ΡƒΠ·Π»Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ это
     * имя кластСра, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ взгляду ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° кластСр. Π”ΠΎΠ»ΠΆΠ΅Π½
     * устанавливаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ сСрвСрам, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ "имя-кластСра"
     * информационная ΠΊΠΎΠΌΠ°Π½Π΄Π°.* @type {строка}
     * @since v2.4
     * /
    this.clusterName = config.clusterName

    / **
     * @name Config # ΠΏΠΎΡ€Ρ‚
     * @summary ΠŸΠΎΡ€Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для использования для любого адрСса хоста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅
     * явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 3000.
     * @type {number}
     *
     * @since v2.4
     * /
    if (typeof config.port === 'number') {
      this.port = config.port
    } Π΅Ρ‰Π΅ {
      this.port = 3000
    }

    / **
     * @name Config # tls
     * @summary ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ бСзопасности транспортного уровня (TLS) для обСспСчСния бСзопасности
     * ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ кластСру Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ TLS Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ
     * Aerospike Server v3.9 ΠΈ зависит ΠΎΡ‚ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ вСрсии сСрвСра.
     * @type {Object}
     * @since v2.4
     *
     * @property {boolean} [enable = true] - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ TLS для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ сокСтов ΠΊ
     * ΡƒΠ·Π»Ρ‹ кластСра. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ TLS Π²ΠΊΠ»ΡŽΡ‡Π΅Π½, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли конфигурация ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
     * Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»  tls .
     * @property {строка} [cafile] - ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ сСртификата Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ Π¦Π‘. К
     * TLS ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС систСмныС сСртификаты Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ² сСртификации.* @property {строка} [capath] - ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… сСртификатов.
     * Π‘ΠΌ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π° страницС руководства OpenSSL SSL_CTX_load_verify_locations.
     * информация ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ справочника.
     * @property {строка} [ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹] - ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹. Π€ΠΎΡ€ΠΌΠ°Ρ‚
     * Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» SSL ΠΎΡ‚ Apache, описанный Π²
     * https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslprotocol. Если Π½Π΅
     * ΡƒΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ "-all + TLSv1.2". Если Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ
     * ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ для Π²Ρ‹Π±ΠΎΡ€Π° этой ΠΎΠΏΡ†ΠΈΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ.* @property {строка} [cipherSuite] - ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ ΡˆΠΈΡ„Ρ€ΠΎΠ². Π’
     * Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ списка ΡˆΠΈΡ„Ρ€ΠΎΠ² OpenSSL, описанный Π²
     * https://www.openssl.org/docs/manmaster/apps/ciphers.html. Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ
     * Π½Π°Π±ΠΎΡ€ ΡˆΠΈΡ„Ρ€ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ OpenSSL, описанный Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡŽ
     * Π±ΡƒΠ΄Π΅Ρ‚ использован. Если Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΡˆΠΈΡ„Ρ€ΠΎΠ² Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ эту ΠΎΠΏΡ†ΠΈΡŽ
     * Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ.
     * @property {строка} [certBlacklist] - ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ списка сСртификатов.* Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ строкС для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСртификата, занСсСнного Π² Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ список. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ
     * строка начинаСтся с порядкового Π½ΠΎΠΌΠ΅Ρ€Π° сСртификата, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ
     * запись ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ издатСля сСртификата. (Π‘Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ
     * Π½ΠΎΠΌΠ΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ эмитСнта.) ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ записСй:
     *  
867EC87482B2 / C = US / ST = CA / O = Acme / OU = Engineering / CN = Test Chain CA
* E2D4B0E570F9EF8E885C065899886461
* @property {string} [keyfile] - ΠŸΡƒΡ‚ΡŒ ΠΊ клиСнтскому ΠΊΠ»ΡŽΡ‡Ρƒ для Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ * аутСнтификация.По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ взаимная аутСнтификация ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π°. * @property {string} [keyfilePassword] - ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ * клиСнтский ΠΊΠ»ΡŽΡ‡ для Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ прСдполагаСтся ΠΊΠ»ΡŽΡ‡ * Π½Π΅ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ. * @property {string} [certfile] - ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ сСртификатов ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. * Ρ„Π°ΠΉΠ» для Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ взаимная аутСнтификация * ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½. * @property {boolean} [crlCheck = false] - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ CRL для * сСртификат листа Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ сСртификатов.Ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли подходящий CRL * НС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° CRL ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π°. * @property {boolean} [crlCheckAll = false] - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ CRL для * вся Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° сСртификатов. Ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли подходящий CRL Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ * Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° CRL ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π°. * @property {boolean} [logSessionInfo = false] - Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сСансС для * ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ соСдинСниС. * @property {boolean} [forLoginOnly = false] - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TLS-соСдинСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Ρ…ΠΎΠ΄Π° * аутСнтификация.ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ с сСрвСром Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹. * с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ Π±Π΅Π· TLS. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: false (Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TLS-соСдинСния для всСх * связь с сСрвСром.) * / if (typeof config.tls === 'object') { this.tls = config.tls } / ** * @summary Бписок хостов, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ. * @description Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ пытаСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ список хостов. * ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды AEROSPIKE_HOSTS , ΠΈΠ½Π°Ρ‡Π΅ ΡƒΠΏΠ°Π΄Π΅Ρ‚ * Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ использованию значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ "localhost".* @type {(ΠžΠ±ΡŠΠ΅ΠΊΡ‚ [] | строка)} * * @example Установка hosts с использованиСм String * * const Aerospike = require ('aerospike') * * var hosts = '192.168.0.1:3000,192.168.0.2:3000' * Aerospike.connect ({hosts: hosts}, (err, client) => { * if (err) throw err * // ... * client.close () *}) * * @example Установка hosts с использованиСм массива ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΈΠΌΠ΅Π½ΠΈ хоста / ΠΏΠΎΡ€Ρ‚Π° * * const Aerospike = require ('aerospike') * * var hosts = [ * {адрСс: '192.168.0.1 ', ΠΏΠΎΡ€Ρ‚: 3000}, * {адрСс: '192.168.0.2', ΠΏΠΎΡ€Ρ‚: 3000} *] * Aerospike.connect ({hosts: hosts}, (err, client) => { * if (err) throw err * // ... * client.close () *}) * / this.hosts = config.hosts || process.env.AEROSPIKE_HOSTS || `localhost: $ {this.port}` / ** * @summary Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ клиСнтскиС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ. * * @description ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ опрСдСляСт ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для * заявлСниС. ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ * Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ для всСх Π²ΠΈΠ΄ΠΎΠ² использования ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ * использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.* * КаТдая опСрация с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ для этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ * Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π­Ρ‚ΠΎ считаСтся локальной ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ ΠΈ являСтся ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ использования. * Π­Ρ‚Π° локальная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° замСняСт Π»ΡŽΠ±ΡƒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ. * * Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ являСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ * глобальная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° для этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Если глобальная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° для этого * опСрация Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚ΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ глобальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * * Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ использовании * опСрация для использования, Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠ°ΠΊ * {@link Config # policy}.* * НапримСр, опСрация {@link Client # put} ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ {@link * ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ WritePolicy}. Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ настраиваСтС {@link * WritePolicy # key} Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° {@link Client.put}, Π·Π°Ρ‚Π΅ΠΌ * ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ {@link WritePolicy} Π² * {@link Config # policy}, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ всСми опСрациями. * * @type {Config ~ Policies} * * @example Установка ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ key ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ записи * * const Aerospike = require ('aerospike') * * let config = { * policy: { * Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅: Π½ΠΎΠ²Ρ‹ΠΉ Аэроспайк.WritePolicy ({ * ΠΊΠ»ΡŽΡ‡: Aerospike.policy.key.SEND *}) *} *} * let key = new Aerospike.Key ('test', 'demo', 123). * * Aerospike.connect (ΠΊΠΎΠ½Ρ„ΠΈΠ³) * .then (client => { * return client.put (ΠΊΠ»ΡŽΡ‡, {int: 42}) * .then (() => client.close ()) * .catch (error => { * client.close () * Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ *}) *}) * .catch (console.error) * / this.policies = {} if (typeof config.policy === 'object') { this.setDefaultPolicies (config.policies) } / ** * @name Config # ΠΆΡƒΡ€Π½Π°Π» * @summary ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ для вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°, выполняСмого ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. * @type {Object} * * @property {Number} [log.level] - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π»ΠΎΠ³Π°; см. {@link * module: aerospike.log} для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. * @property {Number} [log.file] - дСскриптор Ρ„Π°ΠΉΠ»Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ * fs.open () ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· process.stdout.fd ΠΈΠ»ΠΈ * <ΠΊΠΎΠ΄> process.stderr.fd . * * @example Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ вСдСния ΠΆΡƒΡ€Π½Π°Π»Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° * * const Aerospike = require ('aerospike') * const fs = require ('fs') * * var debuglog = fs.openSync ('./ debug.log') * var config = { * Π±Ρ€Π΅Π²Π½ΠΎ: { * ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ: Aerospike.log.DEBUG, * Ρ„Π°ΠΉΠ»: debuglog *} *} * Aerospike.connect (config, (err, client) => { * if (err) throw err * // ... * client.close () *}) * / if (typeof config.log === 'object') { this.log = config.log } / ** * @ имя Config # connTimeoutMs * @summary ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ врСмя оТидания соСдинСния с хостом Π² миллисСкундах. * @description ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ этот Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ соСдинСния с * кластСр Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅. * @type {number} * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 1000 * / if (Number.isInteger (config.connTimeoutMs)) { this.connTimeoutMs = config.connTimeoutMs } / ** * @name Config # loginTimeoutMs * ВрСмя оТидания Π²Ρ…ΠΎΠ΄Π° Π² ΡƒΠ·Π΅Π» @summary Π² миллисСкундах.* @type {number} * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 5000 * / if (Number.isInteger (config.loginTimeoutMs)) { this.loginTimeoutMs = config.loginTimeoutMs } / ** * @name Config # maxSocketIdle * * @summary МаксимальноС врСмя простоя сокСта Π² сСкундах. * * @description ΠŸΡƒΠ»Ρ‹ соСдинСний Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ сокСты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ * Π΄Π»ΠΈΠ½Π½Π΅Π΅ максимального. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ 24 часами (86400). * * Π’Π°ΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° нСсколько сСкунд мСньшС, Ρ‡Π΅ΠΌ Π½Π° сСрвСрС. * proto-fd-idle-ms (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 60000 миллисСкунд ΠΈΠ»ΠΈ 1 ΠΌΠΈΠ½ΡƒΡ‚Π°), * поэтому ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ пытаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сокСт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Π±Ρ‹Π» * поТинаСтся сСрвСром.* * ΠŸΡƒΠ»Ρ‹ соСдинСний Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ стСком LIFO. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° * хвостовая Ρ‡Π°ΡΡ‚ΡŒ стСка всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ мСньшС всСго. Π­Ρ‚ΠΈ связи * провСряСтся Π½Π° maxSocketIdle ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 30 стандартных ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ * (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 30 сСкунд). * * @type {number} * * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 55 сСкунд * / if (Number.isInteger (config.maxSocketIdle)) { this.maxSocketIdle = config.maxSocketIdle } / ** * @name Config # TenderInterval * @summary Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» опроса Π² миллисСкундах для кластСрного Ρ‚Π΅Π½Π΄Π΅Ρ€Π°.* @type {number} * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 1000 * / if (Number.isInteger (config.tenderInterval)) { this.tenderInterval = config.tenderInterval } / ** * @ имя Config # maxConnsPerNode * * @summary МаксимальноС количСство асинхронных ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… Π½Π° сСрвСрный ΡƒΠ·Π΅Π». * * @description НовыС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ {@link * ΠΌΠΎΠ΄ΡƒΠ»ΡŒ: aerospike / status.ERR_NO_MORE_CONNECTIONS | ERR_NO_MORE_CONNECTIONS} * ошибка ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ Π»ΠΈΠΌΠΈΡ‚Π°. * * @type {number} * * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 300 * / Ссли (Число.isInteger (config.maxConnsPerNode)) { this.maxConnsPerNode = config.maxConnsPerNode } / ** * @name Config # minConnsPerNode * * @summary МинимальноС количСство асинхронных ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… Π½Π° сСрвСрный ΡƒΠ·Π΅Π». * * @description ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ распрСдСляСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ соСдинСния ΠΏΡ€ΠΈ создании клиСнтского ΡƒΠ·Π»Π°. Π’ * ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ пСриодичСски Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ссли количСство ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈΠΆΠ΅ * ΠΌΠΈΠ½ соСдинСний. * * Π‘Π΅Ρ€Π²Π΅Ρ€ proto-fd-idle-ms Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½ΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ * сущСствСнно, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ соСдинСния.Π’ * proto-fd-idle-ms ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сСрвСру Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ * соСдинСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π΅Π·Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 60 сСкунд, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ†Π΅Π»ΡŒ * сохранСниС связСй Π² Ρ€Π΅Π·Π΅Ρ€Π²Π΅ Π½Π° случай Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ всплСска активности. * * Если сСрвСр proto-fd-idle-ms ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ {@link * Config # maxSocketIdle} Ρ‚Π°ΠΊΠΆΠ΅ слСдуСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° нСсколько сСкунд мСньшС * Ρ‡Π΅ΠΌ proto-fd-idle-ms . * * @type {number} * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0 * / Ссли (Число.isInteger (config.minConnsPerNode)) { this.minConnsPerNode = config.minConnsPerNode } if (typeof config.modlua === 'object') { / ** * @summary ЗначСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ mod-lua. * @description Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (UDF) для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ * Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запроса (Ρ‚.Π΅. Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ), Ρ‚ΠΎΠ³Π΄Π° Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ * настройки modlua . ОсобоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ * modelua.userPath , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ * клиСнтская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Lua для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.* @type {Object} * * @property {строка} [modlua.userPath] - ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ скриптам Lua. * / this.modlua = Object.assign ({}, config.modlua) } / ** * @name Config # sharedMemory * @summary ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΎΠ±Ρ‰Π΅ΠΉ памяти. * @description Π­Ρ‚ΠΎ позволяСт нСскольким экзСмплярам ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… * процСссы Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС для ΠΎΠ±ΠΌΠ΅Π½Π° статусом кластСра, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠ·Π»Ρ‹ ΠΈ * Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ€Ρ‚ раздСлСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ сСгмСнт раздСляСмой памяти содСрТит состояниС для ΠΎΠ΄Π½ΠΎΠ³ΠΎ * ΠšΠ»Π°ΡΡ‚Π΅Ρ€ Aerospike.Если Π΅ΡΡ‚ΡŒ нСсколько кластСров Aerospike, Π΄Ρ€ΡƒΠ³ΠΎΠΉ * ΠΊΠ»ΡŽΡ‡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ кластСра. * @type {Object} * @ см. {@link http://www.aerospike.com/docs/client/c/usage/shm.html#operational-notes| ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎ эксплуатации} * @tutorial node_clusters * * @property {boolean} [enable = true] - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ / ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ использованиС * ΠžΠ±Ρ‰Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ. * @property {number} ΠΊΠ»ΡŽΡ‡ - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСгмСнта раздСляСмой памяти * связан с Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ кластСром Aerospike; Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ * ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° всСх клиСнтских экзСмплярах, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ кластСру.* @property {number} [maxNodes = 16] - устанавливаСт макс. количСство * сСрвСрныС ΡƒΠ·Π»Ρ‹ Π² кластСрС - это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ трСбуСтся для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ‰Π΅Π³ΠΎ * сСгмСнт памяти. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ оставили ΠΏΠΎΠ΄ΡƒΡˆΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ фактичСским сСрвСрным ΡƒΠ·Π»ΠΎΠΌ * cound ΠΈ maxNodes , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Π±Π΅Π· * ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. * @property {number} [maxNamespaces = 8] - устанавливаСт макс. количСство * пространства ΠΈΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² кластСрС - это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ трСбуСтся для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ‰Π΅Π³ΠΎ * сСгмСнт памяти.Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ оставляСтС ΠΏΠΎΠ΄ΡƒΡˆΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ фактичСским пространством ΠΈΠΌΠ΅Π½ * count ΠΈ maxNamespaces , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ пространства ΠΈΠΌΠ΅Π½ * Π±Π΅Π· пСрСбронирования ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. * @property {number} [takeoverThresholdSeconds = 30] - срок дСйствия * врСмя Π² сСкундах для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ сСгмСнта раздСляСмой памяти; Ссли кластСр * статус Π½Π΅ Π±Ρ‹Π» ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ послС этого количСства сСкунд Π΄Ρ€ΡƒΠ³ΠΎΠΉ клиСнтский экзСмпляр * Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚ Π½Π° сСбя обслуТиваниС кластСра с ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. * * @example ИспользованиС ΠΎΠ±Ρ‰Π΅ΠΉ памяти Π² кластСрной установкС * * const Aerospike = require ('aerospike') * const cluster = require ('кластСр') * * const config = { * ΠžΠ±Ρ‰Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ: { * ΠΊΠ»ΡŽΡ‡: 0xa5000000 *} *} * const client = Aerospike.ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (конфигурация) * const noWorkers = 4 * * if (cluster.isMaster) { * // ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы * for (var i = 0; i {if (err) throw err}) * * // ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ входящиС HTTP-запросы ΠΈ Ρ‚. Π΄. * // http.createServer ((запрос, ΠΎΡ‚Π²Π΅Ρ‚) => {...}) * * // Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС с Π‘Π” ΠΏΡ€ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ * ΠΊΠ»ΠΈΠ΅Π½Ρ‚.Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ() *} * / if (typeof config.sharedMemory === 'object') { this.sharedMemory = config.sharedMemory } / ** * @name Config # useAlternateAccessAddress * @summary Π”ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвСр * Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ-адрСс-доступа вмСсто * адрСс-доступа . * * @type {логичСский} * @default false * @since v3.7.1 * / this.useAlternateAccessAddress = Boolean (config.useAlternateAccessAddress) / ** * @name Config # rackAware * @summary ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… стойки сСрвСра.* @description Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ чтСния Π² * сСрвСрный ΡƒΠ·Π΅Π», содСрТащий ΠΊΠ»ΡŽΡ‡ ΠΈ находящийся Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ стойкС, Ρ‡Ρ‚ΠΎ ΠΈ * ΠΊΠ»ΠΈΠ΅Π½Ρ‚. Π­Ρ‚ΠΎ способствуСт сниТСнию Π·Π°Ρ‚Ρ€Π°Ρ‚ поставщика ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… услуг, ΠΊΠΎΠ³Π΄Π° ΡƒΠ·Π»Ρ‹ * распрСдСлСны ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ стойкам / Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. * * ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ {@link Config # rackId rackId}, {@link * module: aerospike / policy.replica PREFER_RACK} ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈ сСрвСр * конфигурация стойки Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ настроСна для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. * * @type {логичСский} * @default false * @since 3.8.0 * / this.rackAware = config.rackAware / ** * @ имя Config # RackId * @summary Π‘Ρ‚ΠΎΠΉΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится этот клиСнтский экзСмпляр. * @description {@link Config # rackAware rackAware} config, {@link * module: aerospike / policy.replica PREFER_RACK} ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈ сСрвСр * конфигурация стойки Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ настроСна для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. * * @type {number} * @ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0 * @since 3.8.0 * / if (Number.isInteger (config.rackId)) { this.rackId = config.rackId } } / ** * УстановитС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ. * * @param {Config ~ Policies} ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ нСсколько ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ * @throws {TypeError}, Ссли ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π½Π΅ * Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ * / setDefaultPolicies (ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ) { for (Ρ‚ΠΈΠΏ const Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅) { значСния const = ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ [Ρ‚ΠΈΠΏ] this.policies [Ρ‚ΠΈΠΏ] = policy.createPolicy (Ρ‚ΠΈΠΏ, значСния) } } / ** * ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ инспСктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ маскируСт свойство пароля ΠΏΡ€ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ * config.* * @частный * / [ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ] () { const copy = Object.assign ({}, это) if (this.password! == undefined) { Object.assign (копия, {ΠΏΠ°Ρ€ΠΎΠ»ΡŒ: '[Π€Π˜Π›Π¬Π’Π ]'}) } Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ копию } } / ** * @typedef {Object} ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ~ ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ * * @property {ApplyPolicy} apply - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° примСнСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ * @property {BatchPolicy} batch - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * @property {InfoPolicy} info - информационная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * @property {OperatePolicy} operation - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * @property {ReadPolicy} read - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° чтСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * @property {RemovePolicy} remove - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° удалСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * @property {ScanPolicy} scan - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° сканирования ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. * запрос @property {QueryPolicy} - ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° запросов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ * @property {WritePolicy} write - ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° записи ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ * / ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.экспорт = ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *