From 26f87bb7ecd6061f2e61b5cef28fb38699af02b9 Mon Sep 17 00:00:00 2001 From: Alexander Sokolov Date: Thu, 16 Aug 2018 20:41:20 +0300 Subject: [PATCH] docs: [RU] Translation done (#2227) --- docs/.vuepress/config.js | 94 ++ docs/ru/README.md | 56 + docs/ru/config/README.md | 418 +++++++ docs/ru/dev-guide/plugin-dev.md | 334 ++++++ docs/ru/dev-guide/ui-api.md | 1340 +++++++++++++++++++++++ docs/ru/dev-guide/ui-info.md | 41 + docs/ru/dev-guide/ui-localization.md | 60 + docs/ru/guide/README.md | 55 + docs/ru/guide/browser-compatibility.md | 78 ++ docs/ru/guide/build-targets.md | 132 +++ docs/ru/guide/cli-service.md | 139 +++ docs/ru/guide/creating-a-project.md | 79 ++ docs/ru/guide/css.md | 141 +++ docs/ru/guide/deployment.md | 275 +++++ docs/ru/guide/html-and-static-assets.md | 197 ++++ docs/ru/guide/installation.md | 26 + docs/ru/guide/mode-and-env.md | 95 ++ docs/ru/guide/plugins-and-presets.md | 213 ++++ docs/ru/guide/prototyping.md | 69 ++ docs/ru/guide/webpack.md | 191 ++++ 20 files changed, 4033 insertions(+) create mode 100644 docs/ru/README.md create mode 100644 docs/ru/config/README.md create mode 100644 docs/ru/dev-guide/plugin-dev.md create mode 100644 docs/ru/dev-guide/ui-api.md create mode 100644 docs/ru/dev-guide/ui-info.md create mode 100644 docs/ru/dev-guide/ui-localization.md create mode 100644 docs/ru/guide/README.md create mode 100644 docs/ru/guide/browser-compatibility.md create mode 100644 docs/ru/guide/build-targets.md create mode 100644 docs/ru/guide/cli-service.md create mode 100644 docs/ru/guide/creating-a-project.md create mode 100644 docs/ru/guide/css.md create mode 100644 docs/ru/guide/deployment.md create mode 100644 docs/ru/guide/html-and-static-assets.md create mode 100644 docs/ru/guide/installation.md create mode 100644 docs/ru/guide/mode-and-env.md create mode 100644 docs/ru/guide/plugins-and-presets.md create mode 100644 docs/ru/guide/prototyping.md create mode 100644 docs/ru/guide/webpack.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 098ca54fb0..248dd6d6d7 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -10,6 +10,11 @@ module.exports = { title: 'Vue CLI 3', description: 'πŸ› οΈ Vue.js εΌ€ε‘ηš„ζ ‡ε‡†ε·₯ε…·' }, + '/ru/': { + lang: 'ru', + title: 'Vue CLI 3', + description: 'πŸ› οΈ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ инструмСнтарий для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Vue.js' + } }, serviceWorker: true, theme: 'vue', @@ -197,6 +202,95 @@ module.exports = { } ] } + }, + '/ru/': { + label: 'Русский', + selectText: 'ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹', + lastUpdated: 'ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅', + editLinkText: 'Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту страницу Π½Π° GitHub', + serviceWorker: { + updatePopup: { + message: 'Доступно ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°', + buttonText: 'ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ' + } + }, + nav: [ + { + text: 'Руководство', + link: '/ru/guide/' + }, + { + text: 'ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ', + link: '/ru/config/' + }, + { + text: 'Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²', + items: [ + { text: 'Руководство ΠΏΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅', link: '/ru/dev-guide/plugin-dev.md' }, + { text: 'Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π΅ Π² UI', link: '/ru/dev-guide/ui-info.md' }, + { text: 'API ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² UI', link: '/ru/dev-guide/ui-api.md' }, + { text: 'Локализация Π² UI', link: '/ru/dev-guide/ui-localization.md' } + ] + }, + { + text: 'ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹', + items: [ + { text: 'Babel', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel' }, + { text: 'Typescript', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-typescript' }, + { text: 'ESLint', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint' }, + { text: 'PWA', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa' }, + { text: 'Jest', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-unit-jest' }, + { text: 'Mocha', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-unit-mocha' }, + { text: 'Cypress', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-e2e-cypress' }, + { text: 'Nightwatch', link: 'https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-e2e-nightwatch' } + ] + }, + { + text: 'Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ', + link: 'https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md' + } + ], + sidebar: { + '/ru/guide/': [ + '/ru/guide/', + '/ru/guide/installation', + { + title: 'ΠžΡΠ½ΠΎΠ²Ρ‹', + collapsable: false, + children: [ + '/ru/guide/prototyping', + '/ru/guide/creating-a-project', + '/ru/guide/plugins-and-presets', + '/ru/guide/cli-service' + ] + }, + { + title: 'Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°', + collapsable: false, + children: [ + '/ru/guide/browser-compatibility', + '/ru/guide/html-and-static-assets', + '/ru/guide/css', + '/ru/guide/webpack', + '/ru/guide/mode-and-env', + '/ru/guide/build-targets', + '/ru/guide/deployment' + ] + } + ], + '/ru/dev-guide/': [ + '/ru/dev-guide/plugin-dev.md', + { + title: 'Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° UI', + collapsable: false, + children: [ + '/ru/dev-guide/ui-info.md', + '/ru/dev-guide/ui-api.md', + '/ru/dev-guide/ui-localization.md' + ] + } + ] + } } } } diff --git a/docs/ru/README.md b/docs/ru/README.md new file mode 100644 index 0000000000..0d0176f321 --- /dev/null +++ b/docs/ru/README.md @@ -0,0 +1,56 @@ +--- +home: true +heroImage: /logo.png +actionText: Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ β†’ +actionLink: /ru/guide/ +footer: MIT Licensed | Copyright Β© 2018-present Evan You +--- + +
+ +
+ +
+
+

Π‘ΠΎΠ³Π°Ρ‚Ρ‹Π΅ возмоТности

+

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Babel, TypeScript, ESLint, PostCSS, PWA, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС & End-to-end тСстированиС.

+
+
+

Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ

+

БистСма ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² позволяСт сообщСству ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ для ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡.

+
+
+

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

+

Vue CLI ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ настраиваСтся Π±Π΅Π· извлСчСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Π΄ΠΎΠ»Π³ΠΎΠΉ Π³ΠΎΠ½ΠΊΠ΅.

+
+
+

ГрафичСский ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс

+

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вашими ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· графичСский интСрфСйс.

+
+
+

МгновСнноС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

+

ΠœΠ³Π½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π²Π°ΡˆΠΈΡ… Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ΄Π΅ΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Vue.

+
+
+

Π“ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌΡƒ

+

Π‘ Π»Ρ‘Π³ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π² ES2015 для соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ², ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ваши ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Vue ΠΊΠ°ΠΊ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

+
+
+ +## Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ + +Установка: + +``` bash +npm install -g @vue/cli +# Π˜Π›Π˜ +yarn global add @vue/cli +``` + +Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: + +``` bash +vue create my-project +# Π˜Π›Π˜ +vue ui +``` diff --git a/docs/ru/config/README.md b/docs/ru/config/README.md new file mode 100644 index 0000000000..a0f40777e8 --- /dev/null +++ b/docs/ru/config/README.md @@ -0,0 +1,418 @@ +--- +sidebar: auto +--- + +# ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ + + + +## Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ конфигурация CLI + +НСкоторыС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ настройки для `@vue/cli`, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ваши Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ прСсСты настроСк, сохранСны Π² JSON-Ρ„Π°ΠΉΠ»Π΅ `.vuerc` Π² вашСм домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ для измСнСния этих настроСк. + +Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `vue config` для изучСния ΠΈΠ»ΠΈ измСнСния глобальной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ CLI. + +## Π¦Π΅Π»Π΅Π²Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ + +ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ](../guide/browser-compatibility.md#browserslist). + +## vue.config.js + +`vue.config.js` β€” ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ `@vue/cli-service` Ссли Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (рядом с Ρ„Π°ΠΉΠ»ΠΎΠΌ `package.json`). Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ `vue` Π² `package.json`, Π½ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JSON-совмСстимыми значСниями. + +Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с настройками: + +``` js +// vue.config.js +module.exports = { + // настройки... +} +``` + +### baseUrl + +- Π’ΠΈΠΏ: `string` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `'/'` + + Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ URL-адрСс сборки вашСго прилоТСния, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ. Π­Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ ΠΎΠΏΡ†ΠΈΠΈ webpack `output.publicPath`, Π½ΠΎ Vue CLI Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… цСлях, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ **всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `baseUrl` вмСсто измСнСния ΠΎΠΏΡ†ΠΈΠΈ `output.publicPath`**. + + По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Vue CLI считаСт, Ρ‡Ρ‚ΠΎ публикация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄ΠΎΠΌΠ΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `https://www.my-app.com/`. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ публикуСтся Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ этот ΠΏΡƒΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΎΠΏΡ†ΠΈΠΈ. НапримСр, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ адрСсу `https://www.foobar.com/my-app/`, установитС `baseUrl` Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `'/my-app/'`. + + Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустой строкой (`''`) ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ (`./`), Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС рСсурсы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈΡΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ сборку Π² любой ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Cordova. + + ::: warning ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ baseUrl + ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ `baseUrl` ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния ΠΈ Π΅Π³ΠΎ слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ссли: + + - Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ HTML5 `history.pushState`; + + - Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΎΠΏΡ†ΠΈΡŽ `pages` для создания многостраничного прилоТСния (MPA). + ::: + + ΠžΠΏΡ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈ Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ· корня сайта, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ: + + ``` js + module.exports = { + baseUrl: process.env.NODE_ENV === 'production' + ? '/production-sub-path/' + : '/' + } + ``` + +### outputDir + +- Π’ΠΈΠΏ: `string` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `'dist'` + + ΠšΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈ запускС `vue-cli-service build` Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»Ρ‹ сборки для production. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ удаляСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ сборки (это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ `--no-clean` Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ сборки). + + ::: tip Π‘ΠΎΠ²Π΅Ρ‚ + ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `outputDir` вмСсто измСнСния ΠΎΠΏΡ†ΠΈΠΈ webpack `output.path`. + ::: + +### assetsDir + +- Π’ΠΈΠΏ: `string` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `''` + + ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ `outputDir`) для хранСния сгСнСрированных статичСских рСсурсов (js, css, img, fonts). + + ::: tip Π‘ΠΎΠ²Π΅Ρ‚ + `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`); + - ΠΈΠ»ΠΈ строкой, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ свою `entry`. + + ``` js + module.exports = { + pages: { + index: { + // Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° для страницы + entry: 'src/index/main.js', + // исходный шаблон + template: 'public/index.html', + // Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ dist/index.html + filename: 'index.html', + // ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опция title, Ρ‚ΠΎ Π² шаблонС + // Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ <title><%= htmlWebpackPlugin.options.title %> + title: 'Index Page', + // всС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹, добавляСмыС Π½Π° этой страницС, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ + // это ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΈ Π²Π΅Π½Π΄ΠΎΡ€Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚. + chunks: ['chunk-vendors', 'chunk-common', 'index'] + }, + // ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ строковый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°, Ρ‚ΠΎ + // шаблон Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ `public/subpage.html`, + // Π° Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎ `public/index.html`. + // Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ `subpage.html`. + subpage: 'src/subpage/main.js' + } + } + ``` + + ::: tip Π‘ΠΎΠ²Π΅Ρ‚ + ΠŸΡ€ΠΈ сборкС Π² многостраничном Ρ€Π΅ΠΆΠΈΠΌΠ΅, конфигурация webpack Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ (Π±ΡƒΠ΄ΡƒΡ‚ нСсколько экзСмпляров `html-webpack-plugin` ΠΈ `preload-webpack-plugin`). Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² коррСктности, провСряйтС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `vue inspect`, Ссли Π²Ρ‹ измСняСтС настройки для этих ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². + ::: + +### lintOnSave + +- Π’ΠΈΠΏ: `boolean | 'error'` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `true` + + Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΠΈ Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ сохранСнии Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [eslint-loader](https://github.com/webpack-contrib/eslint-loader). Π­Ρ‚Π° опция дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° установлСн ΠΏΠ»Π°Π³ΠΈΠ½ [`@vue/cli-plugin-eslint`](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint). + + Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `true`, `eslint-loader` ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ошибки Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° ΠΊΠ°ΠΊ прСдупрСТдСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ прСдупрСТдСния выводятся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΈ Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ сборку ошибкой. + + Π§Ρ‚ΠΎΠ±Ρ‹ ошибки Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈΡΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ `lintOnSave: 'error'`. Π’ΠΎΠ³Π΄Π° `eslint-loader` Π±ΡƒΠ΄Π΅Ρ‚ всСгда Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ошибки Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ сборку ошибкой. + + ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ошибок: + + ``` js + // vue.config.js + module.exports = { + devServer: { + overlay: { + warnings: true, + errors: true + } + } + } + ``` + + Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `lintOnSave` приводится ΠΊ `true`, `eslint-loader` Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Ρ‚Π°ΠΊ ΠΈ Π² production. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ `eslint-loader` ΠΏΡ€ΠΈ сборкС Π² production, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ: + + ``` js + // vue.config.js + module.exports = { + lintOnSave: process.env.NODE_ENV !== 'production' + } + ``` + +### runtimeCompiler + +- Π’ΠΈΠΏ: `boolean` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `false` + + ИспользованиС сборки Vue которая содСрТит компилятор шаблонов. Установка значСния Π² `true` ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ `template` Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Vue, Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ 10 ΠšΠ‘Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π° Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. + + Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅: [Runtime + ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ vs. Runtime-only](https://ru.vuejs.org/v2/guide/installation.html#Runtime-ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€-vs-Runtime-only). + +### transpileDependencies + +- Π’ΠΈΠΏ: `Array` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `[]` + + По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `babel-loader` ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· `node_modules`. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ явно Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Babel, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² этой ΠΎΠΏΡ†ΠΈΠΈ. + +### productionSourceMap + +- Π’ΠΈΠΏ: `boolean` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `true` + + Установка Π² `false` ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ сборку для production, Ссли Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ source maps. + +### crossorigin + +- Π’ΠΈΠΏ: `string` +- По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `undefined` + + Настройка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² `crossorigin` для Ρ‚Π΅Π³ΠΎΠ² `` ΠΈ ` +``` + +Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько Π·Π°ΠΌΠ΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅, хотя Π²Π°ΠΌ потрСбуСтся ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ строки для Π·Π°ΠΌΠ΅Π½Ρ‹ Π² Π±Π»ΠΎΠΊΠΈ ΠΈΠ· `<%# REPLACE %>` ΠΈ `<%# END_REPLACE %>`: + +``` ejs +--- +extend: '@vue/cli-service/generator/template/src/App.vue' +replace: + - !!js/regexp /Welcome to Your Vue\.js App/ + - !!js/regexp / +<%# END_REPLACE %> +``` + +#### ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² + +Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» шаблона, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ начинаСтся с Ρ‚ΠΎΡ‡ΠΊΠΈ (Ρ‚.Π΅. `.env`) Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ соглашСнию ΠΏΠΎ имСнованию, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹Π΅ с Ρ‚ΠΎΡ‡ΠΊΠΈ (dotfiles) ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ вашСго ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² npm: +``` +# dotfile ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символ подчёркивания вмСсто Ρ‚ΠΎΡ‡ΠΊΠΈ: + +/generator/template/_env + +# ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ api.render('./template'), это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€Π΅Π½ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ: + +.env +``` +Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ соглашСнию ΠΏΠΎ имСнованию Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ», Ρ‡ΡŒΡ‘ имя начинаСтся с подчёркивания: +``` +# Ρ‚Π°ΠΊΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° символа подчёркивания вмСсто Ρ‚ΠΎΡ‡ΠΊΠΈ: + +/generator/template/__variables.scss + +# ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ api.render('./template'), это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€Π΅Π½ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ: + +_variables.scss +``` + +### Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки + +#### Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки для встроСнных ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² + +Волько встроСнныС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ исходныС подсказки ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ подсказок располоТСны [Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° `@vue/cli`][prompt-modules]. + +ΠœΠΎΠ΄ΡƒΠ»ΡŒ подсказок Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ экзСмпляр [PromptModuleAPI][prompt-api]. Подсказки прСдставлСны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [inquirer](https://github.com/SBoudrias/Inquirer.js) ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: + +``` js +module.exports = api => { + // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ возмоТности Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π²Ρ‹Π±ΠΎΡ€Π° inquirer + api.injectFeature({ + name: 'Какая-Ρ‚ΠΎ супСрская Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ', + value: 'my-feature' + }) + + // injectPrompt ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ подсказки inquirer + api.injectPrompt({ + name: 'someFlag', + // ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ подсказка отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Ρ‹Π±Ρ€Π°Π½Π° ваша функция + when: answers => answers.features.include('my-feature'), + message: 'Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ foo?', + type: 'confirm' + }) + + // ΠΊΠΎΠ³Π΄Π° всС подсказки Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹, внСдряйтС ваш ΠΏΠ»Π°Π³ΠΈΠ½ Π² настройки, + // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ + api.onPromptComplete((answers, options) => { + if (answers.features.includes('my-feature')) { + options.plugins['vue-cli-plugin-my-feature'] = { + someFlag: answers.someFlag + } + } + }) +} +``` + +#### Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки для сторонних ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² + +ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ сторонних Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ создан, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `vue invoke`. Если ΠΏΠ»Π°Π³ΠΈΠ½ содСрТит `prompts.js` Π² своём ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ использован Π²ΠΎ врСмя Π²Ρ‹Π·ΠΎΠ²Π°. Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив [вопросов](https://github.com/SBoudrias/Inquirer.js#question), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Inquirer.js. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² качСствС настроСк. + +Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ подсказки ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: + +``` bash +vue invoke my-plugin --mode awesome +``` + +## РаспространСниС ΠΏΠ»Π°Π³ΠΈΠ½Π° + +Π§Ρ‚ΠΎΠ±Ρ‹ CLI-ΠΏΠ»Π°Π³ΠΈΠ½ ΠΌΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π½Π° npm ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡΡΡŒ соглашСния ΠΏΠΎ имСнованию `vue-cli-plugin-`. БлСдуя соглашСнию ΠΏΠΎ имСнованию ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΠ»Π°Π³ΠΈΠ½Ρƒ Π±Ρ‹Ρ‚ΡŒ: + +- Π›Π΅Π³ΠΊΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `@vue/cli-service`; +- Π›Π΅Π³ΠΊΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· поиск; +- Π£ΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· `vue add ` ΠΈΠ»ΠΈ `vue invoke `. + +## ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Core-ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² + +::: tip ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ +Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, Ссли Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π°Π΄ встроСнным ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ нСпосрСдствСнно Π²Π½ΡƒΡ‚Ρ€ΠΈ `vuejs/vue-cli` рСпозитория. +::: + +Плагин с Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ внСдряСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ зависимости, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `chai` внСдряСтся `@vue/cli-plugin-unit-mocha/generator/index.js`) Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ эти зависимости Π² собствСнном ΠΏΠΎΠ»Π΅ `devDependencies`. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚: + +1. Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ всСгда сущСствуСт Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ `node_modules` рСпозитория, поэтому Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ тСстировании. + +2. Ρ‡Ρ‚ΠΎ `yarn.lock` остаётся постоянным, поэтому CI смоТСт Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. + +[creator-class]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli/lib/Creator.js +[service-class]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli-service/lib/Service.js +[generator-api]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli/lib/GeneratorAPI.js +[commands]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli-service/lib/commands +[config]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli-service/lib/config +[plugin-api]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli-service/lib/PluginAPI.js +[prompt-modules]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli/lib/promptModules +[prompt-api]: https://github.com/vuejs/vue-cli/tree/dev/packages/@vue/cli/lib/PromptModuleAPI.js diff --git a/docs/ru/dev-guide/ui-api.md b/docs/ru/dev-guide/ui-api.md new file mode 100644 index 0000000000..5978d341dc --- /dev/null +++ b/docs/ru/dev-guide/ui-api.md @@ -0,0 +1,1340 @@ +# API ΠΏΠ»Π°Π³ΠΈΠ½Π° для UI + +Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ API `cli-ui` Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами. + +![UI Plugin architecture](/vue-cli-ui-schema.png) + +## Π€Π°ΠΉΠ»Ρ‹ UI + +Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ установлСнного vue-cli ΠΏΠ»Π°Π³ΠΈΠ½Π° cli-ui попытаСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» `ui.js` ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΠ»Π°Π³ΠΈΠ½Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `ui/index.js`). + +Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `api` Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: + +```js +module.exports = api => { + // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ API здСсь... +} +``` + +**⚠️ Π€Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ списка ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π½Π° страницС Β«ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Β». Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ измСнСния, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Β» Π² Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ слСва Π² UI.** + +Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ структуры ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° для vue-cli ΠΏΠ»Π°Π³ΠΈΠ½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ UI API: + +``` +- vue-cli-plugin-test + - package.json + - index.js + - generator.js + - prompts.js + - ui.js + - logo.png +``` + +### Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ доступ ΠΊ API ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ для этого, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ `vuePlugins.ui` Π² Ρ„Π°ΠΉΠ»Π΅ `package.json`: + +```json +{ + "vuePlugins": { + "ui": ["my-ui.js"] + } +} +``` + +ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΡƒΡŽ API ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. + +## Π Π΅ΠΆΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ + +ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ cli-ui Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ с ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ: + +``` +vue ui --dev +``` + +Или: + +``` +vue ui -D +``` + +## ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +![Configuration ui](/config-ui.png) + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° `api.describeConfig`. + +Π‘Π½Π°Ρ‡Π°Π»Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: + +```js +api.describeConfig({ + // Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + id: 'org.vue.eslintrc', + // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя + name: 'ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ESLint', + // ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ + description: 'ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибок & качСство ΠΊΠΎΠ΄Π°', + // Бсылка "More info" + link: 'https://eslint.org' +}) +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +### ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈΠΊΠΎΠ½ΠΊΠΈ + +ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠΌ [ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈΠ· Material](https://material.io/tools/icons) ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (см. [ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ статичСскиС Ρ„Π°ΠΉΠ»Ρ‹](#ΠΏΡƒΠ±nΠΈΡ‡Π½Ρ‹Π΅-статичСскиС-Ρ„Π°ΠΉnΡ‹)): + +```js +api.describeConfig({ + /* ... */ + // ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈΠΊΠΎΠ½ΠΊΠΈ + icon: 'application_settings' +}) +``` + +Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ ΠΏΠ»Π°Π³ΠΈΠ½Π°, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ Π΅ΡΡ‚ΡŒ (см. [Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ](./ui-info.md#Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ)). + +### Π€Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ + +По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конфигурация UI ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ Π² `.eslintrc.js` Ρ‚Π°ΠΊ ΠΈ Π² `vue.config.js`. + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: + +```js +api.describeConfig({ + /* ... */ + // ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + files: { + // eslintrc.js + eslint: { + js: ['.eslintrc.js'], + json: ['.eslintrc', '.eslintrc.json'], + // Π‘ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· `package.json` + package: 'eslintConfig' + }, + // vue.config.js + vue: { + js: ['vue.config.js'] + } + }, +}) +``` + +ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹: `json`, `yaml`, `js`, `package`. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π²Π°ΠΆΠ΅Π½: ΠΏΠ΅Ρ€Π²ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° Π² спискС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ссли ΠΎΠ½ Π½Π΅ сущСствуСт. + +### ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ подсказок ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ…ΡƒΠΊ `onRead` Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ список подсказок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: + +```js +api.describeConfig({ + /* ... */ + onRead: ({ data, cwd }) => ({ + prompts: [ + // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсказок + ] + }) +}) +``` + +Π­Ρ‚ΠΈ подсказки Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. + +Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ см. [Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки](#ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅-подсказки). + +ΠžΠ±ΡŠΠ΅ΠΊΡ‚ `data` содСрТит JSON с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. + +НапримСр, допустим, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ `vue.config.js` Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅: + +```js +module.exports = { + lintOnSave: false +} +``` + +ΠœΡ‹ объявляСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: + +```js +api.describeConfig({ + /* ... */ + // ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + files: { + // vue.config.js + vue: { + js: ['vue.config.js'] + } + }, +}) +``` + +ΠžΠ±ΡŠΠ΅ΠΊΡ‚ `data` Π±ΡƒΠ΄Π΅Ρ‚: + +```js +{ + // Π€Π°ΠΉΠ» + vue: { + // Π”Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π° + lintOnSave: false + } +} +``` + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с нСсколькими Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ: Ссли ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„Π°ΠΉΠ» `eslintrc.js` Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: + +```js +module.exports = { + root: true, + extends: [ + 'plugin:vue/essential', + '@vue/standard' + ] +} +``` + +И ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΡ†ΠΈΡŽ `files` Π² нашСм ΠΏΠ»Π°Π³ΠΈΠ½Π΅ Π½Π° это: + +```js +api.describeConfig({ + /* ... */ + // ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + files: { + // eslintrc.js + eslint: { + js: ['.eslintrc.js'], + json: ['.eslintrc', '.eslintrc.json'], + // Π‘ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· `package.json` + package: 'eslintConfig' + }, + // vue.config.js + vue: { + js: ['vue.config.js'] + } + }, +}) +``` + +ΠžΠ±ΡŠΠ΅ΠΊΡ‚ `data` Π±ΡƒΠ΄Π΅Ρ‚: + +```js +{ + eslint: { + root: true, + extends: [ + 'plugin:vue/essential', + '@vue/standard' + ] + }, + vue: { + lintOnSave: false + } +} +``` + +### Π’ΠΊΠ»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ подсказки Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΠΊΠ»Π°Π΄ΠΊΠ°Ρ…: + +```js +api.describeConfig({ + /* ... */ + onRead: ({ data, cwd }) => ({ + tabs: [ + { + id: 'tab1', + label: 'Моя Π²ΠΊΠ»Π°Π΄ΠΊΠ°', + // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ + icon: 'application_settings', + prompts: [ + // ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсказок + ] + }, + { + id: 'tab2', + label: 'Моя вторая Π²ΠΊΠ»Π°Π΄ΠΊΠ°', + prompts: [ + // ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсказок + ] + } + ] + }) +}) +``` + +### Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ + +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ…ΡƒΠΊ `onWrite` для записи Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ» (ΠΈΠ»ΠΈ выполнСния любого ΠΊΠΎΠ΄Π° nodejs): + +```js +api.describeConfig({ + /* ... */ + onWrite: ({ prompts, answers, data, files, cwd, api }) => { + // ... + } +}) +``` + +АргумСнты: + +- `prompts`: Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсказок для runtime (см. Π½ΠΈΠΆΠ΅) +- `answers`: Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° +- `data`: Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, считанныС ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ +- `files`: дСскрипторы Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (`{ type: 'json', path: '...' }`) +- `cwd`: Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ +- `api`: `onWrite API` (см. Π½ΠΈΠΆΠ΅) + +ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсказок для runtime: + +```js +{ + id: data.name, + type: data.type, + name: data.short || null, + message: data.message, + group: data.group || null, + description: data.description || null, + link: data.link || null, + choices: null, + visible: true, + enabled: true, + // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ΡΡ) + value: null, + // true Ссли Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ + valueChanged: false, + error: null, + tabId: null, + // ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ подсказок inquirer + raw: data +} +``` + +`onWrite` API: + +- `assignData(fileId, newData)`: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `Object.assign` для ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ записью. +- `setData(fileId, newData)`: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· `newData` Π±ΡƒΠ΄Π΅Ρ‚ установлСн (ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½ Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `undefined`) Π² Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ записью. +- `async getAnswer(id, mapper)`: ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ id подсказки ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `mapper`, Ссли ΠΎΠ½Π° прСдоставлСна (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `JSON.parse`). + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ (ΠΈΠ· ΠΏΠ»Π°Π³ΠΈΠ½Π° для ESLint): + +```js +api.describeConfig({ + // ... + + onWrite: async ({ api, prompts }) => { + // ОбновлСниС ΠΏΡ€Π°Π²ΠΈΠ» ESLint + const result = {} + for (const prompt of prompts) { + result[`rules.${prompt.id}`] = await api.getAnswer(prompt.id, JSON.parse) + } + api.setData('eslint', result) + } +}) +``` + +## Π—Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° +![Tasks ui](/tasks-ui.png) + +Π—Π°Π΄Π°Ρ‡ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ· поля `scripts` Ρ„Π°ΠΉΠ»Π° `package.json` ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +МоТно Β«Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒΒ» Π·Π°Π΄Π°Ρ‡ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ Ρ…ΡƒΠΊΠ°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· `api.describeTask`: + +```js +api.describeTask({ + // RegExp выполняСтся ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ скриптов для опрСдСлСния Π·Π°Π΄Π°Ρ‡ΠΈ описываСмой здСсь + match: /vue-cli-service serve/, + description: 'ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΈ горячая Π·Π°ΠΌΠ΅Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ', + // Бсылка "More info" + link: 'https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#serve' +}) +``` + +### Иконка Π·Π°Π΄Π°Ρ‡ΠΈ + +ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠΌ [ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈΠ· Material](https://material.io/tools/icons) ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (см. [ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ статичСскиС Ρ„Π°ΠΉΠ»Ρ‹](#ΠΏΡƒΠ±nΠΈΡ‡Π½Ρ‹Π΅-статичСскиС-Ρ„Π°ΠΉnΡ‹)): + +```js +api.describeTask({ + /* ... */ + // Иконка Π·Π°Π΄Π°Ρ‡ΠΈ + icon: 'application_settings' +}) +``` + +Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ ΠΏΠ»Π°Π³ΠΈΠ½Π°, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ Π΅ΡΡ‚ΡŒ (см. [Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ](./ui-info.md#Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ)). + +### ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡ΠΈ + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ подсказки для измСнСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Они Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² модальном ΠΎΠΊΠ½Π΅ Β«ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹Β». + +НапримСр: + +```js +api.describeTask({ + // ... + + // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (подсказки inquirer) + prompts: [ + { + name: 'open', + type: 'confirm', + default: false, + description: 'ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΡ€ΠΈ стартС сСрвСра' + }, + { + name: 'mode', + type: 'list', + default: 'development', + choices: [ + { + name: 'development', + value: 'development' + }, + { + name: 'production', + value: 'production' + }, + { + name: 'test', + value: 'test' + } + ], + description: 'Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ env' + } + ] +}) +``` + +Π‘ΠΌ. [Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки](#ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅-подсказки) для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. + +### Π₯ΡƒΠΊΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ + +Доступно нСсколько Ρ…ΡƒΠΊΠΎΠ²: + +- `onBeforeRun` +- `onRun` +- `onExit` + +НапримСр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ подсказок (см. Π²Ρ‹ΡˆΠ΅) для добавлСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: + +```js +api.describeTask({ + // ... + + // Π₯ΡƒΠΊΠΈ + // ИзмСняСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ здСсь + onBeforeRun: async ({ answers, args }) => { + // АргумСнты + if (answers.open) args.push('--open') + if (answers.mode) args.push('--mode', answers.mode) + args.push('--dashboard') + }, + // Π‘Ρ€Π°Π·Ρƒ послС запуска Π·Π°Π΄Π°Ρ‡ΠΈ + onRun: async ({ args, child, cwd }) => { + // child: Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс node + // cwd: Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ процСсса + }, + onExit: async ({ args, child, cwd, code, signal }) => { + // code: ΠΊΠΎΠ΄ Π²Ρ‹Ρ…ΠΎΠ΄Π° + // signal: сигнал kill, Ссли использовался + } +}) +``` + +### Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ Π·Π°Π΄Π°Ρ‡ΠΈ + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ прСдставлСния Π² ΠΏΠ°Π½Π΅Π»ΠΈ свСдСний Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `ClientAddon` API: + +```js +api.describeTask({ + // ... + + // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдставлСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ΠΏΠ°Π½Π΅Π»ΠΈ webpack) + // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΅ΡΡ‚ΡŒ прСдставлСниС 'output' ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° + views: [ + { + // Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID + id: 'vue-webpack-dashboard-client-addon', + // ВСкст ΠΊΠ½ΠΎΠΏΠΊΠΈ + label: 'Dashboard', + // Иконка ΠΊΠ½ΠΎΠΏΠΊΠΈ + icon: 'dashboard', + // ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (см. ΡΠ΅ΠΊΡ†ΠΈΡŽ "ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅" Π½ΠΈΠΆΠ΅) + component: 'vue-webpack-dashboard' + } + ], + // Π‘Ρ‚Π°Ρ€Ρ‚ΠΎΠ²Ρ‹ΠΉ Π²ΠΈΠ΄ отобраТСния свСдСний ΠΎ Π·Π°Π΄Π°Ρ‡Π΅ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это output) + defaultView: 'vue-webpack-dashboard-client-addon' +}) +``` + +Π‘ΠΌ. [ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅](#ΠΊnиСнтскоС-Π΄ΠΎΠΏΠΎnΠ½Π΅Π½ΠΈΠ΅) для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. + + +### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ + +Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² `package.json` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `api.addTask` вмСсто `api.describeTask`. Π­Ρ‚ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ интСрфСйсС cli UI. + +**Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ `command` вмСсто `match`.** + +НапримСр: + +```js +api.addTask({ + // ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ + name: 'inspect', + command: 'vue-cli-service inspect', + // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ + // ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° `describeTask` Π±Π΅Π· ΠΎΠΏΡ†ΠΈΠΈ `match` + description: '...', + link: 'https://github.com/vuejs/vue-cli/...', + prompts: [ /* ... */ ], + onBeforeRun: () => {}, + onRun: () => {}, + onExit: () => {}, + views: [ /* ... */ ], + defaultView: '...' +}) +``` + +**⚠️ `command` запускаСтся Π² контСкстС node. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ°ΠΌ node ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π±ΡƒΠ΄Ρ‚ΠΎ ΠΈΠ· скриптов `package.json`.** + +## Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки + +ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ подсказок Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ [inquirer](https://github.com/SBoudrias/Inquirer.js). + +Однако, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ интСрфСйсом): + +```js +{ + /* ... */ + // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ подсказок Π½Π° Ρ€Π°Π·Π΄Π΅Π»Ρ‹ + group: 'ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся', + // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС + description: 'ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ имСнования Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² шаблонС (`my-prop` ΠΈΠ»ΠΈ `myProp`)', + // Бсылка "More info" + link: 'https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/attribute-hyphenation.md', +} +``` + +ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ inquirer Ρ‚ΠΈΠΏΡ‹: `checkbox`, `confirm`, `input`, `password`, `list`, `rawlist`. + +Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π½ΠΈΠΌ: + +- `color`: интСрфСйс Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚Π°. + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ + +```js +{ + name: 'open', + type: 'confirm', + default: false, + description: 'ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅' +} +``` + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ со списком Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² + +```js +{ + name: 'mode', + type: 'list', + default: 'development', + choices: [ + { + name: 'Π Π΅ΠΆΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ', + value: 'development' + }, + { + name: 'Π Π΅ΠΆΠΈΠΌ production', + value: 'production' + }, + { + name: 'Π Π΅ΠΆΠΈΠΌ тСстирования', + value: 'test' + } + ], + description: 'Π Π΅ΠΆΠΈΠΌ сборки', + link: 'https://link-to-docs' +} +``` + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΠΎΠ»Π΅ΠΌ Π²Π²ΠΎΠ΄Π° + +```js +{ + name: 'host', + type: 'input', + default: '0.0.0.0', + description: 'Π₯ост для сСрвСра Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ' +} +``` + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с чСкбоксом + +ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ нСсколько ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ. + +```js +{ + name: 'lintOn', + message: 'Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³Π°:', + when: answers => answers.features.includes('linter'), + type: 'checkbox', + choices: [ + { + name: 'Π›ΠΈΠ½Ρ‚ΠΈΠ½Π³ ΠΏΡ€ΠΈ сохранСнии', + value: 'save', + checked: true + }, + { + name: 'Π›ΠΈΠ½Ρ‚ΠΈΠ½Π³ ΠΈ исправлСниС ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅' + (hasGit() ? '' : chalk.red(' (трСбуСтся Git)')), + value: 'commit' + } + ] +} +``` + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Ρ†Π²Π΅Ρ‚Π° + +```js +{ + name: 'themeColor', + type: 'color', + message: 'Π¦Π²Π΅Ρ‚ Ρ‚Π΅ΠΌΡ‹', + description: 'Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для измСнСния Ρ†Π²Π΅Ρ‚Π° интСрфСйса систСмы Π²ΠΎΠΊΡ€ΡƒΠ³ прилоТСния', + default: '#4DBA87' +} +``` + +### Подсказки для Π²Ρ‹Π·ΠΎΠ²Π° + +Π’ ΠΏΠ»Π°Π³ΠΈΠ½Π΅ vue-cli ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» `prompts.js`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ нСсколько вопросов ΠΏΡ€ΠΈ установкС ΠΏΠ»Π°Π³ΠΈΠ½Π° (Ρ‡Π΅Ρ€Π΅Π· CLI ΠΈΠ»ΠΈ UI). МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для UI (см. Π²Ρ‹ΡˆΠ΅) ΠΊ этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ подсказок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ прСдоставили большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ UI. + +**⚠️ Π’ настоящСС врСмя Ρ‚ΠΈΠΏΡ‹ inquirer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ (см. Π²Ρ‹ΡˆΠ΅), Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² UI.** + +## ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ + +ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ β€” это сборка JS, которая динамичСски загруТаСтся Π² cli-ui. Она ΠΏΠΎΠ»Π΅Π·Π½Π° для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ². + +### Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ клиСнтского дополнСния + +Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ способ создания клиСнтского дополнСния β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ vue-cli 3. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈΠ±ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΠ»Π°Π³ΠΈΠ½Π°, Π»ΠΈΠ±ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ npm ΠΏΠ°ΠΊΠ΅Ρ‚Π΅. + +УстановитС `@vue/cli-ui` Π² качСствС зависимости для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (dev dependency). + +Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π°ΠΉΠ» `vue.config.js` со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым: + +```js +const { clientAddonConfig } = require('@vue/cli-ui') + +module.exports = { + ...clientAddonConfig({ + id: 'org.vue.webpack.client-addon', + // ΠŸΠΎΡ€Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 8042) + port: 8042 + }) +} +``` + +ΠœΠ΅Ρ‚ΠΎΠ΄ `clientAddonConfig` Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ vue-cli. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ CSS ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ΄ Π² `./dist/index.js` Π² ΠΏΠ°ΠΏΠΊΡƒ клиСнтского дополнСния. + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» `.eslintrc.json`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: + +```json +{ + // ... + "globals": { + "ClientAddonApi": false, + "mapSharedData": false, + "Vue": false + } +} +``` + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт `serve` для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ `build`, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ свой ΠΏΠ»Π°Π³ΠΈΠ½. + +### ClientAddonApi + +ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» `main.js` Π² исходном ΠΊΠΎΠ΄Π΅ клиСнтского дополнСния ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ вСсь ΠΊΠΎΠ΄. + +**⚠️ НС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Vue Π² исходном ΠΊΠΎΠ΄Π΅ клиСнтского дополнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `Vue` ΠΈΠ· `window` Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.** + +Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для `main.js`: + +```js +import VueProgress from 'vue-progress-path' +import WebpackDashboard from './components/WebpackDashboard.vue' +import TestView from './components/TestView.vue' + +// Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Vue-ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ +// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ 'Vue' +Vue.use(VueProgress, { + defaultShape: 'circle' +}) + +// Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ +// (Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ 'Vue.component') +ClientAddonApi.component('org.vue.webpack.components.dashboard', WebpackDashboard) + +// Π”ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π²ΠΎ vue-router Π² соотвСтствии с Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠΌ /addon/. +// НапримСр, addRoutes('foo', [ { path: '' }, { path: 'bar' } ]) +// Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ /addon/foo/ ΠΈ the /addon/foo/bar Π²ΠΎ vue-router. +// Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ создаём Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ '/addon/vue-webpack/' с ΠΈΠΌΠ΅Π½Π΅ΠΌ 'test-webpack-route' +ClientAddonApi.addRoutes('org.vue.webpack', [ + { path: '', name: 'org.vue.webpack.routes.test', component: TestView } +]) + +// Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ своСго ΠΏΠ»Π°Π³ΠΈΠ½Π° +// Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ vue-i18n) +const locales = require.context('./locales', true, /[a-z0-9]+\.json$/i) +locales.keys().forEach(key => { + const locale = key.match(/([a-z0-9]+)\./i)[1] + ClientAddonApi.addLocalization(locale, locales(key)) +}) +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +Π’Π°ΠΊΠΆΠ΅ cli-ui рСгистрируСт `Vue` ΠΈ `ClientAddonApi` Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π² `window`. + +Π’ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ CSS классы [@vue/ui](https://github.com/vuejs/ui) ΠΈ [@vue/cli-ui](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-ui/src/components), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ внСшний Π²ΠΈΠ΄. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ тСксты ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [vue-i18n](https://github.com/kazupon/vue-i18n), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. + +### РСгистрация клиСнтского дополнСния + +Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ `ui.js`, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ `api.addClientAddon` с строкой запроса ΠΊ встроСнному ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ: + +```js +api.addClientAddon({ + id: 'org.vue.webpack.client-addon', + // ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ содСрТащий всС собранныС JS Ρ„Π°ΠΉΠ»Ρ‹ + path: '@vue/cli-ui-addon-webpack/dist' +}) +``` + +Π‘ΡƒΠ΄Π΅Ρ‚ использован Node.js API `require.resolve` для поиска ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ» `index.js`, созданный ΠΈΠ· клиСнтского дополнСния. + +Или ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ URL-адрСс ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° (Π² ΠΈΠ΄Π΅Π°Π»Π΅ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² Ρ„Π°ΠΉΠ»Π΅ `vue-cli-ui.js` Π² вашСм тСстовом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ vue): + +```js +// ПолСзно для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ +// ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ ΠΏΡƒΡ‚ΡŒ, Ссли ΠΎΠ½ ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ +api.addClientAddon({ + id: 'org.vue.webpack.client-addon', + // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡ€Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅ + url: 'http://localhost:8042/index.js' +}) +``` + +### ИспользованиС клиСнтского дополнСния + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ клиСнтскоС Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² прСдставлСниях. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ прСдставлСниС Π² описании Π·Π°Π΄Π°Ρ‡ΠΈ: + +```js +api.describeTask({ + /* ... */ + // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдставлСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ΠΏΠ°Π½Π΅Π»ΠΈ webpack) + // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΅ΡΡ‚ΡŒ прСдставлСниС 'output', ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° + views: [ + { + // Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID + id: 'org.vue.webpack.views.dashboard', + // ВСкст ΠΊΠ½ΠΎΠΏΠΊΠΈ + label: 'Dashboard', + // Иконка ΠΊΠ½ΠΎΠΏΠΊΠΈ (material-icons) + icon: 'dashboard', + // ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, зарСгистрированный Ρ‡Π΅Ρ€Π΅Π· ClientAddonApi + component: 'org.vue.webpack.components.dashboard' + } + ], + // Π‘Ρ‚Π°Ρ€Ρ‚ΠΎΠ²ΠΎΠ΅ прСдставлСниС ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ свСдСний ΠΎ Π·Π°Π΄Π°Ρ‡Π΅ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ output) + defaultView: 'org.vue.webpack.views.dashboard' +}) +``` + +Π’ΠΎΡ‚ ΠΊΠΎΠ΄ клиСнтского дополнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСгистрируСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `'org.vue.webpack.components.dashboard'` (ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅): + +```js +/* Π’ `main.js` */ +// Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ +import WebpackDashboard from './components/WebpackDashboard.vue' +// РСгистрируСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ +// (Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ 'Vue.component') +ClientAddonApi.component('org.vue.webpack.components.dashboard', WebpackDashboard) +``` + +![Task view example](/task-view.png) + +## ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ страницы + +МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ страницу ΠΏΠΎΠ΄ стандартными Β«ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Β», Β«ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Β» ΠΈ Β«Π—Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Β» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° `api.addView`: + +```js +api.addView({ + // Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID + id: 'org.vue.webpack.views.test', + + // Имя ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° (ΠΈΠ· vue-router) + // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ имя, ΠΊΠ°ΠΊ ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ 'ClientAddonApi.addRoutes' (см. Π²Ρ‹ΡˆΠ΅ Π² Ρ€Π°Π·Π»Π΅Π»Π΅ клиСнтскоС Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅) + name: 'org.vue.webpack.routes.test', + + // Иконка ΠΊΠ½ΠΎΠΏΠΊΠΈ (material-icons) + icon: 'pets', + // МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ собствСнноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (см. Π½ΠΈΠΆΠ΅ Ρ€Π°Π·Π΄Π΅Π» ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… статичных Ρ„Π°ΠΉΠ»ΠΎΠ²): + // icon: 'http://localhost:4000/_plugin/%40vue%2Fcli-service/webpack-icon.svg', + + // Подсказка для ΠΊΠ½ΠΎΠΏΠΊΠΈ + tooltip: 'ВСстовая страница ΠΈΠ· дополнСния webpack' +}) +``` + +Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π² клиСнтском Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСгистрируСт `'org.vue.webpack.routes.test'` (ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅): + +```js +/* Π’ `main.js` */ +// Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ +import TestView from './components/TestView.vue' +// ДобавляСм ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π² vue-router ΠΏΠΎΠ΄ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠΌ /addon/. +// НапримСр, addRoutes('foo', [ { path: '' }, { path: 'bar' } ]) +// Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ /addon/foo/ ΠΈ /addon/foo/bar Π²ΠΎ vue-router. +// Π’Π΅ΠΏΠ΅Ρ€ΡŒ создаём Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ '/addon/vue-webpack/' с ΠΈΠΌΠ΅Π½Π΅ΠΌ 'test-webpack-route' +ClientAddonApi.addRoutes('org.vue.webpack', [ + { path: '', name: 'org.vue.webpack.routes.test', component: TestView } +]) +``` + +![Custom view example](/custom-view.png) + +## ΠžΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ + +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. + +> НапримСр, панСль Webpack прСдоставляСт Π΄Π°Π½Π½Ρ‹Π΅ статистики сборки ΠΊΠ°ΠΊ UI-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‚Π°ΠΊ ΠΈ UI-сСрвСру с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого API. + +Π’ Ρ„Π°ΠΉΠ»Π΅ `ui.js` ΠΏΠ»Π°Π³ΠΈΠ½Π° (Node.js): + +```js +// Установка ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ +api.setSharedData('com.my-name.my-variable', 'some-data') + +// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ +const sharedData = api.getSharedData('com.my-name.my-variable') +if (sharedData) { + console.log(sharedData.value) +} + +// Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ +api.removeSharedData('com.my-name.my-variable') + +// ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ +const watcher = (value, id) => { + console.log(value, id) +} +api.watchSharedData('com.my-name.my-variable', watcher) +// ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ +api.unwatchSharedData('com.my-name.my-variable', watcher) + +// ВСрсии для пространства ΠΈΠΌΡ‘Π½ +const { + setSharedData, + getSharedData, + removeSharedData, + watchSharedData, + unwatchSharedData +} = api.namespace('com.my-name.') +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +Π’ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅: + +```js +// ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Vue +export default { + // Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ + sharedData () { + return { + // МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `myVariable` Π² шаблонС + myVariable: 'com.my-name.my-variable' + // МоТно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ + ...mapSharedData('com.my-name.', { + myVariable2: 'my-variable2' + }) + } + }, + + // Π ΡƒΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ + async created () { + const value = await this.$getSharedData('com.my-name.my-variable') + + this.$watchSharedData(`com.my-name.my-variable`, value => { + console.log(value) + }) + + await this.$setSharedData('com.my-name.my-variable', 'new-value') + } +} +``` + +ΠŸΡ€ΠΈ использовании ΠΎΠΏΡ†ΠΈΠΈ `sharedData` ΠΎΠ±Ρ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ просто присвоСниСм Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ свойству. + +```html + + + +``` + +Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ создании ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° настроСк. + +## ДСйствия ΠΏΠ»Π°Π³ΠΈΠ½Π° + +ДСйствия ΠΏΠ»Π°Π³ΠΈΠ½Π° β€” это Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ cli-ui (Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ) ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ (nodejs). + +> НапримСр, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ° Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ (см. [клиСнтскоС Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅](#ΠΊnиСнтскоС-Π΄ΠΎΠΏΠΎnΠ½Π΅Π½ΠΈΠ΅)), которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ nodejs Π½Π° сСрвСрС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого API. + +Π’ Ρ„Π°ΠΉΠ»Π΅ `ui.js` Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ (nodejs), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ· `PluginApi`: + +```js +// Π’Ρ‹Π·ΠΎΠ² дСйствия +api.callAction('com.my-name.other-action', { foo: 'bar' }).then(results => { + console.log(results) +}).catch(errors => { + console.error(errors) +}) +``` + +```js +// ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ дСйствия +api.onAction('com.my-name.test-action', params => { + console.log('test-action called', params) +}) +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +МоТно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ вСрсии для пространства ΠΈΠΌΡ‘Π½ Ρ‡Π΅Ρ€Π΅Π· `api.namespace` (ΠΊΠ°ΠΊ ΠΈ Π² ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…): + +```js +const { onAction, callAction } = api.namespace('com.my-name.') +``` + +Π’ клиСнтском Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ (Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ `$onPluginActionCalled`, `$onPluginActionResolved` ΠΈ `$callPluginAction`: + +```js +// ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Vue +export default { + created () { + this.$onPluginActionCalled(action => { + // Когда дСйствиС вызываСтся + // Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ + console.log('called', action) + }) + this.$onPluginActionResolved(action => { + // ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ дСйствиС Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ + console.log('resolved', action) + }) + }, + + methods: { + testPluginAction () { + // Π’Ρ‹Π·ΠΎΠ² дСйствия ΠΏΠ»Π°Π³ΠΈΠ½Π° + this.$callPluginAction('com.my-name.test-action', { + meow: 'meow' + }) + } + } +} +``` + +## ΠšΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами (IPC) + +IPC ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами. Π­Ρ‚Π° систСма позволяСт Π»Π΅Π³ΠΊΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСния ΠΈΠ· Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π°Ρ‡!). И это довольно быстро ΠΈ просто. + +> Для отобраТСния Π΄Π°Π½Π½Ρ‹Ρ… Π² UI Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ управлСния webpack, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `serve` ΠΈ `build` ΠΈΠ· `@vue/cli-service` ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ IPC-сообщСния Π½Π° сСрвСр cli-ui nodejs, ΠΊΠΎΠ³Π΄Π° пСрСдаётся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ `--dashboard`. + +Π’ ΠΊΠΎΠ΄Π΅ процСсса (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Webpack-ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ ΠΈΠ»ΠΈ скриптом Π·Π°Π΄Π°Ρ‡ΠΈ для nodejs), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс `IpcMessenger` ΠΈΠ· `@vue/cli-shared-utils`: + +```js +const { IpcMessenger } = require('@vue/cli-shared-utils') + +// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра IpcMessenger +const ipc = new IpcMessenger() + +function sendMessage (data) { + // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния Π½Π° сСрвСр cli-ui + ipc.send({ + 'com.my-name.some-data': { + type: 'build', + value: data + } + }) +} + +function messageHandler (data) { + console.log(data) +} + +// ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ сообщСния +ipc.on(messageHandler) + +// ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ отслСТивания +ipc.off(messageHandler) + +function cleanup () { + // ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ сСти IPC + ipc.disconnect() +} +``` + +ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ: + +```js +const ipc = new IpcMessenger({ + autoConnect: false +}) + +// Π­Ρ‚ΠΎ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ +ipc.send({ ... }) + +ipc.connect() +``` + +ΠΠ²Ρ‚ΠΎΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ простоС (спустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π±Π΅Π· отправляСмых сообщСний): + +```js +const ipc = new IpcMessenger({ + disconnectOnIdle: true, + idleTimeout: 3000 // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ +}) + +ipc.send({ ... }) + +setTimeout(() => { + console.log(ipc.connected) // false +}, 3000) +``` + +ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ IPC-сСти: + +```js +const ipc = new IpcMessenger({ + networkId: 'com.my-name.my-ipc-network' +}) +``` + +Π’ Ρ„Π°ΠΉΠ»Π΅ `ui.js` ΠΏΠ»Π°Π³ΠΈΠ½Π° vue-cli, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ `ipcOn`, `ipcOff` ΠΈ `ipcSend`: + +```js +function onWebpackMessage ({ data: message }) { + if (message['com.my-name.some-data']) { + console.log(message['com.my-name.some-data']) + } +} + +// ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ любого IPC-сообщСния +api.ipcOn(onWebpackMessage) + +// ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ отслСТивания +api.ipcOff(onWebpackMessage) + +// ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния Π²ΠΎ всС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Π΅ экзСмпляры IpcMessenger +api.ipcSend({ + webpackDashboardMessage: { + foo: 'bar' + } +}) +``` + +## Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ + +Плагин ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· локальной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… [lowdb](https://github.com/typicode/lowdb), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ сСрвСром UI. + +```js +// Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ значСния Π² локальной Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… +api.storageSet('com.my-name.an-id', { some: 'value' }) + +// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· локальной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… +console.log(api.storageGet('com.my-name.an-id')) + +// ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ экзСмпляр lowdb +api.db.get('posts') + .find({ title: 'low!' }) + .assign({ title: 'hi!'}) + .write() + +// ИспользованиС вСрсий для пространства ΠΈΠΌΡ‘Π½ +const { storageGet, storageSet } = api.namespace('my-plugin.') +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +## УвСдомлСния + +МоТно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ увСдомлСния Ρ‡Π΅Ρ€Π΅Π· систСму ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы: + +```js +api.notify({ + title: 'Какой-Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ', + message: 'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ', + icon: 'path-to-icon.png' +}) +``` + +Π•ΡΡ‚ΡŒ нСсколько встроСнных ΠΈΠΊΠΎΠ½ΠΎΠΊ: + +- `'done'` +- `'error'` + +## Π­ΠΊΡ€Π°Π½ прогрСсса + +МоТно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ экран прогрСсса с тСкстом ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ: + +```js +api.setProgress({ + status: 'ОбновлСниС...', + error: null, + info: 'Π¨Π°Π³ 2 ΠΈΠ· 4', + progress: 0.4 // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 0 Π΄ΠΎ 1, -1 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ скрытый ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прогрСсса +}) +``` + +Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ экрана прогрСсса: + +```js +api.removeProgress() +``` + +## Π₯ΡƒΠΊΠΈ + +Π₯ΡƒΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ события Π² интСрфСйсС `cli-ui`. + +### onProjectOpen + +ВызываСтся ΠΊΠΎΠ³Π΄Π° ΠΏΠ»Π°Π³ΠΈΠ½ Π±Ρ‹Π» Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +```js +api.onProjectOpen((project, previousProject) => { + // Бброс Π΄Π°Π½Π½Ρ‹Ρ… +}) +``` + +### onPluginReload + +ВызываСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°. + +```js +api.onPluginReload((project) => { + console.log('ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½') +}) +``` + +### onConfigRead + +ВызываСтся ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ экрана ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. + +```js +api.onConfigRead(({ config, data, onReadData, tabs, cwd }) => { + console.log(config.id) +}) +``` + +### onConfigWrite + +ВызываСтся ΠΏΡ€ΠΈ сохранСнии настроСк ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° экранС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. + +```js +api.onConfigWrite(({ config, data, changedFields, cwd }) => { + // ... +}) +``` + +### onTaskOpen + +ВызываСтся ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ с Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. + +```js +api.onTaskOpen(({ task, cwd }) => { + console.log(task.id) +}) +``` + +### onTaskRun + +ВызываСтся ΠΏΡ€ΠΈ запускС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. + +```js +api.onTaskRun(({ task, args, child, cwd }) => { + // ... +}) +``` + +### onTaskExit + +ВызываСтся ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ. ВызываСтся ΠΈ ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, ΠΈ ΠΏΡ€ΠΈ ошибкС. + +```js +api.onTaskExit(({ task, args, child, signal, code, cwd }) => { + // ... +}) +``` + +### onViewOpen + +ВызываСтся ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ страницы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹Β», Β«ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΒ» ΠΈΠ»ΠΈ Β«Π—Π°Π΄Π°Ρ‡ΠΈΒ»). + +```js +api.onViewOpen(({ view, cwd }) => { + console.log(view.id) +}) +``` + +## ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ + +ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ β€” это ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Они ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ. НапримСр, Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰Π°Ρ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ vue-router, Ссли ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Π» ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. + +```js +api.addSuggestion({ + id: 'com.my-name.my-suggestion', + type: 'action', // ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (большС Ρ‚ΠΈΠΏΠΎΠ² Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ) + label: 'Add vue-router', + // Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² модальном ΠΎΠΊΠ½Π΅ подробностСй + message: 'A longer message for the modal', + link: 'http://link-to-docs-in-the-modal', + // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ + image: '/_plugin/my-package/screenshot.png', + // Ѐункция вызываСтся ΠΊΠΎΠ³Π΄Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ активируСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ + async handler () { + // ... + return { + // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ удаляСт ΠΊΠ½ΠΎΠΏΠΊΡƒ + keep: false + } + } +}) +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +![UI Suggestion](/suggestion.png) + +Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: + +```js +api.removeSuggestion('com.my-name.my-suggestion') +``` + +МоТно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ страницу, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Π΅Ρ€Π΅Π· `actionLink`: + +```js +api.addSuggestion({ + id: 'com.my-name.my-suggestion', + type: 'action', // ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ + label: 'Add vue-router', + // ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ + actionLink: 'https://vuejs.org/' +}) +``` + +Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΡƒΠΊΠΈ для ΠΏΠΎΠΊΠ°Π·Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ контСкстС: + +```js +const ROUTER = 'vue-router-add' + +api.onViewOpen(({ view }) => { + if (view.id === 'vue-project-plugins') { + if (!api.hasPlugin('vue-router')) { + api.addSuggestion({ + id: ROUTER, + type: 'action', + label: 'org.vue.cli-service.suggestions.vue-router-add.label', + message: 'org.vue.cli-service.suggestions.vue-router-add.message', + link: 'https://router.vuejs.org/', + async handler () { + await install(api, 'vue-router') + } + }) + } + } else { + api.removeSuggestion(ROUTER) + } +}) +``` + +Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ vue-router Π² прСдставлСнии ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π½Π΅Ρ‚ ΡƒΠΆΠ΅ установлСнного vue-router. + +ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: `addSuggestion` ΠΈ `removeSuggestion` ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊ пространству ΠΈΠΌΡ‘Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `api.namespace()`. + +## Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ + +### hasPlugin + +Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `true` Ссли ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ»Π°Π³ΠΈΠ½. + +```js +api.hasPlugin('eslint') +api.hasPlugin('apollo') +api.hasPlugin('vue-cli-plugin-apollo') +``` + +### getCwd + +Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. + +```js +api.getCwd() +``` + +### resolve + +Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +```js +api.resolve('src/main.js') +``` + +### getProject + +ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. + +```js +api.getProject() +``` + +## ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ статичСскиС Ρ„Π°ΠΉΠ»Ρ‹ + +Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ статичСскиС Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ²Π΅Ρ€Ρ… встроСнного HTTP-сСрвСра cli-ui (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΎΠΊ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ прСдставлСния). + +Π›ΡŽΠ±ΠΎΠΉ Ρ„Π°ΠΉΠ» Π² ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `ui-public` Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° станСт доступСн ΠΏΠΎ HTTP-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ `/_plugin/:id/*`. + +НапримСр, Ссли ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» `my-logo.png` Π² `vue-cli-plugin-hello/ui-public/`, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ доступСн ΠΏΠΎ URL `/_plugin/vue-cli-plugin-hello/my-logo.png`, ΠΊΠΎΠ³Π΄Π° cli-ui Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΠ»Π°Π³ΠΈΠ½. + +```js +api.describeConfig({ + /* ... */ + // ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ + icon: '/_plugin/vue-cli-plugin-hello/my-logo.png' +}) +``` diff --git a/docs/ru/dev-guide/ui-info.md b/docs/ru/dev-guide/ui-info.md new file mode 100644 index 0000000000..f76ceb22c1 --- /dev/null +++ b/docs/ru/dev-guide/ui-info.md @@ -0,0 +1,41 @@ +# Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π΅ Π² UI + +ΠŸΡ€ΠΈ использовании UI ваш ΠΏΠ»Π°Π³ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ доступным ΠΈ ΡƒΠ·Π½Π°Π²Π°Π΅ΠΌΡ‹ΠΌ. + +## Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» `logo.png` Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° npm. Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах: + - Π’ поискС ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² для установки + - Π’ спискС установлСнных ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² + +![Plugins](/plugins.png) + +Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π±Π΅Π· прозрачности (Π² ΠΈΠ΄Π΅Π°Π»Π΅ 84x84). + +## ΠΠ°Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² поискС + +Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ находимости ΠΈ узнаваСмости ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΡ€ΠΈ поискС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ваш ΠΏΠ»Π°Π³ΠΈΠ½, Π² ΠΏΠΎΠ»Π΅ `description` Π² Ρ„Π°ΠΉΠ»Π΅ `package.json`. + +НапримСр: + +```json +{ + "name": "vue-cli-plugin-apollo", + "version": "0.7.7", + "description": "vue-cli 3 plugin to add Apollo and GraphQL" +} +``` + +Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ссылку Π½Π° сайт ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈΠ»ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π² полях `homepage` ΠΈΠ»ΠΈ `repository`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π»Π΅ описания ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»Π°ΡΡŒ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: + +```json +{ + "repository": { + "type": "git", + "url": "git+https://github.com/Akryum/vue-cli-plugin-apollo.git" + }, + "homepage": "https://github.com/Akryum/vue-cli-plugin-apollo#readme" +} +``` + +![Plugin search item](/plugin-search-item.png) diff --git a/docs/ru/dev-guide/ui-localization.md b/docs/ru/dev-guide/ui-localization.md new file mode 100644 index 0000000000..8fffb94dcd --- /dev/null +++ b/docs/ru/dev-guide/ui-localization.md @@ -0,0 +1,60 @@ +# Локализация Π² UI + +## Локализация стандартного UI + +Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги, для добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π² CLI UI! + +1. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ `navigator.languages` ΠΈΠ»ΠΈ `navigator.language`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ языка для Π½ΠΎΠ²ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. *НапримСр: `'fr'`.* + +2. ΠŸΠΎΠΈΡ‰ΠΈΡ‚Π΅ Π² NPM Π½Π΅ сущСствуСт Π»ΠΈ ΡƒΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ `vue-cli-locale-<ΠΊΠΎΠ΄ языка>`. Если сущСствуСт, поТалуйста отправляйтС Π² Π½Π΅Π³ΠΎ ΠΏΡƒΠ»Π»-рСквСстаы для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ! Если Π²Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ нашли, создайтС Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ `vue-cli-locale-<ΠΊΠΎΠ΄ языка>`. *НапримСр: `vue-cli-locale-fr`* + +3. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ JSON-Ρ„Π°ΠΉΠ» Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `locales` ΠΈ установитС Π΅ΠΌΡƒ Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ языковой ΠΊΠΎΠ΄. *НапримСр: `locales/fr.json`* + +4. Π’ Ρ„Π°ΠΉΠ»Π΅ `package.json` установитС полю `unpkg` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. *НапримСр: `"unpkg": "./locales/fr.json"`* + +5. ΠžΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ Π² NPM. + +Английская локализация для ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ находится [здСсь](https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-ui/locales/en.json). + +ВзглянитС Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° [ΠΏΠ°ΠΊΠ΅Ρ‚ французской Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ](https://github.com/Akryum/vue-cli-locale-fr). + +## Локализация вашСго ΠΏΠ»Π°Π³ΠΈΠ½Π° + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, совмСстимыС с [vue-i18n](https://github.com/kazupon/vue-i18n) Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `locales` Π² ΠΊΠΎΡ€Π½Π΅ вашСго ΠΏΠ»Π°Π³ΠΈΠ½Π°. Они Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `$t` для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строк Π² Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ возмоТности vue-i18n. Π’Π°ΠΊΠΆΠ΅, Π»ΡŽΠ±Ρ‹Π΅ строки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² UI API (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `describeTask`) Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ vue-i18n, поэтому Π²Ρ‹ смоТСтС Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡ…. + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° `locales`: + +``` +vue-cli-plugin/locales/en.json +vue-cli-plugin/locales/fr.json +``` + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² API: + +```js +api.describeConfig({ + // ΠΏΡƒΡ‚ΡŒ vue-i18n + description: 'com.my-name.my-plugin.config.foo' +}) +``` + +::: danger Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ! +Π’ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½; ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². РСкомСндуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ [Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). +::: + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…: + +```html +{{ $t('com.my-name.my-plugin.actions.bar') }} +``` + +Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π² клиСнтском Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `ClientAddonApi`: + +```js +// Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ vue-i18n) +const locales = require.context('./locales', true, /[a-z0-9]+\.json$/i) +locales.keys().forEach(key => { + const locale = key.match(/([a-z0-9]+)\./i)[1] + ClientAddonApi.addLocalization(locale, locales(key)) +}) +``` diff --git a/docs/ru/guide/README.md b/docs/ru/guide/README.md new file mode 100644 index 0000000000..d7b3ce33a9 --- /dev/null +++ b/docs/ru/guide/README.md @@ -0,0 +1,55 @@ +--- +sidebarDepth: 0 +--- + +# Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ + + + +::: warning ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ +Π­Ρ‚Π° докумСнтация для `@vue/cli` вСрсии **3.x**. Для старой вСрсии `vue-cli`, см. [здСсь](https://github.com/vuejs/vue-cli/tree/v2#vue-cli--). +::: + +Vue CLI β€” полноцСнная систСма для быстрой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Vue.js, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ: + +- Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ созданиС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· `@vue/cli`. +- БыстроС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· `@vue/cli` + `@vue/cli-service-global` Π±Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. +- Runtime-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ (`@vue/cli-service`) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ: + - Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обновлСния; + - Π‘ΠΎΠ·Π΄Π°Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ… webpack, с ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ настройками ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ; + - Настройка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅; + - Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ +- Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ коллСкция ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π»ΡƒΡ‡ΡˆΠΈΠ΅ инструмСнты экосистСмы Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°. +- ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ графичСский ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс для создания ΠΈ управлСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ Vue.js. + +Vue CLI стрСмится ΡΡ‚Π°Ρ‚ΡŒ стандартным инструмСнтариСм для экосистСмы Vue. Он обСспСчиваСт Π±Π΅ΡΠΏΠ΅Ρ€Π΅Π±ΠΎΠΉΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… инструмСнтов сборки, устанавливаСт Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Π΅ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, поэтому Π²Ρ‹ смоТСтС ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния, Π° Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π½ΠΈ Π·Π° Π΅Π³ΠΎ настройкой. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, остаётся Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ настройки ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ инструмСнта Π±Π΅Π· нСобходимости извлСчСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». + +## ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ систСмы + +Vue CLI состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… составных частСй β€” Ссли Π²Ρ‹ посмотритС Π½Π° [исходный ΠΊΠΎΠ΄](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue), Ρ‚ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ нСсколько ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². + +### CLI + +CLI (`@vue/cli`) β€” это npm-ΠΏΠ°ΠΊΠ΅Ρ‚, устанавливаСмый глобально ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `vue` Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅. Он позволяСт быстро ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `vue create`, ΠΈΠ»ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠ΄Π΅ΠΈ Ρ‡Π΅Ρ€Π΅Π· `vue serve`. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π² графичСском интСрфСйсС Ρ‡Π΅Ρ€Π΅Π· `vue ui`. ΠœΡ‹ рассмотрим, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… руководства. + +### БСрвис CLI + +БСрвис CLI (`@vue/cli-service`) β€” это Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π­Ρ‚ΠΎ npm-ΠΏΠ°ΠΊΠ΅Ρ‚, устанавливаСмый локально Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, создаваСмый с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `@vue/cli`. + +БСрвис CLI построСн Π½Π° основС [webpack](http://webpack.js.org/) ΠΈ [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Он содСрТит: + +- Π―Π΄Ρ€ΠΎ сСрвиса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для CLI; +- Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ webpack, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ; +- Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» `vue-cli-service` Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `serve`, `build` ΠΈ `inspect`. + +Если Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с [create-react-app](https://github.com/facebookincubator/create-react-app), Ρ‚ΠΎ `@vue/cli-service` ΠΏΠΎΡ…ΠΎΠΆ Π½Π° `react-scripts`, хотя Π½Π°Π±ΠΎΡ€ возмоТностСй ΠΈ отличаСтся. + +Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ [БСрвис CLI](./cli-service.md) всё это разбираСтся ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅. + +### ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ для CLI + +ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ для CLI β€” это npm-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности для Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², создаваСмых Ρ‡Π΅Ρ€Π΅Π· Vue CLI, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ транспиляция Babel / TypeScript, интСграция ESLint, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС, ΠΈ E2E-тСстированиС. Π›Π΅Π³ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для Vue CLI, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с `@vue/cli-plugin-` (для встроСнных ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²) ΠΈΠ»ΠΈ `vue-cli-plugin-` (для ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² сообщСства). + +Когда Π²Ρ‹ запускаСтС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» `vue-cli-service` Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΎΠ½ автоматичСски опрСдСляСт ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ CLI, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ `package.json` ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° этапС Π΅Π³ΠΎ создания ΠΈΠ»ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ·Π΄Π½Π΅Π΅. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ сгруппированы Π² ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ прСсСты настроСк. ΠœΡ‹ обсудим ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈ прСсСты](./plugins-and-presets.md). diff --git a/docs/ru/guide/browser-compatibility.md b/docs/ru/guide/browser-compatibility.md new file mode 100644 index 0000000000..b8456daccd --- /dev/null +++ b/docs/ru/guide/browser-compatibility.md @@ -0,0 +1,78 @@ +# Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ + +## browserslist + +Π’Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅ `browserslist` Π² Ρ„Π°ΠΉΠ»Π΅ `package.json` (ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ» `.browserslistrc`), Π³Π΄Π΅ опрСдСляСтся Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ разрабатываСтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π­Ρ‚ΠΈ значСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² [@babel/preset-env][babel-preset-env] ΠΈ [autoprefixer][autoprefixer] для автоматичСского опрСдСлСния возмоТностСй JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбуСтся Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ прСфиксныС ΠΏΡ€Π°Π²ΠΈΠ»Π° CSS. + +Как указываСтся Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ [здСсь][browserslist]. + +## ΠŸΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ + +По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Vue CLI ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ [@vue/babel-preset-app][babel-preset-app], Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `@babel/preset-env` ΠΈ конфигурация `browserslist` для опрСдСлСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ². + +### useBuiltIns: 'usage' + +По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² `@babel/preset-env` Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ [`useBuiltIns: 'usage'`](https://new.babeljs.io/docs/en/next/babel-preset-env.html#usebuiltins-usage) для автоматичСского опрСдСлСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ², ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ возмоТности языка Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² исходном ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ сборку ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ минимально Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ². Однако, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ **Ссли ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΡˆΠΈΡ… зависимостСй ΠΈΠΌΠ΅Π΅Ρ‚ спСцифичныС трСбования ΠΊ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π°ΠΌ, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Babel Π½Π΅ смоТСт это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ.** + +Если ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π°ΡˆΠΈΡ… зависимостСй Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹, Ρƒ вас Π΅ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²: + +1. **Если Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ написана Π² вСрсии ES, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ окруТСния:** Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ эту Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΎΠΏΡ†ΠΈΡŽ [`transpileDependencies`](../config/#transpiledependencies) Π² Ρ„Π°ΠΉΠ»Π΅ `vue.config.js`. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ синтаксичСскиС прСобразования, Ρ‚Π°ΠΊ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ² для ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… возмоТностСй для этой зависимости. + +2. **Если Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ прСдоставляСт ES5 ΠΊΠΎΠ΄ ΠΈ явно пСрСчисляСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹:** Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ [polyfills](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/babel-preset-app#polyfills) для `@vue/babel-preset-app`. **ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ `es6.promise` Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ часто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, основанных Π½Π° Promise.** + + ``` js + // babel.config.js + module.exports = { + presets: [ + ['@vue/app', { + polyfills: [ + 'es6.promise', + 'es6.symbol' + ] + }] + ] + } + ``` + + ::: tip Π‘ΠΎΠ²Π΅Ρ‚ + РСкомСндуСтся Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π° Π½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΊΠΎΠ΄Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ пСрСчислСнныС здСсь, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ автоматичСски ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, Ссли Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² `browserslist`, ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. + ::: + +3. **Если Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ прСдоставляСт ES5 ΠΊΠΎΠ΄, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ возмоТности ES6+ Π±Π΅Π· явного пСрСчислСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Vuetify):** Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `useBuiltIns: 'entry'` ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ `import '@babel/polyfill'` Π² Ρ„Π°ΠΉΠ» Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ **Π’Π‘Π•** ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹, Π½Π° основС Ρ†Π΅Π»Π΅ΠΉ, пСрСчислСнных Π² `browserslist`, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π°Ρ… для зависимостСй, Π½ΠΎ это скорСС всСго ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ сборки Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π°ΠΌΠΈ. + +ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π² [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ @babel-preset/env](https://new.babeljs.io/docs/en/next/babel-preset-env.html#usebuiltins-usage). + +### ΠŸΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ ΠΏΡ€ΠΈ сборки Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² + +ΠŸΡ€ΠΈ использовании Vue CLI для [сборки Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²](./build-targets.md), рСкомСндуСтся ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ `useBuiltIns: false` для `@vue/babel-preset-app` Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ автоматичСскоС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ². Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ добавляСтС Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ Π² свой ΠΊΠΎΠ΄, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. + +## Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ + +Благодаря Babel ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС новСйшиС возмоТности языка ES2015+, Π½ΠΎ это Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½ΡΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ сборку с ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π°ΠΌΠΈ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ старых Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ². Π­Ρ‚ΠΈ транспилированныС сборки Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ большС Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅, Ρ‡Π΅ΠΌ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ Π² ES2015+, Π° ΠΈΡ… парсинг ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ происходит ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅. Учитывая, Ρ‡Ρ‚ΠΎ сСгодня Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ прСкрасная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ES2015, становится пустой Ρ‚Ρ€Π°Ρ‚ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ тяТёлый ΠΈ ΠΌΠ΅Π½Π΅Π΅ эффСктивный ΠΊΠΎΠ΄ для Π½ΠΈΡ… лишь ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ старыС вСрсии Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ². + +Vue CLI прСдоставляСт Β«Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΡ€ΠΈ сборкС для production с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: + +``` bash +vue-cli-service build --modern +``` + +Vue CLI Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ **Π΄Π²Π΅ вСрсии** вашСго прилоТСния: пСрвая сборка для соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ [ES-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ](https://jakearchibald.com/2017/es-modules-in-browsers/), Π° вторая сборка для старых Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ. + +ΠŸΡ€ΠΈΡΡ‚Π½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π΅ трСбуСтся. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ HTML-Ρ„Π°ΠΉΠ» автоматичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² классном [постС Π€ΠΈΠ»Π»ΠΈΠΏΠ° Π£ΠΎΠ»Ρ‚ΠΎΠ½Π°](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/): + +- БоврСмСнная сборка загруТаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ` + + + + +``` + +### Π‘Π±ΠΎΡ€ΠΊΠ°, Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ нСсколько Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² + +ΠŸΡ€ΠΈ сборкС Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ выраТСния Π² качСствС Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ: + +``` +vue-cli-service build --target wc --name foo 'src/components/*.vue' +``` + +ΠŸΡ€ΠΈ сборкС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² `--name` Π±ΡƒΠ΄Π΅Ρ‚ использовано Π² качСствС прСфикса, Π° имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. НапримСр, для `--name foo` ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° `HelloWorld.vue`, ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ зарСгистрирован ΠΊΠ°ΠΊ ``. + +### Асинхронный Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ (Async Web Component) + +ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², сборка ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ довольно большой, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСгистрируСт сборка. Π Π΅ΠΆΠΈΠΌ асинхронных Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² создаёт сборку, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ Π½Π° части, с малСньким Ρ„Π°ΠΉΠ»ΠΎΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт ΠΎΠ±Ρ‰ΠΈΠΉ runtime ΠΌΠ΅ΠΆΠ΄Ρƒ всСми ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΈ Π·Π°Ρ€Π°Π½Π΅Π΅ рСгистрируСт всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ элСмСнты. ЀактичСская рСализация ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° загруТаСтся ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° экзСмпляр ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° страницС: + +``` +vue-cli-service build --target wc-async --name foo 'src/components/*.vue' +``` + +``` +File Size Gzipped + +dist/foo.0.min.js 12.80 kb 8.09 kb +dist/foo.min.js 7.45 kb 3.17 kb +dist/foo.1.min.js 2.91 kb 1.02 kb +dist/foo.js 22.51 kb 6.67 kb +dist/foo.0.js 17.27 kb 8.83 kb +dist/foo.1.js 5.24 kb 1.64 kb +``` + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° страницС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Vue ΠΈ Ρ„Π°ΠΉΠ» Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°: + +``` html + + + + + +``` diff --git a/docs/ru/guide/cli-service.md b/docs/ru/guide/cli-service.md new file mode 100644 index 0000000000..861bfa0933 --- /dev/null +++ b/docs/ru/guide/cli-service.md @@ -0,0 +1,139 @@ +# БСрвис CLI + +## ИспользованиС Binary + +Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Vue CLI, `@vue/cli-service` устанавливаСт Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ `vue-cli-service`. К Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Ρ‡Π΅Ρ€Π΅Π· `vue-cli-service` Π² npm-скриптах, ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· `./node_modules/.bin/vue-cli-service` ΠΈΠ· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. + +Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² `package.json` ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с прСсСтом настроСк ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: + +``` json +{ + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build" + } +} +``` + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ npm ΠΈΠ»ΠΈ Yarn: + +``` bash +npm run serve +# Π˜Π›Π˜ +yarn serve +``` + +Если Ρƒ вас установлСн [npx](https://github.com/zkat/npx) (Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ с послСднСй вСрсиСй npm), Ρ‚ΠΎ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ: + +``` bash +npx vue-cli-service serve +``` + +::: tip Π‘ΠΎΠ²Π΅Ρ‚ +Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ возмоТностями ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· GUI Ρ‡Π΅Ρ€Π΅Π· `vue ui`. +::: + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Webpack Analyzer Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ· графичСского интСрфСйса: + +![UI Webpack Analyzer](/ui-analyzer.png) + +## vue-cli-service serve + +``` +ИспользованиС: vue-cli-service serve [options] [entry] + +ΠžΠΏΡ†ΠΈΠΈ: + + --open ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΡ€ΠΈ запускС сСрвСра + --copy ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ url Π² Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΏΡ€ΠΈ запускС сСрвСра + --mode ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ сборки (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: development) + --host ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ хост (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 0.0.0.0) + --port ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 8080) + --https ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ https (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: false) +``` + +Команда `vue-cli-service serve` запускаСт сСрвСр для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (основанный Π½Π° [webpack-dev-server](https://github.com/webpack/webpack-dev-server)), ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ горячСй Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. + +ΠšΡ€ΠΎΠΌΠ΅ Ρ„Π»Π°Π³ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ сСрвСр для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поля [devServer](../config/#devserver) Π² Ρ„Π°ΠΉΠ»Π΅ `vue.config.js`. + +## vue-cli-service build + +``` +ИспользованиС: vue-cli-service build [options] [entry|pattern] + +ΠžΠΏΡ†ΠΈΠΈ: + + --mode ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ сборки (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: production) + --dest ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ сборки (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: dist) + --modern ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² с Π°Π²Ρ‚ΠΎ-фоллбэком для старых + --target app | lib | wc | wc-async (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: app) + --name имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Ρ€Π΅ΠΆΠΈΠΌ Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: "name" Π² package.json ΠΈΠ»ΠΈ имя Ρ„Π°ΠΉΠ»Π° Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°) + --no-clean Π½Π΅ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ dist ΠΏΠ΅Ρ€Π΅Π΄ сборкой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + --report ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ report.html для Π°Π½Π°Π»ΠΈΠ·Π° содСрТимого сборки + --report-json ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ report.json для Π°Π½Π°Π»ΠΈΠ·Π° содСрТимого сборки + --watch ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ измСнСния +``` + +Команда `vue-cli-service build` создаёт Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ для production-сборку Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ `dist/`, с ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ для JS / CSS / HTML ΠΈ автоматичСским Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Π΅Π½Π΄ΠΎΡ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° вставляСтся ΠΈΠ½Π»Π°ΠΉΠ½ Π² HTML. + +Π•ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ²: + +- `--modern` собираСт вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ [Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ](./browser-compatibility.md#соврСмСнный-Ρ€Π΅ΠΆΠΈΠΌ), поставляСт Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ES2015 Π² соврСмСнныС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΅Π³ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ автоматичСский fallback Π½Π° сборку для старых Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ². + +- `--target` позволяСт Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ»ΠΈ Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [Π¦Π΅Π»ΠΈ сборки](./build-targets.md). + +- `--report` ΠΈ `--report-json` Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Ρ‹ Π½Π° основС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ статистики сборки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² сборкС. + +## vue-cli-service inspect + +``` +ИспользованиС: vue-cli-service inspect [options] [...paths] + +ΠžΠΏΡ†ΠΈΠΈ: + + --mode ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ сборки (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: development) +``` + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `vue-cli-service inspect` для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ webpack Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Vue CLI. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [просмотр ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Webpack ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°](./webpack.md#просмотр-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ-webpack-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°). + +## Бписок всСх доступных ΠΊΠΎΠΌΠ°Π½Π΄ + +НСкоторыС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ CLI Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ собствСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² `vue-cli-service`. НапримСр, `@vue/cli-plugin-eslint` внСдряСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `vue-cli-service lint`. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ вСсь список ΠΊΠΎΠΌΠ°Π½Π΄ запустив: + +``` bash +npx vue-cli-service help +``` + +Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ доступных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ: + +``` bash +npx vue-cli-service help [command] +``` + +## ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ параллСлизация + +- `cache-loader` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для компиляции Vue / Babel / TypeScript ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π€Π°ΠΉΠ»Ρ‹ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ `node_modules/.cache` β€” Ссли ΠΏΡ€ΠΈ запускС Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с компиляциСй, сначала ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ кэша. + +- `thread-loader` Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для транспиляции Babel / TypeScript ΠΊΠΎΠ³Π΄Π° Π² систСмС доступно Π±ΠΎΠ»Π΅Π΅ 1 процСссорного ядра. + +## Git Ρ…ΡƒΠΊΠΈ + +ПослС установки `@vue/cli-service` Ρ‚Π°ΠΊΠΆΠ΅ добавляСтся [yorkie](https://github.com/yyx990803/yorkie), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Git Ρ…ΡƒΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ»Π΅ `gitHooks` Π² Ρ„Π°ΠΉΠ»Π΅ `package.json`: + +``` json +{ + "gitHooks": { + "pre-commit": "lint-staged" + } +} +``` + +::: warning ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ +`yorkie` β€” это Ρ„ΠΎΡ€ΠΊ [`husky`](https://github.com/typicode/husky) Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости с Π½ΠΈΠΌ. +::: + +## ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π±Π΅Π· извлСчСния + +ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ созданныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `vue create` ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ Π±Π΅Π· нСобходимости Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки. ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, поэтому Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв всё Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ β€” это Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ возмоТности Π²ΠΎ врСмя ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… запросов Π²Ρ‹Π±ΠΎΡ€Π°. + +Однако, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ потрСбности, ΠΊΠ°ΠΊ ΠΈ потрСбности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ созданныС Vue CLI ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ практичСски всС аспСкты Π±Π΅Π· нСобходимости извлСчСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ](../config/). diff --git a/docs/ru/guide/creating-a-project.md b/docs/ru/guide/creating-a-project.md new file mode 100644 index 0000000000..15f1394fe2 --- /dev/null +++ b/docs/ru/guide/creating-a-project.md @@ -0,0 +1,79 @@ +# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +## vue create + +Для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° запуститС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: + +``` bash +vue create hello-world +``` + +::: warning ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ +Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Git Bash с minTTY Π½Π° Windows, Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ подсказки Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ЗапускайтС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ `winpty vue.cmd create hello-world`. +::: + +Π’Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ прСсСт настроСк. МоТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ прСсСт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (default), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт Babel + ESLint, ΠΈΠ»ΠΈ настройку Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (Β«Manually select featuresΒ») для Π²Ρ‹Π±ΠΎΡ€Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… возмоТностСй Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. + +![ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ CLI](/cli-new-project.png) + +Настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ подходят для быстрого прототипирования Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ настройка Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ прСдоставляСт большС ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ. + +![ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ CLI](/cli-select-features.png) + +ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ настройки Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π² самом ΠΊΠΎΠ½Ρ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ваш Π²Ρ‹Π±ΠΎΡ€ Π² качСствС Π½ΠΎΠ²ΠΎΠ³ΠΎ прСсСта настроСк, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ прСсСты настроСк ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΌΡ‹ обсудим Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. + +::: tip ~/.vuerc +Π‘ΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ прСсСты ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² JSON-Ρ„Π°ΠΉΠ»Π΅ `.vuerc` Π² домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Если Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сохранённыС прСсСты / настройки, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π² этот Ρ„Π°ΠΉΠ». + +Π’ процСссС создания ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [Taobao Π·Π΅Ρ€ΠΊΠ°Π»ΠΎ для npm рСгистра](https://npm.taobao.org/), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ установку зависимостСй. Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π±ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ сохранён Π² `~/.vuerc`. +::: + +Команда `vue create` прСдоставляСт мноТСство ΠΎΠΏΡ†ΠΈΠΉ β€” Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… всС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ²: + +``` bash +vue create --help +``` + +``` +ИспользованиС: create [options] + +созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ vue-cli-service + + +ΠžΠΏΡ†ΠΈΠΈ: + + -p, --preset ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ подсказки ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сохранённый ΠΈΠ»ΠΈ сторонний прСсСт настроСк + -d, --default ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ подсказки ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСсСт настроСк ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ + -i, --inlinePreset ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ подсказки ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ строку JSON Π² качСствС прСсСта настроСк + -m, --packageManager Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ npm ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ установкС зависимостСй + -r, --registry Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ npm рСгистр ΠΏΡ€ΠΈ установкС зависимостСй (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для npm) + -g, --git [message|false] Π€ΠΎΡ€ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ / ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ git, ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ сообщСниС ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ + -n, --no-git ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ git + -f, --force ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Ссли Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ + -c, --clone Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ git clone ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ стороннСго прСсСта настроСк + -x, --proxy Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ прокси ΠΏΡ€ΠΈ создании ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + -b, --bare Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π΅ показывая инструкции для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² + -h, --help Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± использовании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ +``` + +## ИспользованиС GUI + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· графичСский интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `vue ui`: + +``` bash +vue ui +``` + +Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ откроСтся ΠΎΠΊΠ½ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° с графичСским интСрфСйсом, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‚Π΅ ΠΆΠ΅ шаги создания ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +![UI preview](/ui-new-project.png) + +## Π¨Π°Π±Π»ΠΎΠ½Ρ‹ для вСрсии 2.x (староС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅) + +Vue CLI 3 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `vue`, поэтому ΠΎΠ½ пСрСзаписываСт Vue CLI 2 (`vue-cli`). Если Π²Π°ΠΌ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ староС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `vue init`, Π½ΡƒΠΆΠ½ΠΎ лишь ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ глобально Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ `@vue/cli-init`: + +``` bash +npm install -g @vue/cli-init +# vue init Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² vue-cli@2.x +vue init webpack my-project +``` diff --git a/docs/ru/guide/css.md b/docs/ru/guide/css.md new file mode 100644 index 0000000000..e724533cf1 --- /dev/null +++ b/docs/ru/guide/css.md @@ -0,0 +1,141 @@ +# Π Π°Π±ΠΎΡ‚Π° с CSS + +ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Vue CLI ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для [PostCSS](http://postcss.org/), [CSS-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ](https://github.com/css-modules/css-modules), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅-процСссоров, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ [Sass](https://sass-lang.com/), [Less](http://lesscss.org/) ΠΈ [Stylus](http://stylus-lang.com/). + +## Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ссылок Π½Π° рСсурсы + +Π’Π΅ΡΡŒ скомпилированный CSS обрабатываСтся [css-loader](https://github.com/webpack-contrib/css-loader), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ `url()` ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ зависимостями модуля. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° рСсурсы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ Π½Π° основС локальной Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ структуры. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„Π°ΠΉΠ» Π²Π½ΡƒΡ‚Ρ€ΠΈ npm-зависимости ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· псСвдоним webpack, ΠΏΡƒΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с прСфикса `~` для избСТания двусмыслСнности. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° статичСских рСсурсов](./html-and-static-assets.md#ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°-статичСских-рСсурсов). + +## ΠŸΡ€Π΅-процСссоры + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€Π΅-процСссоры (Sass/Less/Stylus) ΠΏΡ€ΠΈ создании ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Если Π²Ρ‹ этого Π½Π΅ сдСлали, Ρ‚ΠΎ внутрСнняя конфигурация webpack всё Ρ€Π°Π²Π½ΠΎ настроСна для ΠΈΡ… использования. Π’Π°ΠΌ лишь трСбуСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π΄ΠΎΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ для webpack: + +``` bash +# Sass +npm install -D sass-loader node-sass + +# Less +npm install -D less-loader less + +# Stylus +npm install -D stylus-loader stylus +``` + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… синтаксис Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² `*.vue` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ: + +``` vue + +``` + +### АвтоматичСскиС ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ + +Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ автоматичСски ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ (для Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, примСсСй...), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [style-resources-loader](https://github.com/yenshih/style-resources-loader). Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для stylus, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `./src/styles/imports.styl` Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ΄Π½ΠΎΡ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» stylus: + +```js +// vue.config.js +const path = require('path') + +module.exports = { + chainWebpack: config => { + const types = ['vue-modules', 'vue', 'normal-modules', 'normal'] + types.forEach(type => addStyleResource(config.module.rule('stylus').oneOf(type))) + }, +} + +function addStyleResource (rule) { + rule.use('style-resource') + .loader('style-resources-loader') + .options({ + patterns: [ + path.resolve(__dirname, './src/styles/imports.styl'), + ], + }) +} +``` + +Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [vue-cli-plugin-style-resources-loader](https://www.npmjs.com/package/vue-cli-plugin-style-resources-loader). + +## PostCSS + +Vue CLI ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ PostCSS Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя. + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ PostCSS Ρ‡Π΅Ρ€Π΅Π· `.postcssrc` ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, которая поддСрТиваСтся [postcss-load-config](https://github.com/michael-ciniawsky/postcss-load-config), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ [postcss-loader](https://github.com/postcss/postcss-loader) Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ†ΠΈΡŽ `css.loaderOptions.postcss` Π² Ρ„Π°ΠΉΠ»Π΅ `vue.config.js`. + +Плагин [autoprefixer](https://github.com/postcss/autoprefixer) Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ»Π΅ [browserslist](../guide/browser-compatibility.html#browserslist) Π² Ρ„Π°ΠΉΠ»Π΅ `package.json`. + +::: tip ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎ прСфиксных CSS ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… +Π’ сборкС для production Vue CLI ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ваш CSS ΠΈ удаляСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ прСфиксныС ΠΏΡ€Π°Π²ΠΈΠ»Π° CSS, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…. Π‘ `autoprefixer` Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ CSS-ΠΏΡ€Π°Π²ΠΈΠ»Π° Π±Π΅Π· прСфиксов. +::: + +## CSS-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ + +[CSS-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² Ρ„Π°ΠΉΠ»Π°Ρ… `*.vue`](https://vue-loader.vuejs.org/ru/guide/css-modules.html) доступны ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `