<%= htmlWebpackPlugin.options.title %>
title: 'Index Page',
// все фрагменты, добавляемые на этой странице, по умолчанию
- // это извлеченные общий фрагмент и вендорный фрагмент.
+ // это извлечённые общий фрагмент и вендорный фрагмент.
chunks: ['chunk-vendors', 'chunk-common', 'index']
},
// когда используется строковый формат точки входа, то
@@ -138,18 +138,20 @@ module.exports = {
### lintOnSave
-- Тип: `boolean | 'error'`
+- Тип: `boolean | 'warning' | 'default' | '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` показывает ошибки линтинга как предупреждения. По умолчанию предупреждения выводятся в терминал и не останавливают сборку ошибкой.
+ Когда значение `true` или `'warning'`, `eslint-loader` показывает ошибки линтинга как предупреждения. По умолчанию предупреждения выводятся в терминал и не останавливают сборку ошибкой, поэтому это хорошее значение по умолчанию для разработки.
- Чтобы ошибки линтинга отображались в браузере, можно указать `lintOnSave: 'error'`. Тогда `eslint-loader` будет всегда генерировать ошибки. Это также означает, что ошибки линтинга будут останавливать сборку ошибкой.
+ Для отображения ошибок линтинга в браузере можно указать `lintOnSave: 'default'`. Это заставит `eslint-loader` генерировать ошибки и любые ошибки линтинга приведут к неудаче компиляции сборки.
- Кроме того, вы можете настроить отображение в браузере предупреждений и ошибок:
+ Установка значения в `'errors'` заставит `eslint-loader` считать все предупреждения ошибками, а значит и они будут отображены в браузере.
- ``` js
+ Кроме того, можно настроить отображение в браузере предупреждений и ошибок:
+
+ ```js
// vue.config.js
module.exports = {
devServer: {
@@ -163,7 +165,7 @@ module.exports = {
Когда значение `lintOnSave` приводится к `true`, `eslint-loader` будет применяться как в разработке, так и в production. Если вы хотите отключить `eslint-loader` при сборке в production, можете воспользоваться следующей конфигурацией:
- ``` js
+ ```js
// vue.config.js
module.exports = {
lintOnSave: process.env.NODE_ENV !== 'production'
@@ -186,6 +188,14 @@ module.exports = {
По умолчанию `babel-loader` игнорирует все файлы из `node_modules`. Если вы хотите явно транспилировать зависимость с помощью Babel, то вы можете перечислить её в этой опции.
+::: warning Конфигурация Jest
+Эта опция не поддерживается [плагином cli-unit-jest](#jest), потому что в Jest мы не должны транспилировать код из `node_modules`, если в нём не используются нестандартные возможности — Node >8.11 уже поддерживает последние нововведения ECMAScript.
+
+Однако, Jest иногда требуется преобразовывать содержимое из `node_modules`, например если в этом коде используется синтаксис ES6 `import`/`export`. В таком случае используйте опцию `transformIgnorePatterns` в файле `jest.config.js`.
+
+См. [README плагина](../core-plugins/unit-jest.md) для получения дополнительной информации.
+:::
+
### productionSourceMap
- Тип: `boolean`
@@ -235,10 +245,20 @@ module.exports = {
### css.modules
+Устаревшая опция, начиная с версии v4, используйте вместо неё [`css.requireModuleExtension`](#css-requireModuleExtension).
+
+В версии v3 это противоположность опции `css.requireModuleExtension`.
+
+### css.requireModuleExtension
+
- Тип: `boolean`
-- По умолчанию: `false`
+- По умолчанию: `true`
+
+ По умолчанию, только файлы заканчивающиеся на `*.module.[ext]` обрабатываются как CSS-модули. Установка в значение `false` позволит вам убрать `.module` из имён файлов и обрабатывать все `*.(css|scss|sass|less|styl(us)?)` файлы как CSS-модули.
- По умолчанию, только файлы заканчивающиеся на `*.module.[ext]` обрабатываются как CSS-модули. Установка в значение `true` позволит вам убрать `.module` из имён файлов и обрабатывать все `*.(css|scss|sass|less|styl(us)?)` файлы как CSS-модули.
+ ::: tip СОВЕТ
+ Если в `css.loaderOptions.css` есть настроенные конфигурации CSS-модулей, то поле `css.requireModuleExtension` должно быть явно указано в `true` или `false`, иначе нельзя быть уверенным необходимо ли применять эти параметры ко всем CSS-файлам или нет.
+ :::
См. также: [Работа с CSS — CSS-модули](../guide/css.md#css-модуnи)
@@ -255,6 +275,8 @@ module.exports = {
Извлечение CSS отключено по умолчанию в режиме `development`, поскольку оно несовместимо с горячей перезагрузкой CSS. Тем не менее, вы всё равно можете принудительно использовать извлечение стилей всегда, установив значение в `true`.
+ Вместо `true` также можно передать объект с настройками для [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) если необходимо детальнее настроить работу этого плагина.
+
### css.sourceMap
- Тип: `boolean`
@@ -269,7 +291,7 @@ module.exports = {
Передача настроек в загрузчики относящиеся к CSS. Например:
- ``` js
+ ```js
module.exports = {
css: {
loaderOptions: {
@@ -292,6 +314,8 @@ module.exports = {
- [less-loader](https://github.com/webpack-contrib/less-loader)
- [stylus-loader](https://github.com/shama/stylus-loader)
+ Также можно настроить синтаксис `scss` отдельно от `sass` через опцию `scss`.
+
См. также: [Передача настроек в загрузчики пре-процессоров](../guide/css.md#передача-настроек-в-загрузчики-пре-процессоров)
::: tip Совет
@@ -316,7 +340,7 @@ module.exports = {
`devServer.proxy` может быть строкой, указывающей на сервер API для разработки:
- ``` js
+ ```js
module.exports = {
devServer: {
proxy: 'http://localhost:4000'
@@ -326,9 +350,13 @@ module.exports = {
Это скажет серверу разработки проксировать любые неизвестные запросы (запросы, которые не соответствуют статическому файлу) на адрес `http://localhost:4000`.
+ ::: warning ПРЕДУПРЕЖДЕНИЕ
+ При указании `devServer.proxy` строкой будут проксироваться только XHR-запросы. Если необходимо протестировать API URL, не открывайте его в браузере, а вместо этого используйте инструмент для работы с API (например, Postman).
+ :::
+
Если вам нужно больше контроля поведения прокси-сервера, вы также можете использовать объект с парами опций `path: options`. См. полный список опций [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware#proxycontext-config):
- ``` js
+ ```js
module.exports = {
devServer: {
proxy: {
@@ -347,10 +375,10 @@ module.exports = {
### parallel
-- Тип: `boolean`
+- Тип: `boolean | number`
- По умолчанию: `require('os').cpus().length > 1`
- Использовать ли `thread-loader` для транспиляции Babel или TypeScript. Включается для production-сборок, когда система имеет более 1 процессорных ядер.
+ Использовать ли `thread-loader` для транспиляции Babel или TypeScript. Включается для production-сборок, когда система имеет более 1 процессорных ядер. Указание числа определит количество задействованных воркеров (workers).
### pwa
@@ -364,7 +392,7 @@ module.exports = {
Этот объект не проходит никакой валидации своей структуры, поэтому можно его использовать для передачи произвольных параметров сторонним плагинам. Например:
- ``` js
+ ```js
module.exports = {
pluginOptions: {
foo: {
diff --git a/docs/ru/core-plugins/README.md b/docs/ru/core-plugins/README.md
new file mode 100644
index 0000000000..5e4a27c30f
--- /dev/null
+++ b/docs/ru/core-plugins/README.md
@@ -0,0 +1,14 @@
+# Плагины
+
+Vue CLI использует архитектуру на основе плагинов. Если изучить `package.json` в только что созданном проекте, можно обнаружить зависимости, которые начинаются с `@vue/cli-plugin-`. Плагины могут модифицировать внутреннюю конфигурацию webpack и внедрять команды в `vue-cli-service`. Большинство возможностей, перечисленных в процессе создания проекта, реализованы в виде плагинов.
+
+Этот раздел содержит документацию для основных плагинов Vue CLI:
+
+- [Babel](babel.md)
+- [TypeScript](typescript.md)
+- [ESLint](eslint.md)
+- [PWA](pwa.md)
+- [Jest](unit-jest.md)
+- [Mocha](unit-mocha.md)
+- [Cypress](e2e-cypress.md)
+- [Nightwatch](e2e-nightwatch.md)
diff --git a/docs/ru/core-plugins/babel.md b/docs/ru/core-plugins/babel.md
new file mode 100644
index 0000000000..0182ee71c7
--- /dev/null
+++ b/docs/ru/core-plugins/babel.md
@@ -0,0 +1,39 @@
+# @vue/cli-plugin-babel
+
+> Плагин babel для vue-cli
+
+## Конфигурация
+
+По умолчанию используется Babel 7 + `babel-loader` + [@vue/babel-preset-app](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/babel-preset-app), но есть возможность конфигурации через `babel.config.js` для использования любых других пресетов Babel или плагинов.
+
+По умолчанию `babel-loader` исключает файлы внутри зависимостей из `node_modules`. Если вы хотите явно транспилировать модуль какой-то зависимости, необходимо указать его в опции `transpileDependencies` в файле `vue.config.js`:
+
+```js
+module.exports = {
+ transpileDependencies: [
+ // может быть строкой или regex
+ 'my-dep',
+ /other-dep/
+ ]
+}
+```
+
+## Кэширование
+
+[cache-loader](https://github.com/webpack-contrib/cache-loader) используется по умолчанию, кэш хранится в `/node_modules/.cache/babel-loader`.
+
+## Параллелизация
+
+[thread-loader](https://github.com/webpack-contrib/thread-loader) используется по умолчанию, если машина имеет более 1 ядра CPU. Это можно отключить указав `parallel: false` в файле `vue.config.js`.
+
+## Установка в уже созданный проект
+
+```sh
+vue add babel
+```
+
+## Внедряемые правила webpack-chain
+
+- `config.rule('js')`
+- `config.rule('js').use('babel-loader')`
+- `config.rule('js').use('cache-loader')`
diff --git a/docs/ru/core-plugins/e2e-cypress.md b/docs/ru/core-plugins/e2e-cypress.md
new file mode 100644
index 0000000000..4878cd6023
--- /dev/null
+++ b/docs/ru/core-plugins/e2e-cypress.md
@@ -0,0 +1,48 @@
+# @vue/cli-plugin-e2e-cypress
+
+> Плагин e2e-cypress для vue-cli
+
+Он добавляет поддержку E2E тестирования с помощью [Cypress](https://www.cypress.io/).
+
+Cypress предлагает богатый интерактивный интерфейс для запуска E2E тестов, но в настоящее время поддерживается запуск тестов только в Chromium. При наличии жёстких требований к E2E тестированию в нескольких браузерах, обратите внимание на плагин [@vue/cli-plugin-e2e-nightwatch](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-e2e-nightwatch), основанный на Selenium.
+
+## Внедряемые команды
+
+- **`vue-cli-service test:e2e`**
+
+ Запуск E2E тестов через `cypress run`.
+
+ По умолчанию Cypress запускается в интерактивном режиме с графическим интерфейсом. Если необходимо запустить тесты в безголовом (headless) режиме (например, для CI), то следует указывать опцию `--headless`.
+
+ Команда автоматически запустит сервер в режиме production для выполнения E2E тестов. Если требуется запускать тесты несколько раз без необходимости перезапускать сервер каждый раз, можно запустить сервер с `vue-cli-service serve --mode production` в одном терминале, а затем запускать E2E тесты на этом сервере с помощью опции `--url`.
+
+ Опции:
+
+ ```
+ --headless запуск headless-режиме без GUI
+ --mode указывает режим запуска сервера (по умолчанию: production)
+ --url запускать E2E тесты с заданным URL вместо авто-запуска сервера
+ -s, --spec (только в headless-режиме) запуск определённого файла. По умолчанию "all"
+ ```
+
+ Дополнительно:
+
+ - В режиме GUI, [все опции Cypress CLI для `cypress open`](https://docs.cypress.io/guides/guides/command-line.html#cypress-open) поддерживаются;
+ - В режиме `--headless`, [все опции Cypress CLI для `cypress run`](https://docs.cypress.io/guides/guides/command-line.html#cypress-run) поддерживаются.
+
+ Примеры:
+ - Запуск Cypress в headless-режиме для конкретного файла: `vue-cli-service test:e2e --headless --spec tests/e2e/specs/actions.spec.js`
+
+## Конфигурация
+
+Cypress пред-настроен под размещение всех файлов, связанных с E2E тестированием, в каталоге `/tests/e2e`. При необходимости можно [настраивать Cypress через `cypress.json`](https://docs.cypress.io/guides/references/configuration.html#Options).
+
+## Переменные окружения
+
+Cypress не загружает .env файлы для ваших файлов тестов, как это делает `vue-cli` для [кода приложения](../guide/mode-and-env.md#%D0%B8%D1%81%D0%BF%D0%BEn%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D0%BAn%D0%B8%D0%B5%D0%BD%D1%82%D1%81%D0%BA%D0%BE%D0%BC-%D0%BA%D0%BE%D0%B4%D0%B5). Cypress поддерживает несколько способов для [определения переменных окружения](https://docs.cypress.io/guides/guides/environment-variables.html#), но самым простым будем использование .json файлов (`cypress.json` или `cypress.env.json`) для определения переменных окружения. Обратите внимание, что эти переменные доступны через функцию `Cypress.env`, а не через объект `process.env`.
+
+## Установка в уже созданный проект
+
+```sh
+vue add e2e-cypress
+```
diff --git a/docs/ru/core-plugins/e2e-nightwatch.md b/docs/ru/core-plugins/e2e-nightwatch.md
new file mode 100644
index 0000000000..99d594c971
--- /dev/null
+++ b/docs/ru/core-plugins/e2e-nightwatch.md
@@ -0,0 +1,141 @@
+# @vue/cli-plugin-e2e-nightwatch
+
+> Плагин e2e-nightwatch для vue-cli
+
+## Внедряемые команды
+
+- **`vue-cli-service test:e2e`**
+
+ Запускает E2E тесты с помощью [Nightwatch.js](https://nightwatchjs.org).
+
+ Опции:
+
+ ```
+ --url запуск E2E-тестов по указанному URL, вместо авто-запуска сервера
+ --config использовать пользовательский файл конфигурации nightwatch (перезаписывает внутренние настройки)
+ --headless использовать chrome или firefox в headless-режиме
+ --parallel использовать параллельный режим через test workers (доступно только в chromedriver)
+ --use-selenium использовать сервер Selenium вместо chromedriver или geckodriver
+ -e, --env окружения браузеров через запятую для тестирования (по умолчанию: chrome)
+ -t, --test запустить тест по указанному пути к файлу
+ -f, --filter glob для фильтрации тестов по имени файла
+ ```
+
+ [Поддерживаются все опции Nightwatch CLI](https://nightwatchjs.org/guide/running-tests/#command-line-options). Например: `--verbose`, `--retries` и т.д.
+
+## Структура проекта
+
+При установке плагина генерируется следующая структура каталогов. В ней будут примеры для большинства концептов тестирования доступных в Nightwatch.
+
+```
+tests/e2e/
+ ├── custom-assertions/
+ | └── elementCount.js
+ ├── custom-commands/
+ | ├── customExecute.js
+ | ├── openHomepage.js
+ | └── openHomepageClass.js
+ ├── page-objects/
+ | └── homepage.js
+ ├── specs/
+ | ├── test.js
+ | └── test-with-pageobjects.js
+ └── globals.js
+```
+
+#### `specs`
+Основное место расположения тестов. Может содержать вложенные каталоги, которые можно выбирать при запуске с помощью аргумента `--group`. [Подробнее](https://nightwatchjs.org/guide/running-tests/#test-groups).
+
+#### `custom-assertions`
+Расположенные здесь файлы будут автоматически загружаться Nightwatch и добавляться в API `.assert` и `.verify` для расширения встроенных методов утверждений Nightwatch. Подробнее в документации [по созданию пользовательских утверждений](https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-assertions).
+
+#### `custom-commands`
+Расположенные здесь файлы будут автоматически загружаться Nightwatch и добавляться в API объекта `browser` для расширения встроенных команд Nightwatch. Подробнее в документации [по созданию пользовательских команд](https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands).
+
+#### `page objects`
+Работа с объектами страниц — популярная методология в E2E-тестировании UI. Расположенные здесь файлы будут автоматически добавляться в API `.page`, при этом имя файла определит имя объекта страницы. Подробнее в документации [по работе с объектами страниц](https://nightwatchjs.org/guide/working-with-page-objects/).
+
+#### `globals.js`
+Файл внешних глобальных переменных, который может содержать глобальные свойства или хуки. Подробнее в документации [по глобальным свойствам тестов](https://nightwatchjs.org/gettingstarted/configuration/#test-globals).
+
+## Установка в уже созданный проект
+
+```sh
+vue add e2e-nightwatch
+```
+
+## Конфигурация
+
+Nightwatch предварительно сконфигурирован для запуска в Chrome по умолчанию. Доступен также Firefox через `--env firefox`. При необходимости запускать end-to-end тесты в других браузерах (например, Safari, Microsoft Edge), нужно добавить `nightwatch.conf.js` или `nightwatch.json` в корневой каталог проекта для настройки дополнительных браузеров. Конфигурация будет объединена во [внутреннюю конфигурацию Nightwatch](https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-plugin-e2e-nightwatch/nightwatch.config.js).
+
+При необходимости можно полностью заменить внутреннюю конфигурацию собственной с помощью опции `--config`.
+
+Обратитесь к документации Nightwatch для информации о [параметрах конфигурации](https://nightwatchjs.org/gettingstarted/configuration/) и как [устанавливать драйверы браузеров](http://nightwatchjs.org/gettingstarted#browser-drivers-setup).
+
+## Запуск тестов
+
+По умолчанию, все тесты внутри каталога `specs` будут запускаться с использованием Chrome. Если необходимо запустить end-to-end тесты в headless-режиме в Chrome (или Firefox), укажите аргумент `--headless`.
+
+```sh
+$ vue-cli-service test:e2e
+```
+
+**Запуск одного теста**
+
+Для запуска одного теста укажите путь к файлу. Например:
+
+```sh
+$ vue-cli-service test:e2e tests/e2e/specs/test.js
+```
+
+**Пропустить автоматический запуск сервера разработки**
+
+Если сервер разработки уже запущен и необходимо пропустить автоматический запуск, укажите аргумент `--url`:
+
+```sh
+$ vue-cli-service test:e2e --url http://localhost:8080/
+```
+
+**Запуск тестов в Firefox**
+
+По умолчанию также поддерживается запуск тестов в Firefox. Выполните следующую команду (опционально можно добавить `--headless` для запуска Firefox в безголовом режиме):
+
+```sh
+$ vue-cli-service test:e2e --env firefox [--headless]
+```
+
+**Запуск тестов в Firefox и Chrome одновременно**
+
+Можно запускать тесты одновременно в обоих браузерах, определяя требуемые тестовые окружения через запятую (",") — не используя пробелы.
+
+```sh
+$ vue-cli-service test:e2e --env firefox,chrome [--headless]
+```
+
+**Запуск тестов в параллельном режиме**
+
+Для значительного увеличения скорости тестирования можно включить параллельный запуск тестов если имеются в наличии несколько тестовых наборов. Согласование осуществляется на файловом уровне и автоматически распределяется по доступным ядрам процессора.
+
+На данный момент возможность доступна только в Chromedriver. Подробнее о [режиме параллельной работы](https://nightwatchjs.org/guide/running-tests/#parallel-running) можно прочитать в документации Nightwatch.
+
+```sh
+$ vue-cli-service test:e2e --parallel
+```
+
+**Запуск тестов с Selenium**
+
+Поскольку с версии `v4` автономный сервер Selenium больше не включён в этот плагин, да и в большинстве случаев работа с Selenium не требуется с версии Nightwatch v1.0.
+
+Но возможность использования сервера Selenium по-прежнему имеется, для этого необходимо выполнить следующие шаги:
+
+__1.__ Установите NPM-пакет `selenium-server`:
+
+ ```sh
+ $ npm install selenium-server --save-dev
+ ```
+
+__2.__ Запустите команду с аргументом `--use-selenium`:
+
+ ```sh
+ $ vue-cli-service test:e2e --use-selenium
+ ```
diff --git a/docs/ru/core-plugins/eslint.md b/docs/ru/core-plugins/eslint.md
new file mode 100644
index 0000000000..a96bfb1a34
--- /dev/null
+++ b/docs/ru/core-plugins/eslint.md
@@ -0,0 +1,72 @@
+# @vue/cli-plugin-eslint
+
+> Плагин eslint для vue-cli
+
+## Внедряемые команды
+
+- **`vue-cli-service lint`**
+
+ ```
+ Использование: vue-cli-service lint [options] [...files]
+
+ Опции:
+
+ --format [formatter] определяет форматтер (по умолчанию: codeframe)
+ --no-fix отключает автоматическое исправление ошибок
+ --max-errors количество ошибок, по достижению которого сборка заканчивается ошибкой (по умолчанию: 0)
+ --max-warnings количество предупреждений, по достижению которого сборка заканчивается ошибкой (по умолчанию: Infinity)
+ ```
+
+ Проверяет и исправляет файлы. Если конкретные файлы для проверки не указаны, то будут проверяться все файлы в `src` и `test`.
+
+ Другие [настройки ESLint CLI](https://eslint.org/docs/user-guide/command-line-interface#options) также поддерживаются.
+
+## Конфигурация
+
+ESLint можно настраивать через `.eslintrc` или поле `eslintConfig` в файле `package.json`.
+
+Линтинг при сохранении (Lint-on-save) при разработке с помощью `eslint-loader` включён по умолчанию. Это можно отключить с помощью опции `lintOnSave` в файле `vue.config.js`:
+
+```js
+module.exports = {
+ lintOnSave: false
+}
+```
+
+Если установлено `true`, `eslint-loader` будет показывать ошибки линтинга в виде предупреждений. По умолчанию предупреждения только логируются в терминале и не завершают компиляцию ошибкой.
+
+Чтобы показывать ошибки линтинга в браузере, можно использовать `lintOnSave: 'error'`. Это заставит `eslint-loader` всегда генерировать ошибки. Это также означает, что ошибки линтинга будут завершать компиляцию ошибкой.
+
+Кроме того, можно настроить отображение в браузере как предупреждений, так и ошибок:
+
+```js
+// vue.config.js
+module.exports = {
+ devServer: {
+ overlay: {
+ warnings: true,
+ errors: true
+ }
+ }
+}
+```
+
+Когда значение `lintOnSave` приводится к истине, `eslint-loader` будет применяться как в разработке, так и в production. Если необходимо отключить `eslint-loader` при сборке production, можно использовать следующую конфигурацию:
+
+```js
+// vue.config.js
+module.exports = {
+ lintOnSave: process.env.NODE_ENV !== 'production'
+}
+```
+
+## Установка в уже созданный проект
+
+```sh
+vue add eslint
+```
+
+## Внедряемые правила webpack-chain
+
+- `config.module.rule('eslint')`
+- `config.module.rule('eslint').use('eslint-loader')`
diff --git a/docs/ru/core-plugins/pwa.md b/docs/ru/core-plugins/pwa.md
new file mode 100644
index 0000000000..973a1b745e
--- /dev/null
+++ b/docs/ru/core-plugins/pwa.md
@@ -0,0 +1,128 @@
+# @vue/cli-plugin-pwa
+
+> Плагин pwa для vue-cli
+
+Добавляемый этим плагином service worker включается только в production окружении (к примеру, только при запуске сборки через `npm run build` или `yarn build`). Использование service worker при разработке не рекомендуется, так как может привести к ситуации, когда используются кэшированные ранее ресурсы и не учитываются последние локальные изменения.
+
+Вместо этого в режиме разработки добавляется файл `noopServiceWorker.js`. Этот файл service worker является эффективным 'no-op', который сбрасывает любые другие service worker, зарегистрированные ранее для такой же комбинации host:port.
+
+При необходимости протестировать service worker локально, соберите приложение и запустите простой HTTP-сервер из каталога сборки. Рекомендуется использовать браузер в инкогнито-режиме для избежания осложнений с кэшем вашего браузера.
+
+## Конфигурация
+
+Конфигурация осуществляется через свойство `pwa` в файле `vue.config.js`, или через поле `"vue"` в файле `package.json`.
+
+- **pwa.workboxPluginMode**
+
+ Выбор один из двух режимов, поддерживаемых используемым [`workbox-webpack-plugin`](https://developers.google.com/web/tools/workbox/modules/workbox-webpack-plugin).
+
+ - `'GenerateSW'` (по умолчанию) создание нового файла service worker каждый раз при пересборке приложения.
+
+ - `'InjectManifest'` использование существующего файла service worker и создание копии этого файла с внедрённым в него «precache manifest».
+
+ Руководство «[Какой плагин использовать?](https://developers.google.com/web/tools/workbox/modules/workbox-webpack-plugin#which_plugin_to_use)» поможет выбрать один из двух режимов.
+
+- **pwa.workboxOptions**
+
+ Настройки, передаваемые в используемый `workbox-webpack-plugin`.
+
+ Для получения дополнительной информации о поддерживаемых значениях обратитесь к руководству для [`GenerateSW`](https://developers.google.com/web/tools/workbox/modules/workbox-webpack-plugin#full_generatesw_config) или для [`InjectManifest`](https://developers.google.com/web/tools/workbox/modules/workbox-webpack-plugin#full_injectmanifest_config).
+
+- **pwa.name**
+
+ - По умолчанию: поле "name" в файле `package.json`
+
+ Используется в качестве значения мета-тега `apple-mobile-web-app-title` в сгенерированном HTML. Обратите внимание, необходимо отредактировать файл `public/manifest.json` для соответствия этому значению.
+
+- **pwa.themeColor**
+
+ - По умолчанию: `'#4DBA87'`
+
+- **pwa.msTileColor**
+
+ - По умолчанию: `'#000000'`
+
+- **pwa.appleMobileWebAppCapable**
+
+ - По умолчанию: `'no'`
+
+ По умолчанию значение `'no'`, потому что iOS до версии 11.3 не имела надлежащей поддержки PWA. См. [эту статью](https://medium.com/@firt/dont-use-ios-web-app-meta-tag-irresponsibly-in-your-progressive-web-apps-85d70f4438cb) для более подробной информации.
+
+- **pwa.appleMobileWebAppStatusBarStyle**
+
+ - По умолчанию: `'default'`
+
+- **pwa.assetsVersion**
+
+ - По умолчанию: `''`
+
+ Эта опция используется, если необходимо добавить версию к иконкам и манифесту для игнорирования кэша браузера. В результате добавится `?v=` к URL-адресам иконок и манифеста.
+
+- **pwa.manifestPath**
+
+ - По умолчанию: `'manifest.json'`
+
+ Путь к манифесту приложения.
+
+- **pwa.manifestOptions**
+
+ - По умолчанию: `{}`
+
+ Объект будет использоваться для генерации `manifest.json`
+
+ Если не определить следующие значения в объекте, то вместо них будут использованы значения опции `pwa` или значения по умолчанию.
+ - name: `pwa.name`
+ - short_name: `pwa.name`
+ - start_url: `'.'`
+ - display: `'standalone'`
+ - theme_color: `pwa.themeColor`
+
+- **pwa.iconPaths**
+
+ - По умолчанию:
+
+ ```js
+ {
+ favicon32: 'img/icons/favicon-32x32.png',
+ favicon16: 'img/icons/favicon-16x16.png',
+ appleTouchIcon: 'img/icons/apple-touch-icon-152x152.png',
+ maskIcon: 'img/icons/safari-pinned-tab.svg',
+ msTileImage: 'img/icons/msapplication-icon-144x144.png'
+ }
+ ```
+
+ Измените эти значения при необходимости использовать различные пути для иконок.
+
+### Пример конфигурации
+
+```js
+// Файл vue.config.js
+module.exports = {
+ // ...настройки других vue-cli плагинов...
+ pwa: {
+ name: 'My App',
+ themeColor: '#4DBA87',
+ msTileColor: '#000000',
+ appleMobileWebAppCapable: 'yes',
+ appleMobileWebAppStatusBarStyle: 'black',
+
+ // настройка workbox-плагина
+ workboxPluginMode: 'InjectManifest',
+ workboxOptions: {
+ // swSrc необходимо в режиме InjectManifest
+ swSrc: 'dev/sw.js',
+ // ...другие настройки Workbox...
+ }
+ }
+}
+```
+
+## Установка в уже созданный проект
+
+```sh
+vue add pwa
+```
+
+## Внедряемые правила webpack-chain
+
+- `config.plugin('workbox')`
diff --git a/docs/ru/core-plugins/router.md b/docs/ru/core-plugins/router.md
new file mode 100644
index 0000000000..2098948783
--- /dev/null
+++ b/docs/ru/core-plugins/router.md
@@ -0,0 +1,9 @@
+# @vue/cli-plugin-router
+
+> Плагин маршрутизации для vue-cli
+
+## Установка в уже созданный проект
+
+```sh
+vue add router
+```
diff --git a/docs/ru/core-plugins/typescript.md b/docs/ru/core-plugins/typescript.md
new file mode 100644
index 0000000000..5ce2c61e8c
--- /dev/null
+++ b/docs/ru/core-plugins/typescript.md
@@ -0,0 +1,39 @@
+# @vue/cli-plugin-typescript
+
+> Плагин typescript для vue-cli
+
+Использует TypeScript + `ts-loader` + [fork-ts-checker-webpack-plugin](https://github.com/Realytics/fork-ts-checker-webpack-plugin) для более быстрой проверки типов вне основного потока.
+
+## Конфигурация
+
+TypeScript может быть сконфигурирован через `tsconfig.json`.
+
+С версии `3.0.0-rc.6`, `typescript` является зависимостью этого пакета (peer dependency), поэтому можно использовать определённую версию TypeScript обновляя `package.json` проекта.
+
+Этот плагин может использоваться вместе с `@vue/cli-plugin-babel`. При использовании вместе с Babel, этот плагин должен генерировать ES2015 и делегировать остальное Babel для автоматического добавления полифилов на основе целевых браузеров.
+
+## Внедряемые команды
+
+При выборе [TSLint](https://palantir.github.io/tslint/) на этапе создания проекта, будет внедряться команда `vue-cli-service lint`.
+
+## Кэширование
+
+[cache-loader](https://github.com/webpack-contrib/cache-loader) используется по умолчанию, кэш хранится в `/node_modules/.cache/ts-loader`.
+
+## Параллелизация
+
+[thread-loader](https://github.com/webpack-contrib/thread-loader) используется по умолчанию, если машина имеет более 1 ядра CPU. Это можно отключить указав `parallel: false` в файле `vue.config.js`.
+
+## Установка в уже созданный проект
+
+```sh
+vue add typescript
+```
+
+## Внедряемые правила webpack-chain
+
+- `config.rule('ts')`
+- `config.rule('ts').use('ts-loader')`
+- `config.rule('ts').use('babel-loader')` (при использовании вместе с `@vue/cli-plugin-babel`)
+- `config.rule('ts').use('cache-loader')`
+- `config.plugin('fork-ts-checker')`
diff --git a/docs/ru/core-plugins/unit-jest.md b/docs/ru/core-plugins/unit-jest.md
new file mode 100644
index 0000000000..5c94bbfdff
--- /dev/null
+++ b/docs/ru/core-plugins/unit-jest.md
@@ -0,0 +1,70 @@
+# @vue/cli-plugin-unit-jest
+
+> Плагин unit-jest для vue-cli
+
+## Внедряемые команды
+
+- **`vue-cli-service test:unit`**
+
+ Запуск модульных тестов с помощью Jest. По умолчанию значением `testMatch` будет `/(tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx))` что совпадает с:
+
+ - Любыми файлами в `tests/unit` которые заканчиваются на `.spec.(js|jsx|ts|tsx)`;
+ - Любыми js(x)/ts(x) файлами внутри каталогов `__tests__`.
+
+ Использование: `vue-cli-service test:unit [options] `
+
+ Также поддерживаются все [опции Jest CLI](https://facebook.github.io/jest/docs/en/cli.html).
+
+## Отладка тестов
+
+Обратите внимание, что запуск `jest` напрямую будет заканчиваться ошибкой, потому что для пресета Babel требуются подсказки как заставить код работать в Node.js. Поэтому необходимо запускать тесты командой `vue-cli-service test:unit`.
+
+Если необходимо отладить тесты с помощью инспектора Node, можно запустить следующее:
+
+```sh
+# macOS или linux
+node --inspect-brk ./node_modules/.bin/vue-cli-service test:unit
+
+# Windows
+node --inspect-brk ./node_modules/@vue/cli-service/bin/vue-cli-service.js test:unit
+```
+
+## Конфигурация
+
+Jest можно настроить через `jest.config.js` в корне проекта, или через поле `jest` в файле `package.json`.
+
+## Установка в уже созданный проект
+
+```sh
+vue add unit-jest
+```
+
+## Обработка зависимостей из `/node_modules`
+
+По умолчанию jest не обрабатывает ничего из `/node_modules`.
+
+Поскольку jest работает на Node, то нет необходимости транспилировать всё, где используются современные возможности ECMAScript, так как Node >=8 уже их поддерживает, поэтому это разумное решение по умолчанию. По этой же причине также cli-plugin-jest не поддерживает опцию `transpileDependencies` в файле `vue.config.js`.
+
+Однако, есть (по крайней мере) три случая, когда необходимо транспилировать код из `/node_modules` в jest:
+
+1. Использование выражений ES6 `import`/`export`, которые нужно скомпилировать в формат commonjs `module.exports`
+2. Однофайловые компоненты (`.vue` файлы) которые запускаются через `vue-jest`
+3. Код Typescript
+
+Для этого необходимо добавить исключение в опции jest `transformIgnorePatterns`. Значение по умолчанию такое:
+
+```javascript
+transformIgnorePatterns: ['/node_modules/']
+```
+
+Необходимо добавить исключения из этого шаблона с негативным lookahead в RegExp:
+
+```javascript
+transformIgnorePatterns: ['/node_modules/(?!name-of-lib-o-transform)']
+```
+
+Для исключения нескольких библиотек:
+
+```javascript
+transformIgnorePatterns: ['/node_modules/(?!lib-to-transform|other-lib)']
+```
diff --git a/docs/ru/core-plugins/unit-mocha.md b/docs/ru/core-plugins/unit-mocha.md
new file mode 100644
index 0000000000..d295f3a6e1
--- /dev/null
+++ b/docs/ru/core-plugins/unit-mocha.md
@@ -0,0 +1,36 @@
+# @vue/cli-plugin-unit-mocha
+
+> Плагин unit-mocha для vue-cli
+
+## Внедряемые команды
+
+- **`vue-cli-service test:unit`**
+
+ Запускает тесты с помощью [mochapack](https://github.com/sysgears/mochapack) + [chai](http://chaijs.com/).
+
+ **Обратите внимание, что тесты запускаются в Node.js с симулированным JSDOM окружением браузера.**
+
+ ```
+ Использование: vue-cli-service test:unit [options] [...files]
+
+ Опции:
+
+ --watch, -w запуск в режиме отслеживания
+ --grep, -g запуск тестов, попадающих под
+ --slow, -s порог "медленных" тестов в миллисекундах
+ --timeout, -t порог таймаута в миллисекундах
+ --bail, -b останавливаться после первого неудачного теста
+ --require, -r подключить указанный модуль перед запуском тестов
+ --include включить указанный модуль в тестовую сборку
+ --inspect-brk использовать инспектор для отладки тестов
+ ```
+
+ По умолчанию под файлы тестов попадают: любые файлы `tests/unit` которые заканчиваются на `.spec.(ts|js)`.
+
+ Поддерживаются все [опции командной строки mochapack](https://sysgears.github.io/mochapack/docs/installation/cli-usage.html).
+
+## Установка в уже созданный проект
+
+```sh
+vue add unit-mocha
+```
diff --git a/docs/ru/core-plugins/vuex.md b/docs/ru/core-plugins/vuex.md
new file mode 100644
index 0000000000..d334e9e25e
--- /dev/null
+++ b/docs/ru/core-plugins/vuex.md
@@ -0,0 +1,9 @@
+# @vue/cli-plugin-vuex
+
+> Плагин vuex для vue-cli
+
+## Установка в уже созданный проект
+
+```sh
+vue add vuex
+```
diff --git a/docs/ru/dev-guide/generator-api.md b/docs/ru/dev-guide/generator-api.md
new file mode 100644
index 0000000000..48c17269e6
--- /dev/null
+++ b/docs/ru/dev-guide/generator-api.md
@@ -0,0 +1,179 @@
+# API генератора
+
+## cliVersion
+
+Тип: `string`
+
+Строка **глобальной** версии `@vue/cli`, вызывающей подключаемый плагин.
+
+## assertCliVersion
+
+- **Аргументы**
+ - `{integer | string} range` — semver диапазон, которому должна соответствовать `@vue/cli`
+
+- **Использование**
+
+ Хотя `api.version` и может быть полезным, иногда приятнее просто объявить требуемую версию. Данный API предоставляет простой способ сделать это.
+
+ Ничего не произойдёт, если предоставленная версия устраивает. В противном случае, будет выдана ошибка.
+
+## cliServiceVersion
+
+Тип: `string`
+
+Строка **локальной для проекта** версии `@vue/cli-service`, вызывающей подключаемый плагин.
+
+## assertCliServiceVersion
+
+- **Аргументы**
+ - `{integer | string} range` — semver диапазон, которому должна соответствовать `@vue/cli-service`
+
+- **Использование**
+
+ Данный API предоставляет простой способ указания требуемой локальной версии `@vue/cli-service`.
+
+ Ничего не произойдёт, если предоставленная версия устраивает. В противном случае, будет выдана ошибка.
+
+ Примечание: Рекомендуется использовать [поле `peerDependencies` в файле `package.json`](https://docs.npmjs.com/files/package.json#peerdependencies) в большинстве случаев.
+
+
+## resolve
+
+- **Аргументы**
+ - `{string} ..._paths` — Последовательность относительных путей или сегментов пути
+
+- **Возвращает**
+ - `{string}` — разрешённый (resolved) абсолютный путь, вычисленный на основе текущего корня проекта
+
+- **Использование**:
+Разрешение пути для текущего проекта
+
+## hasPlugin
+
+- **Аргументы**
+ - `{string} id` — идентификатор плагина, можно опустить префикс (@vue/|vue-|@scope/vue)-cli-plugin-
+ - `{string} version` — semver диапазон, опционально
+
+- **Возвращает**
+ - `{boolean}`
+
+- **Использование**:
+Проверяет есть ли в проекте плагин с указанным идентификатором. Если указан диапазон версий, то версия плагина должна соответствовать ему.
+
+## addConfigTransform
+
+- **Аргументы**
+ - `{string} key` — ключ конфигурации в package.json
+ - `{object} options` — настройки
+ - `{object} options.file` — дескриптор файла. Используется для поиска существующего файла. Каждый ключ определяет тип файла (возможные значения: `['js', 'json', 'yaml', 'lines']`). Значение представляет собой список имён файлов. Например:
+
+ ```js
+ {
+ js: ['.eslintrc.js'],
+ json: ['.eslintrc.json', '.eslintrc']
+ }
+ ```
+
+ По умолчанию первое имя файла будет использоваться для создания файла конфигурации.
+
+- **Возвращает**
+ - `{boolean}`
+
+- **Использование**:
+Настройка способа извлечения конфигурации.
+
+## extendPackage
+
+- **Аргументы**
+ - `{object | () => object} fields` — поля для объединения
+
+- **Использование**:
+Расширение `package.json` проекта. Вложенные поля объединяются, если не передавалось `{ merge: false }`. Также используется для разрешения конфликтов зависимостей между плагинами. Поля конфигурации инструмента могут быть извлечены в отдельные файлы до того, как файлы будут записаны на диск.
+
+## render
+
+- **Аргументы**
+ - `{string | object | FileMiddleware} source` — может быть одним из
+ - относительный путь к каталогу;
+ - хэш объект соответствий `{ sourceTemplate: targetFile }`;
+ - пользовательский файл с middleware функцией
+ - `{object} [additionalData]` — дополнительные данные, доступные для шаблонов
+ - `{object} [ejsOptions]` — настройки для ejs
+
+- **Использование**:
+Рендер файлов шаблонов в дерево виртуальных файлов.
+
+## postProcessFiles
+
+- **Аргументы**
+ - `{FileMiddleware} cb` — файл middleware
+
+- **Использование**:
+Добавление файла middleware, который будет выполняться после того, как все обычные middleware были выполнены.
+
+## onCreateComplete
+
+- **Аргументы**
+ - `{function} cb`
+
+- **Использование**:
+Добавление коллбэка, который будет вызываться после записи файлов на диск.
+
+## exitLog
+
+- **Аргументы**
+ - `{} msg` — строка или значение для отображения после завершения генерации;
+ - `{('log'|'info'|'done'|'warn'|'error')} [type='log']` — тип сообщения.
+
+- **Использование**:
+Добавление сообщения для отображения по завершении генерации (после любых других стандартных сообщений).
+
+## genJSConfig
+
+- **Аргументы**
+ - `{any} value`
+
+- **Использование**:
+Удобный способ создания JS файла конфигурации из JSON
+
+## makeJSOnlyValue
+
+- **Аргументы**
+ - `{any} str` — JS выражение в виде строки
+
+- **Использование**:
+Преобразует строковое выражение в исполняемый JS для конфигурационных .js файлов
+
+## injectImports
+
+- **Аргументы**
+ - `{string} file` — целевой файл для добавления импорта
+ - `{string | [string]} imports` — строка/массив импортов
+
+- **Использование**:
+Добавление импортов в файл.
+
+## injectRootOptions
+
+- **Аргументы**
+ - `{string} file` — целевой файл для добавления опций
+ - `{string | [string]} options` — строка/массив опций
+
+- **Использование**:
+Добавление опций в корневой экземпляр Vue (определяемый по `new Vue`).
+
+## entryFile
+
+- **Возвращает**
+ - `{('src/main.ts'|'src/main.js')}`
+
+- **Использование**:
+Получение входного файла, с учётом использования typescript.
+
+## invoking
+
+- **Возвращает**
+ - `{boolean}`
+
+- **Использование**:
+Проверка, вызван ли плагин.
diff --git a/docs/ru/dev-guide/plugin-api.md b/docs/ru/dev-guide/plugin-api.md
new file mode 100644
index 0000000000..287de8b9cd
--- /dev/null
+++ b/docs/ru/dev-guide/plugin-api.md
@@ -0,0 +1,132 @@
+# API плагина
+
+## version
+
+Тип: `string`
+
+Строка с версией `@vue/cli-service` загружающей плагин.
+
+## assertVersion
+
+- **Аргументы**
+ - `{integer | string} range` — semver диапазон, которому должен соответствовать `@vue/cli-service`
+
+- **Использование**
+
+ Хотя `api.version` и может быть полезным, иногда приятнее просто объявить требуемую версию. Данный API предоставляет простой способ сделать это.
+
+ Ничего не произойдёт, если предоставленная версия устраивает. В противном случае, будет выдана ошибка.
+
+ Примечание: Рекомендуется использовать [поле `peerDependencies` в файле `package.json`](https://docs.npmjs.com/files/package.json#peerdependencies) в большинстве случаев.
+
+## getCwd
+
+- **Использование**:
+Возвращает текущий рабочий каталог
+
+## resolve
+
+- **Аргументы**
+ - `{string} path` — относительный путь от корня проекта
+
+- **Возвращает**
+ - `{string}` — разрешённый (resolved) абсолютный путь
+
+- **Использование**:
+Разрешение пути для текущего проекта
+
+## hasPlugin
+
+- **Аргументы**
+ - `{string} id` — идентификатор плагина, можно опустить префикс (@vue/|vue-|@scope/vue)-cli-plugin-
+
+- **Возвращает**
+ - `{boolean}`
+
+- **Использование**:
+Проверяет есть ли в проекте плагин с указанным идентификатором
+
+## registerCommand
+
+- **Аргументы**
+ - `{string} name`
+ - `{object} [opts]`
+ ```js
+ {
+ description: string,
+ usage: string,
+ options: { [string]: string }
+ }
+ ```
+ - `{function} fn`
+ ```js
+ (args: { [string]: string }, rawArgs: string[]) => ?Promise
+ ```
+
+- **Использование**:
+Регистрация команды, доступной как `vue-cli-service [name]`.
+
+## chainWebpack
+
+- **Аргументы**
+ - `{function} fn`
+
+- **Использование**:
+Регистрация функции, которая получит chainable-конфигурацию webpack. Эта функция ленива и не будет вызываться до вызова функции `resolveWebpackConfig`.
+
+
+## configureWebpack
+
+- **Аргументы**
+ - `{object | function} fn`
+
+- **Использование**:
+Регистрация объекта конфигурации webpack, который будет объединён с конфигурацией **ИЛИ** функция, которая получит исходную конфигурацию webpack. Функция может либо мутировать конфигурацию напрямую, либо возвращать объект, который будет объединён с конфигурацией webpack.
+
+## configureDevServer
+
+- **Аргументы**
+ - `{object | function} fn`
+
+- **Использование**:
+Регистрация функции для конфигурирования сервера разработки. Она получает `app` экземпляр express сервера разработки.
+
+## resolveWebpackConfig
+
+- **Аргументы**
+ - `{ChainableWebpackConfig} [chainableConfig]`
+
+- **Возвращает**
+ - `{object}` — исходная конфигурация webpack
+
+- **Использование**:
+Разрешение финальной конфигурации webpack, которая и будет передана в webpack.
+
+## resolveChainableWebpackConfig
+
+- **Возвращает**
+ - `{ChainableWebpackConfig}`
+
+- **Использование**:
+Разрешение промежуточной chainable-конфигурации webpack, которую можно дополнительно настроить перед генерированием финальной конфигурации webpack. Можно вызывать несколько раз для генерации различных ветвей от базовой конфигурации webpack.
+
+Подробнее см. [https://github.com/mozilla-neutrino/webpack-chain](https://github.com/mozilla-neutrino/webpack-chain)
+
+## genCacheConfig
+
+- **Аргументы**
+ - `id`
+ - `partialIdentifier`
+ - `configFiles`
+
+- **Возвращает**
+ - `{object}`
+ ```js
+ {
+ cacheDirectory: string,
+ cacheIdentifier: string
+ }
+ ```
+
+- **Использование**:
+Генерация идентификатора кэша из нескольких переменных.
diff --git a/docs/ru/dev-guide/plugin-dev.md b/docs/ru/dev-guide/plugin-dev.md
index 0c979b3583..191e7ddb27 100644
--- a/docs/ru/dev-guide/plugin-dev.md
+++ b/docs/ru/dev-guide/plugin-dev.md
@@ -2,333 +2,879 @@
sidebarDepth: 3
---
-# Разработка плагинов
+# Руководство по разработке плагинов
-## Основные концепции
+## Введение
-Существуют две основные части системы:
+Плагин CLI — это npm-пакет, который может добавлять дополнительные возможности в проект с помощью Vue CLI. Эти функции могут включать в себя:
-- `@vue/cli`: установленный глобально, предоставляет команду `vue create `;
-- `@vue/cli-service`: установленный локально, предоставляет команду `vue-cli-service`.
+- изменение конфигурации webpack проекта — например, можно добавить новое правило для поддержки файлов определённых расширений, если плагин должен работать с ними. Например, `@vue/cli-plugin-typescript` добавляет такое правило для работы с файлами `.ts` и `.tsx`;
+- добавление новых команд vue-cli-service — например, `@vue/cli-plugin-unit-jest` добавляет новую команду `test:unit`, которая позволяет разработчику запускать модульные тесты;
+- расширение файла `package.json` — полезная опция, когда плагину для работы требуются новые зависимости и необходимо добавить их в раздел зависимостей проекта;
+- создание новых и/или изменение существующих файлов в проекте. Иногда полезно создать файл с примером компонента или изменить основной файл для добавления новых импортов;
+- предоставление пользователю возможности выбора требуемых опций — например, можно уточнить необходимость создания примера компонента, упомянутого выше.
-Обе части используют архитектуру, основанную на плагинах.
+:::tip Совет
+Не злоупотребляйте плагинами vue-cli! При необходимости просто добавить какую-то новую зависимость в проект, например [Lodash](https://lodash.com/) — лучше сделать это вручную, через npm, чем создавать специальный плагин для этого.
+:::
-### Creator
+Плагин CLI всегда должен содержать [плагин для сервиса](#пnагин-дnя-сервиса) в качестве своего основного экспорта, и может опционально содержать [генератор](#генератор), [файл интерактивных подсказок](#интерактивные-подсказки) и [интеграцию с Vue UI](#интеграция-с-ui).
-[Creator][creator-class] — это класс, создаваемый при вызове `vue create `. Отвечает за запросы пользователю для получения настроек, запускает генераторы и устанавливает зависимости.
+Как npm-пакет, плагин CLI должен иметь файл `package.json`. Также рекомендуется, чтобы у плагина было описание в файле `README.md`, чтобы помочь другим найти ваш плагин в npm.
-### Service
+Типичная структура плагина CLI выглядит следующим образом:
-[Service][service-class] — это класс, создаваемый при вызове `vue-cli-service [...args]`. Отвечает за управление внутренней конфигурацией webpack, и предоставляет команды для запуска и сборки проекта.
+```bash
+.
+├── README.md
+├── generator.js # генератор (опционально)
+├── index.js # плагин для сервиса
+├── package.json
+├── prompts.js # файл интерактивных подсказок (опционально)
+└── ui.js # интеграция с Vue UI (опционально)
+```
-### Плагин для CLI (CLI Plugin)
+## Именование и обнаруживаемость в поиске
-Плагин для CLI — это npm-пакет, который может добавлять дополнительные возможности в проект `@vue/cli`. Он должен всегда содержать [плагин для сервиса](#service-plugin) в качестве основного экспорта, и может опционально содержать [Generator](#generator) и [файл подсказок](#prompts-for-3rd-party-plugins).
+Чтобы плагин CLI мог использоваться в проекте Vue CLI, он должен соответствовать определённому соглашению по именованию `vue-cli-plugin-` или `@scope/vue-cli-plugin-`. Такой подход позволяет вашему плагину быть:
-Типичная структура каталогов плагина для CLI выглядит следующим образом:
+- Обнаруживаемым `@vue/cli-service`;
+- Обнаруживаемым другими разработчиками при поиске;
+- Устанавливаемым с помощью команд `vue add ` или `vue invoke `.
+:::warning Предупреждение
+Убедитесь в правильности указанного имени плагина, иначе его невозможно будет установить через команду `vue add` или найти с помощью поиска плагинов в Vue UI!
+:::
+
+Для лучшей обнаруживаемости при поиске плагина пользователем, укажите ключевые слова, описывающие плагин, в поле `description` в его файле `package.json`.
+
+Например:
+
+```json
+{
+ "name": "vue-cli-plugin-apollo",
+ "version": "0.7.7",
+ "description": "vue-cli plugin to add Apollo and GraphQL"
+}
```
-.
-├── README.md
-├── generator.js # генератор (опционально)
-├── prompts.js # файл подсказок (опционально)
-├── index.js # плагин для сервиса
-└── package.json
+
+Для отображения кнопки «More info» возле описания плагина нужно указать URL-адрес веб-сайта плагина или его репозитория в полях `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"
+}
```
-### Плагин для сервиса (Service Plugin)
+
-Сервисные плагины загружаются автоматически при создании экземпляра сервиса — т.е. каждый раз когда команда `vue-cli-service` вызывается внутри проекта.
+## Генератор
-Обратите внимание, что концепция «плагина для сервиса», которую мы обсуждаем здесь, несколько уже, чем концепция «плагина для CLI», который публикуется как npm-пакет. Первый относится только к модулю, который будет загружен `@vue/cli-service` когда он инициализирован, и обычно является частью последнего.
+Генератор — это часть плагина CLI, которая обычно используется если требуется расширить пакет новыми зависимостями, создать новые файлы в проекте или изменить существующие.
-Кроме того, [встроенные команды][commands] и [конфигурация модулей][config] `@vue/cli-service` также реализованы как плагины для сервиса.
+В структуре плагина CLI генератор должен располагаться в файле `generator.js` или `generator/index.js`. Он будет вызываться в двух случаях:
-Плагин для сервиса должен экспортировать функцию, которая принимает два аргумента:
+- При первоначальном создании проекта, если подключаемый плагин CLI необходим в рамках выбранного пресета настроек создания проекта.
-- Экземпляр [PluginAPI][plugin-api]
+- При установке плагина в созданном проекте командой `vue add` или `vue invoke`.
-- Объект, содержащий локальные настройки проекта, указанные в `vue.config.js`, или в поле `"vue"` в `package.json`.
+Генератор должен экспортировать функцию, которая принимает три аргумента:
-API позволяет плагинам для сервиса расширять / изменять внутреннюю конфигурацию webpack для разных окружений и внедрять дополнительные команды в `vue-cli-service`. Например:
+1. Экземпляр [GeneratorAPI](generator-api.md);
-``` js
-module.exports = (api, projectOptions) => {
- api.chainWebpack(webpackConfig => {
- // изменение конфигурации webpack с помощью webpack-chain
- })
+2. Настройки генератора для плагина. Эти настройки разрешаются с помощью [интерактивных подсказок](#интерактивные-подсказки) во время фазы создания проекта или загружаются из сохранённого пресета в `~/.vuerc`. Например, если сохранённый файл `~/.vuerc` выглядит так:
- api.configureWebpack(webpackConfig => {
- // изменение конфигурации webpack
- // или возвращение объекта, который будет объединён с помощью webpack-merge
- })
+ ```json
+ {
+ "presets" : {
+ "foo": {
+ "plugins": {
+ "@vue/cli-plugin-foo": { "option": "bar" }
+ }
+ }
+ }
+ }
+ ```
+
+ То когда пользователь создаёт проект, используя пресет `foo`, генератор `@vue/cli-plugin-foo` получит `{ option: 'bar' }` вторым аргументом.
+
+ Для сторонних плагинов настройки разрешаются из интерактивных подсказок или аргументов командной строки, когда пользователь вызывает `vue invoke` (см. [интерактивные подсказки](#интерактивные-подсказки)).
+
+3. Всё содержимое пресета (`presets.foo`) передаётся третьим аргументом.
+
+### Создание новых шаблонов
+
+Генератор при вызове команды `api.render('./template')` будет создавать файлы из шаблонов в каталоге `./template` (путь разрешается относительно файла генератора) с помощью [EJS](https://github.com/mde/ejs).
+
+Представим, что разрабатываем плагин [vue-cli-auto-routing](https://github.com/ktsn/vue-cli-plugin-auto-routing) и хотим внести следующие изменения в проект при вызове генератора:
+
+- создать каталог `layouts` с файлом шаблона страниц по умолчанию;
+- создать каталог `pages` со страницами `about` и `home`;
+- добавить файл `router.js` в каталоге `src`
+
+Для создания такой структуры нужно сначала повторить её внутри каталога `generator/template`:
+
+
+
+После создания необходимо добавить вызов `api.render` в файле `generator/index.js`:
+
+```js
+module.exports = api => {
+ api.render('./template')
+}
+```
+
+### Изменение существующих шаблонов
+
+Кроме того, можно унаследовать или заменить части существующего шаблона файла (даже из другого пакета) с помощью YAML front-matter:
+
+```ejs
+---
+extend: '@vue/cli-service/generator/template/src/App.vue'
+replace: !!js/regexp /
+```
+
+Также есть возможность заменять сразу несколько мест в файле одновременно, для этого потребуется обернуть заменяющие строки в блоки `<%# REPLACE %>` и `<%# END_REPLACE %>`:
+
+```ejs
+---
+extend: '@vue/cli-service/generator/template/src/App.vue'
+replace:
+ - !!js/regexp /Добро пожаловать в приложение Vue\.js/
+ - !!js/regexp /
+<%# END_REPLACE %>
+```
+
+### Ограничения по именованию файлов
+
+При необходимости создания шаблона файла, имя которого начинается с точки (например, `.env`), нужно следовать определённому соглашению об именовании, поскольку при публикации плагина в npm такие файлы игнорируются:
+
+```bash
+# Шаблон файла должен использовать символ подчёркивания вместо точки:
+
+/generator/template/_env
+
+# При вызове api.render('./template') в каталоге проекта он будет сгенерирован как:
- api.registerCommand('test', args => {
- // регистрация команды `vue-cli-service test`
+/generator/template/.env
+```
+
+Следовательно, также потребуется придерживаться определённого соглашения об именовании, если потребуется сгенерировать файл, имя которого начинается с подчёркивания:
+
+```bash
+# Шаблоны таких файлов должны использовать 2 символа подчёркивания вместо одного:
+
+/generator/template/__variables.scss
+
+# При вызове api.render('./template') в каталоге проекта он будет сгенерирован как:
+
+/generator/template/_variables.scss
+```
+
+
+### Расширение пакета
+
+Если нужно добавить новую зависимость в проект, создать npm-задачу или изменить `package.json` любым другим способом, можно использовать метод API `extendPackage`.
+
+```js
+// generator/index.js
+
+module.exports = api => {
+ api.extendPackage({
+ dependencies: {
+ 'vue-router-layout': '^0.1.2'
+ }
})
}
```
-#### Установка режимов для команд
+В примере выше добавляется одна зависимость: `vue-router-layout`. При вызове плагина этот npm-пакет будет установлен и зависимость добавлена в пользовательский файл `package.json`.
-> Примечание: установка режимов плагинами была изменена в beta.10.
+Этим же методом API можно добавлять npm-задачи в проект. Для этого нужно указать имя задачи и команду, которая будет выполняться, для добавления в секцию `scripts` файла `package.json`:
-Если зарегистрированная в плагине команда должна запускаться в определённом режиме по умолчанию,
-плагин должен предоставлять её через `module.exports.defaultModes` в формате `{ [commandName]: mode }`:
+```js
+// generator/index.js
-``` js
module.exports = api => {
- api.registerCommand('build', () => {
- // ...
+ api.extendPackage({
+ scripts: {
+ greet: 'vue-cli-service greet'
+ }
})
}
+```
-module.exports.defaultModes = {
- build: 'production'
+В примере выше добавляется новая задача `greet`, которая будет запускать специальную команду сервиса vue-cli, создание которой подробнее описано в разделе [плагина для сервиса](#добавnение-новой-команды-в-cli-service).
+
+### Изменение основного файла
+
+С помощью методов генератора можно вносить изменения и в файлы проекта. Наиболее распространённым случаем является изменение основного файла `main.js` или `main.ts`: добавление новых импортов, вызовы новых `Vue.use()` и т.д.
+
+Рассмотрим случай, когда файл `router.js` создан с помощью [генерации новых шаблонов](#создание-новых-шабnонов) и теперь требуется импортировать этот маршрутизатор в основной файл. Для этого используем два метода API генератора: `entryFile` вернёт основной файл проекта (`main.js` или `main.ts`), а `injectImports` предоставит возможность добавить новые импорты в этот файл:
+
+```js
+// generator/index.js
+
+api.injectImports(api.entryFile, `import router from './router'`)
+```
+
+Теперь, когда маршрутизатор импортирован, можно внедрить его в экземпляр Vue в основном файле. Используем для этого хук `afterInvoke`, который вызывается после записи файлов на диск.
+
+Сначала нужно прочитать содержимое основного файла с помощью модуля Node `fs` (который предоставляет API для взаимодействия с файловой системой) и разделить содержимое на строки:
+
+```js
+// generator/index.js
+
+module.exports.hooks = (api) => {
+ api.afterInvoke(() => {
+ const fs = require('fs')
+ const contentMain = fs.readFileSync(api.entryFile, { encoding: 'utf-8' })
+ const lines = contentMain.split(/\r?\n/g)
+ })
}
```
-Это связано с тем, что ожидаемый режим для команды должен быть известен до загрузки переменных окружения, что в свою очередь должно произойти до загрузки пользовательских настроек / применения плагинов.
+Затем находим строку, содержащую слово `render` (это обычно будет часть экземпляра Vue), и добавляем `router` в качестве следующей строки:
-#### Получение итоговой конфигурации Webpack в плагинах
+```js{9-10}
+// generator/index.js
-Плагин может получить итоговую конфигурацию webpack вызвав `api.resolveWebpackConfig()`. Каждый вызов генерирует новую конфигурацию webpack, которая может быть дополнительно изменена при необходимости:
+module.exports.hooks = (api) => {
+ api.afterInvoke(() => {
+ const fs = require('fs')
+ const contentMain = fs.readFileSync(api.entryFile, { encoding: 'utf-8' })
+ const lines = contentMain.split(/\r?\n/g)
-``` js
-module.exports = api => {
- api.registerCommand('my-build', args => {
- const configA = api.resolveWebpackConfig()
- const configB = api.resolveWebpackConfig()
+ const renderIndex = lines.findIndex(line => line.match(/render/))
+ lines[renderIndex] += `\n router,`
+ })
+}
+```
+
+Наконец, сохраняем содержимое обратно в основной файл:
+
+```js{12-13}
+// generator/index.js
+
+module.exports.hooks = (api) => {
+ api.afterInvoke(() => {
+ const { EOL } = require('os')
+ const fs = require('fs')
+ const contentMain = fs.readFileSync(api.entryFile, { encoding: 'utf-8' })
+ const lines = contentMain.split(/\r?\n/g)
- // изменение configA и configB для разных целей...
+ const renderIndex = lines.findIndex(line => line.match(/render/))
+ lines[renderIndex] += `${EOL} router,`
+
+ fs.writeFileSync(api.entryFile, lines.join(EOL), { encoding: 'utf-8' })
})
}
+```
-// не забудьте указать режим по умолчанию для правильных переменных окружения
-module.exports.defaultModes = {
- 'my-build': 'production'
+## Плагин для сервиса
+
+Плагин для сервиса позволяет вносить изменения в конфигурацию webpack, создавать новые команды vue-cli или изменять существующие (такие как `serve` и `build`).
+
+Плагин для сервиса автоматически загружается при создании экземпляра сервиса — т.е. при каждом вызове команды `vue-cli-service` внутри проекта. Он располагается в файле `index.js` в корневом каталоге плагина CLI.
+
+Плагин для сервиса должен экспортировать функцию, которая принимает два аргумента:
+
+- Экземпляр [PluginAPI](plugin-api.md)
+
+- Объект, содержащий локальные настройки проекта, указанные в файле `vue.config.js` или в поле `"vue"` файла `package.json`.
+
+Минимально необходимый код файла плагина для сервиса приведён ниже:
+
+```js
+module.exports = () => {}
+```
+
+### Изменение конфигурации webpack
+
+API позволяет плагину для сервиса расширять/изменять внутреннюю конфигурацию webpack для различных окружений. Например, модифицируем конфигурацию webpack с помощью webpack-chain для добавления плагина `vue-auto-routing` с заданными параметрами:
+
+```js
+const VueAutoRoutingPlugin = require('vue-auto-routing/lib/webpack-plugin')
+
+module.exports = (api, options) => {
+ api.chainWebpack(webpackConfig => {
+ webpackConfig
+ .plugin('vue-auto-routing')
+ .use(VueAutoRoutingPlugin, [
+ {
+ pages: 'src/pages',
+ nested: true
+ }
+ ])
+ })
}
```
-В качестве альтернативы, плагин также может получить новую [конфигурацию в формате chainable](https://github.com/mozilla-neutrino/webpack-chain) вызвав `api.resolveChainableWebpackConfig()`:
+Также можно использовать метод `configureWebpack` для изменении конфигурации webpack или возврата объекта, который будет объединяться с конфигурацией с помощью webpack-merge.
-``` js
-api.registerCommand('my-build', args => {
- const configA = api.resolveChainableWebpackConfig()
- const configB = api.resolveChainableWebpackConfig()
+### Добавление новой команды в cli-service
- // изменяем цепочки configA и configB для разных целей...
+С помощью плагина для сервиса можно зарегистрировать новую команду в cli-service в дополнение к стандартным (т.е. `serve` и `build`). Для этого можно использовать метод API `registerCommand`.
- const finalConfigA = configA.toConfig()
- const finalConfigB = configB.toConfig()
-})
+Пример создания простой новой команды, которая выводит приветствие в консоли разработчика:
+
+```js
+api.registerCommand(
+ 'greet',
+ {
+ description: 'Выводит приветствие в консоли',
+ usage: 'vue-cli-service greet'
+ },
+ () => {
+ console.log(`👋 Привет`)
+ }
+)
```
-#### Пользовательские настройки для сторонних плагинов
+В этом примере мы задаём имя команды (`'greet'`), объект настроек с опциями `description` и `usage`, а также функцию, которая выполняется при запуске команды `vue-cli-service greet`.
-Экспорт из `vue.config.js` [валидируется по схеме](https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/options.js#L3) чтобы избежать опечаток и неправильных значений конфигурации. Тем не менее, можно настраивать поведение сторонних плагинов через поле `pluginOptions`. Например, для следующего `vue.config.js`:
+:::tip Совет
+Можно также добавить новую команду в список npm-задач проекта в файле `package.json` [с помощью генератора](#расширение-пакета).
+:::
-``` js
-module.exports = {
- pluginOptions: {
- foo: { /* ... */ }
+При запуске новой команды в проекте с установленным плагином появится сообщение в консоли:
+
+```bash
+$ vue-cli-service greet
+👋 Привет!
+```
+
+Можно указать список доступных опций для новой команды. Добавим опцию `--name` и изменим функцию для вывода этого имени, если оно было указано.
+
+```js
+api.registerCommand(
+ 'greet',
+ {
+ description: 'Выводит приветствие в консоль',
+ usage: 'vue-cli-service greet [options]',
+ options: { '--name': 'определяет имя для приветствия' }
+ },
+ args => {
+ if (args.name) {
+ console.log(`👋 Привет, ${args.name}!`);
+ } else {
+ console.log(`👋 Привет!`);
+ }
}
+);
+```
+
+Теперь при запуске команды `greet` с указанной опцией `--name`, это имя будет выводиться вместе с сообщением в консоли:
+
+```bash
+$ vue-cli-service greet --name 'Джон'
+👋 Привет, Джон!
+```
+
+### Изменение существующей команды в cli-service
+
+Если необходимо изменить существующую команду cli-service, сначала нужно получить её через `api.service.commands` и затем внести некоторые изменения. К примеру, выведем сообщение в консоли с номером порта, на котором запущено приложение:
+
+```js
+const { serve } = api.service.commands
+
+const serveFn = serve.fn
+
+serve.fn = (...args) => {
+ return serveFn(...args).then(res => {
+ if (res && res.url) {
+ console.log(`Проект запущен по адресу ${res.url}`)
+ }
+ })
}
```
-Сторонний плагин может получить доступ к свойству `projectOptions.pluginOptions.foo` для определения собственной конфигурации.
+В примере выше сначала получаем команду `serve` из списка существующих команд; затем изменяем её `fn`-часть (`fn` — это третий параметр, передаваемый при создании новой команды; он определяет функцию, запускаемую при выполнении команды). После внесения модификаций сообщение в консоли будет выводиться после успешного выполнения команды `serve`.
+
+### Определение режима работы команды
+
+Если команда, зарегистрированная плагином, должна запускаться в определённом режиме, плагин должен определять его через `module.exports.defaultModes` в виде `{ [commandName]: mode }`:
+
+```js
+module.exports = api => {
+ api.registerCommand('build', () => {
+ // ...
+ })
+}
-### Генератор (Generator)
+module.exports.defaultModes = {
+ build: 'production'
+}
+```
-Плагин для CLI, опубликованный как пакет, может содержать файл `generator.js` или `generator/index.js`. Генератор внутри плагина вызывается в двух возможных сценариях:
+Это связано с тем, что ожидаемый режим для работы команды должен быть известен до загрузки переменных окружения, что произойдёт перед загрузкой пользовательских настроек / применением плагинов.
-- Во время первоначального создания проекта, если плагин для CLI установлен как часть пресета для создания проекта.
+## Интерактивные подсказки
-- Когда плагин устанавливается после создания проекта и вызывается через `vue invoke`.
+Интерактивные подсказки предназначены для обработки пользовательского выбора при создании нового проекта или добавлении нового плагина в существующий проект. Вся логика интерактивных подсказок расположена в файле `prompts.js`. Сами подсказки реализованы с помощью пакета [inquirer](https://github.com/SBoudrias/Inquirer.js) под капотом.
-[GeneratorAPI][generator-api] позволяет генератору внедрять дополнительные зависимости или поля в `package.json` и добавлять файлы в проект.
+При инициализации плагина пользователем командой `vue invoke`, если плагин содержит `prompts.js` в своем корневом каталоге, он будет использован во время вызова. Файл должен экспортировать массив [вопросов](https://github.com/SBoudrias/Inquirer.js#question), которые затем будут обработаны Inquirer.js.
-Генератор должен экспортировать функцию, которая принимает три аргумента:
+Необходимо экспортировать сам массив вопросов или функцию, которая возвращает его.
+
+Например, экспорт непосредственно массива вопросов:
+```js
+// prompts.js
-1. Экземпляр `GeneratorAPI`;
+module.exports = [
+ {
+ type: 'input',
+ name: 'locale',
+ message: 'Используемый язык для локализации проекта.',
+ validate: input => !!input,
+ default: 'en'
+ },
+ // ...
+]
+```
-2. Настройки генератора для этого плагина. Они будут получены во время интерактивного выбора пользователем на этапе создания проекта, или загружаются из сохранённого пресета в `~/.vuerc`. Например, если сохранённый файл `~/.vuerc` выглядит так:
+Или экспорт функции, которая возвращает массив вопросов:
+```js
+// prompts.js
- ``` json
+// в качестве аргумента функции передаётся `package.json` проекта
+module.exports = pkg => {
+ const prompts = [
{
- "presets" : {
- "foo": {
- "plugins": {
- "@vue/cli-plugin-foo": { "option": "bar" }
- }
- }
- }
+ type: 'input',
+ name: 'locale',
+ message: 'Используемый язык для локализации проекта.',
+ validate: input => !!input,
+ default: 'en'
}
- ```
+ ]
+
+ // динамическое добавление интерактивной подсказки
+ if ('@vue/cli-plugin-eslint' in (pkg.devDependencies || {})) {
+ prompts.push({
+ type: 'confirm',
+ name: 'useESLintPluginVueI18n',
+ message: 'Использовать ESLint-плагин для Vue I18n?'
+ })
+ }
- И если пользователь создаёт проект с использованием пресета `foo`, тогда генератор `@vue/cli-plugin-foo` получит `{ option: 'bar' }` в качестве второго аргумента.
+ return prompts
+}
+```
- Для стороннего плагина эти параметры будут получены из интерактивного выбора пользователем или аргументов командной строки, когда выполняется команда `vue invoke` (см. [Интерактивные подсказки для сторонних плагинов](#интерактивные-подсказки-дnя-сторонних-пnагинов)).
+Итоговый объект с ответами будет передаваться в генератор плагина в качестве настроек.
-3. Весь пресет (`presets.foo`) будет передан в качестве третьего аргумента.
+Кроме того, пользователь может пропустить этап в интерактивными подсказками и напрямую инициализировать плагин, передав опции через командную строку, например:
-**Например:**
+```bash
+vue invoke my-plugin --mode awesome
+```
-``` js
-module.exports = (api, options, rootOptions) => {
- // изменение полей package.json
- api.extendPackage({
- scripts: {
- test: 'vue-cli-service test'
- }
- })
+Интерактивные подсказки могут быть [различных типов](https://github.com/SBoudrias/Inquirer.js#prompt-types), но наиболее широко в CLI применяются `checkbox` и `confirm`. Добавим интерактивную подсказку `confirm` и используем её в генераторе плагина чтобы создавать по условию [новый файл из шаблона](#создание-новых-шабnонов).
- // копирование и рендеринг всех файлов в ./template с помощью ejs
- api.render('./template')
+```js
+// prompts.js
- if (options.foo) {
- // генерация файлов по условию
+module.exports = [
+ {
+ name: `addExampleRoutes`,
+ type: 'confirm',
+ message: 'Добавить примеры маршрутов?',
+ default: false
}
+]
+```
+
+При вызове плагина пользователю будет предложено ответить на вопрос о добавлении примеров маршрутов с ответом по умолчанию «Нет».
+
+
+
+Если необходимо использовать результат выбора пользователя в генераторе, ответ будет доступен по имени интерактивной подсказки. Теперь можно модифицировать `generator/index.js` так:
+
+```js
+if (options.addExampleRoutes) {
+ api.render('./template', {
+ ...options
+ })
}
```
-#### Шаблоны генератора
+Шаблон будет генерироваться только если пользователь согласился создать примеры маршрутов.
-Когда вы вызываете `api.render('./template')`, генератор будет рендерить файлы в `./template` (разрешённые относительно файла генератора) с помощью [EJS](https://github.com/mde/ejs).
+## Локальная установка плагина
-Кроме того, вы можете наследовать и заменять части существующего файла шаблона (даже из другого пакета) с помощью YAML front-matter:
+При разработке плагина может потребоваться протестировать его и проверить локально как он работает на проекте с помощью Vue CLI. Можно использовать существующий проект или создать новый в целях тестирования:
-``` ejs
----
-extend: '@vue/cli-service/generator/template/src/App.vue'
-replace: !!js/regexp /
```
-Также возможно выполнять несколько замен в файле, хотя вам потребуется обернуть строки для замены в блоки из `<%# REPLACE %>` и `<%# END_REPLACE %>`:
+### Отображение задачи в UI
-``` ejs
----
-extend: '@vue/cli-service/generator/template/src/App.vue'
-replace:
- - !!js/regexp /Welcome to Your Vue\.js App/
- - !!js/regexp /
-<%# END_REPLACE %>
```
-#### Ограничения имён файлов
+Теперь в обзоре проекта Vue UI можно увидеть, что задача появилась на странице `Tasks`. Можно увидеть её название, предоставленное описание, иконку ссылки, которая ведёт на указанный URL, а также экран для отображения результатов выполнения задачи:
+
+
+
+### Отображение экрана конфигурации
+
+Иногда в проекте могут быть пользовательские файлы конфигураций для различных функций или библиотек. С помощью плагина Vue CLI можно отображать конфигурацию в Vue UI, изменять её и сохранять (сохранение изменит соответствующий конфигурационный файл в проекте). По умолчанию в проекте Vue CLI имеется только главный экран конфигурации с настройками из `vue.config.js`. Если добавить ESLint в проект, то появится также экран конфигурации ESLint:
+
+
+
+Давайте создадим экран конфигурации для плагина. Прежде всего, после добавления плагина в существующий проект, должен быть файл с пользовательской конфигурацией. Это означает, что требуется добавить этот файл в каталог `template` для шага [создания новых шаблонов](#создание-новых-шабnонов).
+
+По умолчанию пользовательский интерфейс конфигурации может читать и записывать файлы следующих форматов: `json`, `yaml`, `js`, `package`. Назовём новый файл `myConfig.js` и поместим его в корне каталога `template`:
-Если вы хотите отрендерить файл шаблона, имя которого начинается с точки (т.е. `.env`) вам необходимо следовать определённому соглашению по именованию, поскольку файлы именуемые с точки (dotfiles) игнорируются при публикации вашего плагина в npm:
```
-# dotfile шаблоны должны использовать символ подчёркивания вместо точки:
+.
+└── generator
+ ├── index.js
+ └── template
+ ├── myConfig.js
+ └── src
+ ├── layouts
+ ├── pages
+ └── router.js
+```
-/generator/template/_env
+Теперь необходимо добавить в этот файл какую-то актуальную конфигурацию:
-# При вызове api.render('./template'), это будет отрендерено в каталоге проекта как:
+```js
+// myConfig.js
-.env
+module.exports = {
+ color: 'black'
+}
```
-Следовательно, это значит, что необходимо также следовать специальному соглашению по именованию если вы хотите отрендерить файл, чьё имя начинается с подчёркивания:
+
+После вызова плагина файл `myConfig.js` будет сгенерирован в корневом каталоге проекта. Теперь добавим новый экран конфигурации с помощью метода `api.describeConfig` в файле `ui.js`:
+
+Сначала нужно передать некоторую информацию:
+
+```js
+// ui.js
+
+api.describeConfig({
+ // Уникальный ID для конфигурации
+ id: 'org.ktsn.vue-auto-routing.config',
+ // Отображаемое имя
+ name: 'Настройка приветствия',
+ // Описание, отображаемое под именем
+ description: 'Можно настроить цвет текста приветствия',
+ // Ссылка «More info»
+ link: 'https://github.com/ktsn/vue-cli-plugin-auto-routing#readme'
+})
```
-# такие шаблоны должны иметь два символа подчёркивания вместо точки:
-/generator/template/__variables.scss
+:::danger Предупреждение
+Убедитесь в точности пространства имён для id, так как он должен быть уникальным для всех плагинов. Рекомендуем использовать [обратную нотацию записи доменного имени](https://en.wikipedia.org/wiki/Reverse_domain_name_notation)
+:::
+
+#### Логотип конфигурации
+
+Можно выбрать значок для конфигурации. Это может быть код [значка Material](https://material.io/tools/icons/?style=baseline) или пользовательское изображение (см. [публичные статические файлы](ui-api.md#пубnичные-статические-файnы)).
-# При вызове api.render('./template'), это будет отрендерено в каталоге проекта как:
+```js
+// ui.js
-_variables.scss
+api.describeConfig({
+ /* ... */
+ // Значок конфигурации
+ icon: 'color_lens'
+})
```
-### Интерактивные подсказки
+Если значок не указан, то будет использоваться логотип плагина, если таковой есть (см. [Логотип](#логотип)).
-#### Интерактивные подсказки для встроенных плагинов
+#### Файлы конфигурации
-Только встроенные плагины имеют возможность настраивать исходные подсказки при создании нового проекта, а модули подсказок расположены [внутри пакета `@vue/cli`][prompt-modules].
+Теперь нужно предоставить файл конфигурации для UI: таким образом можно будет читать его содержимое и сохранять изменения обратно. Для этого указываем имя конфигурационного файла, его формат и указываем путь к нему:
-Модуль подсказок должен экспортировать функцию, которая получает экземпляр [PromptModuleAPI][prompt-api]. Подсказки представлены с помощью [inquirer](https://github.com/SBoudrias/Inquirer.js) под капотом:
+```js
+api.describeConfig({
+ // другие свойства конфигурации
+ files: {
+ myConfig: {
+ js: ['myConfig.js']
+ }
+ }
+})
+```
-``` js
-module.exports = api => {
- // объект возможности должен быть корректным объектом выбора inquirer
- api.injectFeature({
- name: 'Какая-то суперская возможность',
- value: 'my-feature'
- })
+Можно указать больше одного файла. Например, если есть `myConfig.json`, можно определить его в свойстве `json: ['myConfig.json']`. Порядок здесь важен: первое имя файла в списке будет использоваться при создании файла конфигурации, если его не существует.
- // injectPrompt ожидает корректный объект подсказки inquirer
- api.injectPrompt({
- name: 'someFlag',
- // убедитесь, что подсказка отображается только если выбрана ваша функция
- when: answers => answers.features.include('my-feature'),
- message: 'Вы хотите включить флаг foo?',
- type: 'confirm'
- })
+#### Отображение интерактивных подсказок конфигурации
+
+Отобразим поле ввода для отображения свойства с цветом на экране конфигурации. Для этого используем хук `onRead`, который вернёт список интерактивных подсказок для отображения:
- // когда все подсказки завершены, внедряйте ваш плагин в настройки,
- // которые будут передаваться генераторам
- api.onPromptComplete((answers, options) => {
- if (answers.features.includes('my-feature')) {
- options.plugins['vue-cli-plugin-my-feature'] = {
- someFlag: answers.someFlag
+```js
+api.describeConfig({
+ // другие свойства конфигурации
+ onRead: ({ data }) => ({
+ prompts: [
+ {
+ name: `color`,
+ type: 'input',
+ message: 'Цвет сообщения с приветствием',
+ value: 'white'
}
- }
+ ]
})
-}
+})
```
-#### Интерактивные подсказки для сторонних плагинов
+Этот пример добавляет интерактивную подсказку в виде поля с указанным значением `white`. Вот как будет выглядеть экран конфигурации со всеми приведёнными выше настройками:
-Плагины сторонних разработчиков обычно устанавливаются вручную после того, как проект уже создан, и пользователь будет инициализировать плагин вызовом команды `vue invoke`. Если плагин содержит `prompts.js` в своём корневом каталоге, он будет использован во время вызова. Файл должен экспортировать массив [вопросов](https://github.com/SBoudrias/Inquirer.js#question), которые будут обрабатываться Inquirer.js. Объект с ответами будет передаваться генератору плагина в качестве настроек.
+
-В качестве альтернативы, пользователь может пропустить подсказки и напрямую инициализировать плагин, передав параметры через командную строку, например:
+Заменим теперь статическое значение `white` на свойство из конфигурационного файла. В хуке `onRead` объект `data` содержит JSON с результатом каждого файла конфигурации. В нашем случае содержание `myConfig.js` такое:
-``` bash
-vue invoke my-plugin --mode awesome
+```js
+// myConfig.js
+
+module.exports = {
+ color: 'black'
+}
```
-## Распространение плагина
+Поэтому объект `data` будет таким:
-Чтобы CLI-плагин мог использоваться другими разработчиками, он должен быть опубликован на npm придерживаясь соглашения по именованию `vue-cli-plugin-`. Следуя соглашению по именованию позволит вашему плагину быть:
+```js
+{
+ // Файл
+ myConfig: {
+ // Данные файла
+ color: 'black'
+ }
+}
+```
+
+Легко увидеть, что необходимое нам свойство `data.myConfig.color`. Обновим хук `onRead`:
-- Легко находимым с помощью `@vue/cli-service`;
-- Легко находимым другими разработчиками через поиск;
-- Устанавливаться через `vue add ` или `vue invoke `.
+```js
+// ui.js
-## Примечание о разработке Core-плагинов
+onRead: ({ data }) => ({
+ prompts: [
+ {
+ name: `color`,
+ type: 'input',
+ message: 'Цвет сообщения с приветствием',
+ value: data.myConfig && data.myConfig.color
+ }
+ ]
+}),
+```
-::: tip Примечание
-Этот раздел применим только в случае, если вы работаете над встроенным плагином непосредственно внутри `vuejs/vue-cli` репозитория.
+::: tip Совет
+Обратите внимание, что `myConfig` может быть неопределён, если конфигурационного файла не существует на момент загрузки экрана конфигурации.
:::
-Плагин с генератором, который внедряет дополнительные зависимости, отличные от пакетов в репозитории (например, `chai` внедряется `@vue/cli-plugin-unit-mocha/generator/index.js`) должен перечислять эти зависимости в собственном поле `devDependencies`. Это гарантирует:
+Как можно увидеть на экране конфигурации значение `white` заменится на `black`.
+
+Также можно предоставить значение по умолчанию, если конфигурационный файл отсутствует:
+
+```js
+// ui.js
+
+onRead: ({ data }) => ({
+ prompts: [
+ {
+ name: `color`,
+ type: 'input',
+ message: 'Цвет сообщения с приветствием',
+ value: data.myConfig && data.myConfig.color,
+ default: 'black',
+ }
+ ]
+}),
+```
+
+#### Сохранение конфигурации после изменений
+
+Пока мы лишь считали содержимое `myConfig.js` и использовали его на экране конфигурации. Теперь попробуем сохранить все изменения в файл. Это можно сделать с помощью хука `onWrite`:
+
+```js
+// ui.js
+
+api.describeConfig({
+ /* ... */
+ onWrite: ({ prompts, api }) => {
+ // ...
+ }
+})
+```
+
+Хук `onWrite` принимает множество [аргументов](ui-api.html#сохранение-изменений-конфигурации), но нам нужны только два из них: `prompts` и `api`. В первом текущие объекты интерактивных подсказок — получим id интерактивной подсказки и ответ для этого id. Для получения ответа воспользуемся методом `async getAnswer()` из `api`:
+
+```js
+// ui.js
+
+async onWrite({ api, prompts }) {
+ const result = {}
+ for (const prompt of prompts) {
+ result[`${prompt.id}`] = await api.getAnswer(prompt.id)
+ }
+ api.setData('myConfig', result)
+}
+```
+
+Теперь, если на экране конфигурации изменить значение цвета в поле ввода с `black` на `red` и нажать кнопку `Save the changes`, то содержимое файла `myConfig.js` также обновится:
+
+```js
+// myConfig.js
+
+module.exports = {
+ color: 'red'
+}
+```
+
+### Отображение интерактивных подсказок
+
+При желании также можно отображать [интерактивные подсказки](#интерактивные-подсказки) в Vue UI. При установке плагина через UI интерактивные подсказки будут отображаться на шаге вызова плагина.
+
+Объект подсказки можно расширять дополнительными свойствами. Они опциональны и используются только в UI:
+
+```js
+// prompts.js
+
+module.exports = [
+ {
+ // основные свойства интерактивных подсказок
+ name: `addExampleRoutes`,
+ type: 'confirm',
+ message: 'Добавить примеры маршрутов?',
+ default: false,
+ // свойства интерактивных подсказок для UI
+ group: 'Настоятельно рекомендуется',
+ description: 'Добавить примеры страниц, шаблонов и конфигурацию маршрутизатора',
+ link: 'https://github.com/ktsn/vue-cli-plugin-auto-routing/#vue-cli-plugin-auto-routing'
+ }
+]
+```
+
+В результате при вызове плагина появится такой экран:
+
+
+
+### Логотип
+
+Можно поместить файл `logo.png` в корне каталога, который будет публиковаться в npm. Тогда его можно будет увидеть в нескольких местах:
+ - При поиске плагина для установки
+ - В списке установленных плагинов
+ - В списке конфигураций (по умолчанию)
+ - В списке дополненных задач (по умолчанию)
-1. что пакет всегда существует в корневом `node_modules` репозитория, поэтому нам не нужно их переустанавливать при каждом тестировании.
+
-2. что `yarn.lock` остаётся постоянным, поэтому CI сможет лучше применять его кэширование.
+Логотип должен быть квадратным изображением без прозрачности (в идеале 84x84).
+
+## Публикация плагина в npm
+
+Для публикации плагина необходимо быть зарегистрированным на [npmjs.com](npmjs.com) и глобально установить `npm`. Если публикуете ваш первый npm-модуль, то сначала запустите команду:
+
+```bash
+npm login
+```
+
+Введите имя пользователя и пароль. Это позволит сохранить учётные данные, чтобы не приходилось вводить их при каждой публикации.
+
+:::tip Совет
+Перед публикацией плагина убедитесь, что выбрали правильное имя для него! Соглашение по именованию `vue-cli-plugin-`. Дополнительную информации см. в разделе [Именование и обнаруживаемость в поиске](#именование-и-обнаруживаемость-в-поиске).
+:::
+
+Для публикации плагина перейдите в корневой каталог и выполните команду в терминале:
+
+```bash
+npm publish
+```
-[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
+После успешной публикации можно будет добавить ваш плагин в проект, созданный с помощью Vue CLI командой `vue add `.
diff --git a/docs/ru/dev-guide/ui-api.md b/docs/ru/dev-guide/ui-api.md
index 91d657e756..bb6f6d289d 100644
--- a/docs/ru/dev-guide/ui-api.md
+++ b/docs/ru/dev-guide/ui-api.md
@@ -526,7 +526,7 @@ api.addTask({
}
```
-Поддерживаемые inquirer типы: `checkbox`, `confirm`, `input`, `password`, `list`, `rawlist`.
+Поддерживаемые inquirer-типы: `checkbox`, `confirm`, `input`, `password`, `list`, `rawlist`, `editor`.
В дополнение к ним пользовательский интерфейс поддерживает специальные типы, которые работают только с ним:
@@ -628,7 +628,7 @@ api.addTask({
### Создание клиентского дополнения
-Рекомендуемый способ создания клиентского дополнения — создать новый проект с помощью vue cli. Вы можете либо сделать это в подкаталоге вашего плагина, либо в другом npm пакете.
+Рекомендуемый способ создания клиентского дополнения — создать новый проект с помощью Vue CLI. Вы можете либо сделать это в подкаталоге вашего плагина, либо в другом npm пакете.
Установите `@vue/cli-ui` в качестве зависимости для разработки (dev dependency).
@@ -790,7 +790,7 @@ api.addView({
id: 'org.vue.webpack.views.test',
// Имя маршрута (из vue-router)
- // Использует то же имя, как и в методе 'ClientAddonApi.addRoutes' (см. выше в разлеле клиентское дополнение)
+ // Использует то же имя, как и в методе 'ClientAddonApi.addRoutes' (см. выше в разделе клиентское дополнение)
name: 'org.vue.webpack.routes.test',
// Иконка кнопки (material-icons)
@@ -1027,7 +1027,7 @@ ipc.send({ ... })
ipc.connect()
```
-Автоотключение при простое (спустя некоторое время без отправляемых сообщений):
+Авто-отключение при простое (спустя некоторое время без отправляемых сообщений):
```js
const ipc = new IpcMessenger({
diff --git a/docs/ru/dev-guide/ui-localization.md b/docs/ru/dev-guide/ui-localization.md
index bb5c9c1db8..aa56a65992 100644
--- a/docs/ru/dev-guide/ui-localization.md
+++ b/docs/ru/dev-guide/ui-localization.md
@@ -7,7 +7,7 @@
Для существующих переводов, вы можете [зарегистрироваться в качестве переводчика](https://www.transifex.com/vuejs/vue-cli/dashboard/).
Для новых переводов, вы можете [запросить добавление нового языка](https://www.transifex.com/vuejs/vue-cli/dashboard/) после регистрации.
-В любом случае вы можете переводить ключи по мере их добавления или изменения в исходной локализции.
+В любом случае вы можете переводить ключи по мере их добавления или изменения в исходной локализации.
## Локализация вашего плагина
diff --git a/docs/ru/guide/browser-compatibility.md b/docs/ru/guide/browser-compatibility.md
index 4427893b14..0a57cbb427 100644
--- a/docs/ru/guide/browser-compatibility.md
+++ b/docs/ru/guide/browser-compatibility.md
@@ -20,7 +20,7 @@
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
+ ```js
// babel.config.js
module.exports = {
presets: [
@@ -52,7 +52,7 @@
Vue CLI предоставляет «Современный режим», чтобы помочь в решении этой проблемы. При сборке для production с помощью следующей команды:
-``` bash
+```bash
vue-cli-service build --modern
```
@@ -89,6 +89,12 @@ Vue CLI использует две переменных окружения дл
**Важно:** Переменные доступны только при вызове/после вызова функций `chainWebpack()` и `configureWebpack()`, (т.е. не напрямую в области видимости модуля `vue.config.js`). Это также означает, что они доступны в файле конфигурации postcss.
:::
+::: warning Предостережение: Настройка плагинов webpack
+Некоторые плагины, такие как `html-webpack-plugin`, `preload-plugin` и т.п., добавляются только в конфигурации для современного режима. Попытка использовать их опции в конфигурации для старых браузеров может привести к ошибке, так как этих плагинов не будет существовать.
+
+Используйте совет выше об *Определении текущего режима в конфигурации* для управления плагинами только в соответствующем режиме, и/или проверяйте наличие плагина в конфигурации текущего режима, прежде чем использовать их опции.
+:::
+
[autoprefixer]: https://github.com/postcss/autoprefixer
[babel-preset-env]: https://new.babeljs.io/docs/en/next/babel-preset-env.html
[babel-preset-app]: https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/babel-preset-app
diff --git a/docs/ru/guide/build-targets.md b/docs/ru/guide/build-targets.md
index f1918710f3..c279d4f41b 100644
--- a/docs/ru/guide/build-targets.md
+++ b/docs/ru/guide/build-targets.md
@@ -13,10 +13,6 @@
## Библиотека (Library)
-::: tip Примечание о совместимости с IE
-В режиме библиотеки публичный путь [определяется динамически](https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/commands/build/setPublicPath.js) по URL-адресу, по которому загружается основной js-файл (для включения динамической загрузки ресурсов). Но эта функциональность использует `document.currentScript`, который отсутствует в IE. Поэтому рекомендуем добавлять [current-script-polyfill](https://www.npmjs.com/package/current-script-polyfill) в финальную веб-страницу перед импортом библиотеки, если требуется поддержка IE.
-:::
-
::: tip Примечание о зависимости Vue
В режиме библиотеки Vue *экстернализируется*. Это означает, что сборка не будет содержать Vue, даже если ваш код его импортирует. Если библиотека используется через сборщик, он должен попытаться загрузить Vue в качестве зависимости через сборщик; в противном случае, он должен вернуться к глобальной переменной `Vue`.
@@ -54,13 +50,17 @@ dist/myLib.css 0.33 kb 0.23 kb
- `dist/myLib.css`: извлечённый CSS-файл (можно принудительно вставлять стили инлайн, установив `css: { extract: false }` в `vue.config.js`)
+::: warning ВНИМАНИЕ
+При разработке библиотеки или использования монорепозитория, имейте ввиду, что CSS-импорты **являются побочными эффектами (side effects)**. Убедитесь, что **удалили** опцию `"sideEffects": false` из файла `package.json`, в противном случае webpack будет удалять CSS-фрагменты при сборке для production.
+:::
+
### Vue vs. JS / TS файлы точек входа
При использовании `.vue` файла в качестве точки входа, библиотека будет экспортировать сам компонент Vue, потому что компонент всегда имеет экспорт по умолчанию (export default).
Однако, когда используется `.js` или `.ts` файл в качестве точки входа, он может содержать именованные экспорты, поэтому библиотека будет использоваться как модуль. Это означает, что экспорт библиотеки по умолчанию должен быть доступен как `window.yourLib.default` в UMD сборках, или как `const myLib = require('mylib').default` в CommonJS сборках. Если у вас нет именованных экспортов и вы хотите использовать экспорт по умолчанию (default export), вы можете использовать следующую конфигурацию webpack в `vue.config.js`:
-``` js
+```js
module.exports = {
configureWebpack: {
output: {
@@ -100,7 +100,7 @@ vue-cli-service build --target wc --name my-element [entry]
Этот режим позволяет использовать компонент Vue как обычный элемент DOM:
-``` html
+```html
@@ -139,10 +139,28 @@ dist/foo.1.js 5.24 kb 1.64 kb
Теперь на странице пользователю необходимо только подключить Vue и файл точки входа:
-``` html
+```html
```
+
+## Использование vuex в сборках
+
+При создании [Веб-компонента](#веб-компонент-web-component) или [Библиотеки](#бибnиотека-library), точкой входа будет не `main.js`, а файл `entry-wc.js`, генерируемый здесь: [https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/commands/build/resolveWcEntry.js](https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-service/lib/commands/build/resolveWcEntry.js)
+
+Поэтому для использования vuex при сборке веб-компонента необходимо инициализировать хранилище в `App.vue`:
+
+```js
+import store from './store'
+
+// ...
+
+export default {
+ store,
+ name: 'App',
+ // ...
+}
+```
diff --git a/docs/ru/guide/cli-service.md b/docs/ru/guide/cli-service.md
index c054b09e8f..20ffeec0ca 100644
--- a/docs/ru/guide/cli-service.md
+++ b/docs/ru/guide/cli-service.md
@@ -6,7 +6,7 @@
Это то, что вы увидите в `package.json` проекта с пресетом настроек по умолчанию:
-``` json
+```json
{
"scripts": {
"serve": "vue-cli-service serve",
@@ -17,7 +17,7 @@
Вы можете вызвать эти команды с помощью npm или Yarn:
-``` bash
+```bash
npm run serve
# ИЛИ
yarn serve
@@ -25,7 +25,7 @@ yarn serve
Если у вас установлен [npx](https://github.com/npm/npx) (должен поставляться в комплекте с последней версией npm), то вы также можете запустить бинарник напрямую:
-``` bash
+```bash
npx vue-cli-service serve
```
@@ -44,18 +44,26 @@ npx vue-cli-service serve
Опции:
- --open открыть браузер при запуске сервера
- --copy скопировать url в буфер обмена при запуске сервера
- --mode определить режим сборки (по умолчанию: development)
- --host определить хост (по умолчанию: 0.0.0.0)
- --port определить порт (по умолчанию: 8080)
- --https использовать https (по умолчанию: false)
+ --open открыть браузер при запуске сервера
+ --copy скопировать url в буфер обмена при запуске сервера
+ --mode определить режим сборки (по умолчанию: development)
+ --host определить хост (по умолчанию: 0.0.0.0)
+ --port определить порт (по умолчанию: 8080)
+ --https использовать https (по умолчанию: false)
+ --public указать URL-адрес публичной сети для клиента HMR
+ --skip-plugins имёна плагинов через запятую, которые следует пропустить при запуске
```
+::: tip --copy
+Копирование в буфер обмена может не работать на некоторых платформах. Если копирование выполнилось успешно, то рядом с URL-адресом локального сервера разработки будет отображено `(copied to clipboard)`.
+:::
+
Команда `vue-cli-service serve` запускает сервер для разработки (основанный на [webpack-dev-server](https://github.com/webpack/webpack-dev-server)), предоставляющий из коробки функцию горячей замены модулей.
Кроме флагов командной строки, также можно настраивать сервер для разработки с помощью поля [devServer](../config/#devserver) в файле `vue.config.js`.
+В команде CLI `[entry]` означает *входной файл*, а не *дополнительный входной файл*. Если вы перезапишете запись в CLI, тогда записи из `config.pages` больше не будут учитываться, что может привести к ошибке. По умолчанию [entryFile](../dev-guide/generator-api.html#entryfile).
+
## vue-cli-service build
```
@@ -63,16 +71,20 @@ npx vue-cli-service serve
Опции:
- --mode определить режим сборки (по умолчанию: production)
- --dest определить каталог сборки (по умолчанию: dist)
- --modern собирать приложение для современных браузеров с авто-фоллбэком для старых
- --target app | lib | wc | wc-async (по умолчанию: app)
- --inline-vue включить Vue в содержимое сборки библиотеки или веб-компонента
- --name имя библиотеки или режим веб-компонента (по умолчанию: "name" в package.json или имя файла точки входа)
- --no-clean не удалять каталог dist перед сборкой проекта
- --report сгенерировать report.html для анализа содержимого сборки
- --report-json сгенерировать report.json для анализа содержимого сборки
- --watch отслеживать изменения
+ --mode определить режим сборки (по умолчанию: production)
+ --dest определить каталог сборки (по умолчанию: dist)
+ --modern собирать приложение для современных браузеров с авто-фоллбэком для старых
+ --no-unsafe-inline собирать приложение без внедрения инлайн-скриптов
+ --target app | lib | wc | wc-async (по умолчанию: app)
+ --formats список выходных форматов для сборок библиотек (по умолчанию: commonjs,umd,umd-min)
+ --inline-vue включить Vue в содержимое сборки библиотеки или веб-компонента
+ --name имя библиотеки или режим веб-компонента (по умолчанию: "name" в package.json или имя файла точки входа)
+ --filename имя выходного файла, только для 'lib' (по умолчанию: значение --name)
+ --no-clean не удалять каталог dist перед сборкой проекта
+ --report сгенерировать report.html для анализа содержимого сборки
+ --report-json сгенерировать report.json для анализа содержимого сборки
+ --skip-plugins имёна плагинов через запятую, которые следует пропустить при запуске
+ --watch отслеживать изменения
```
Команда `vue-cli-service build` создаёт готовую для production-сборку в каталоге `dist/` с минификацией для JS / CSS / HTML и автоматическим разделением вендорного кода в отдельный фрагмент для лучшего кэширования. Манифест фрагмента вставляется инлайн в HTML.
@@ -101,16 +113,43 @@ npx vue-cli-service serve
Некоторые плагины CLI добавляют собственные команды в `vue-cli-service`. Например, `@vue/cli-plugin-eslint` внедряет команду `vue-cli-service lint`. Вы можете посмотреть весь список команд запустив:
-``` bash
+```bash
npx vue-cli-service help
```
Вы также можете узнать о доступных параметрах каждой команды с помощью:
-``` bash
+```bash
npx vue-cli-service help [command]
```
+## Пропуск плагинов
+
+Иногда при выполнении команды может понадобиться не использовать определённый плагин CLI. К примеру, для создания сборки приложения без плагина PWA. Такого можно добиться передав имя плагина в опцию `--skip-plugins`.
+
+```bash
+npx vue-cli-service build --skip-plugins pwa
+```
+
+::: tip СОВЕТ
+Опция доступна для _любых_ команд `vue-cli-service`, включая пользовательские команды, добавленные другими плагинами.
+:::
+
+Можно пропустить несколько подключаемых плагинов, передав их имена через запятую:
+
+```bash
+npx vue-cli-service build --skip-plugins pwa,apollo
+```
+
+Имена плагинов разрешаются также, как и при установке, что подробнее описано [здесь](./plugins-and-presets.md#установка-пnагинов-в-существующий-проект)
+
+```bash
+# все вызовы равнозначны
+npx vue-cli-service build --skip-plugins pwa
+npx vue-cli-service build --skip-plugins @vue/pwa
+npx vue-cli-service build --skip-plugins @vue/cli-plugin-pwa
+```
+
## Кэширование и параллелизация
- `cache-loader` используется для компиляции Vue / Babel / TypeScript по умолчанию. Файлы кэшируются внутри `node_modules/.cache` — если при запуске будут возникать проблемы с компиляцией, сначала попробуйте удалить каталог кэша.
@@ -121,10 +160,16 @@ npx vue-cli-service help [command]
После установки `@vue/cli-service` также добавляется [yorkie](https://github.com/yyx990803/yorkie), который позволяет легко указывать Git хуки, используя поле `gitHooks` в файле `package.json`:
-``` json
+```json
{
"gitHooks": {
"pre-commit": "lint-staged"
+ },
+ "lint-staged": {
+ "*.{js,vue}": [
+ "vue-cli-service lint",
+ "git add"
+ ]
}
}
```
diff --git a/docs/ru/guide/creating-a-project.md b/docs/ru/guide/creating-a-project.md
index fbfebcfef6..dd5123a653 100644
--- a/docs/ru/guide/creating-a-project.md
+++ b/docs/ru/guide/creating-a-project.md
@@ -4,7 +4,7 @@
Для создания нового проекта запустите команду:
-``` bash
+```bash
vue create hello-world
```
@@ -33,7 +33,7 @@ vue create hello-world
Команда `vue create` предоставляет множество опций — вы можете изучить их все выполнив:
-``` bash
+```bash
vue create --help
```
@@ -63,7 +63,7 @@ vue create --help
Вы можете создавать и управлять проектами через графический интерфейс командой `vue ui`:
-``` bash
+```bash
vue ui
```
@@ -75,7 +75,7 @@ vue ui
Vue CLI >= 3 использует команду `vue`, поэтому он перезаписывает Vue CLI 2 (`vue-cli`). Если вам по-прежнему необходимо старое поведение и функциональность команды `vue init`, нужно лишь установить глобально дополнительный плагин `@vue/cli-init`:
-``` bash
+```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
index 92d3a06a14..1e667dda2b 100644
--- a/docs/ru/guide/css.md
+++ b/docs/ru/guide/css.md
@@ -10,9 +10,9 @@
Вы можете выбрать пре-процессоры (Sass/Less/Stylus) при создании проекта. Если вы этого не сделали, то внутренняя конфигурация webpack всё равно настроена для их использования. Вам лишь требуется вручную доустановить соответствующие загрузчики для webpack:
-``` bash
+```bash
# Sass
-npm install -D sass-loader node-sass
+npm install -D sass-loader sass
# Less
npm install -D less-loader less
@@ -23,12 +23,22 @@ npm install -D stylus-loader stylus
Теперь вы можете импортировать соответствующие типы файлов, или использовать их синтаксис внутри файлов `*.vue` с помощью:
-``` vue
+```vue
```
+::: tip Совет по производительности Sass
+Обратите внимание, при использовании Dart Sass **синхронная компиляция вдвое быстрее асинхронной** по умолчанию, из-за накладных расходов на асинхронные коллбэки. Чтобы избежать их можно воспользоваться пакетом [fibers](https://www.npmjs.com/package/fibers) для вызова асинхронных импортёров по пути синхронного кода. Для этого просто установите `fibers` в качестве зависимости проекта:
+
+```
+npm install -D fibers
+```
+
+Также имейте в виду, поскольку это нативный модуль, то могут возникнуть различные проблемы совместимости, в зависимости от ОС и окружения сборки. В таких случаях выполните `npm uninstall -D fibers` для устранения проблемы.
+:::
+
### Автоматические импорты
Если вы хотите автоматически импортировать файлы (для цветов, переменных, примесей...), можно использовать [style-resources-loader](https://github.com/yenshih/style-resources-loader). Вот пример для stylus, который импортирует `./src/styles/imports.styl` в каждый однофайловый компонент и в каждый файл stylus:
@@ -75,33 +85,38 @@ Vue CLI использует PostCSS внутри себя.
Для импорта CSS или других файлов пре-процессоров в качестве CSS-модулей в JavaScript, необходимо чтобы имя файла заканчивалось на `.module.(css|less|sass|scss|styl)`:
-``` js
+```js
import styles from './foo.module.css'
// работает для всех поддерживаемых пре-процессоров
import sassStyles from './foo.module.scss'
```
-Если вы не хотите указывать `.module` в именах файлов, установите `css.modules` в `true` внутри файла `vue.config.js`:
+Если вы не хотите указывать `.module` в именах файлов, установите `css.requireModuleExtension` в `false` внутри файла `vue.config.js`:
-``` js
+```js
// vue.config.js
module.exports = {
css: {
- modules: true
+ requireModuleExtension: false
}
}
```
Если вы хотите настроить генерируемые имена классов для CSS-модулей, вы можете сделать это с помощью опции `css.loaderOptions.css` в `vue.config.js`. Все настройки `css-loader` поддерживаются, например `localIdentName` и `camelCase`:
-``` js
+```js
// vue.config.js
module.exports = {
css: {
loaderOptions: {
css: {
- localIdentName: '[name]-[hash]',
- camelCase: 'only'
+ // Примечание: формат конфигурации отличается между Vue CLI v4 и v3
+ // Для пользователей Vue CLI v3, обратитесь к документации css-loader v1
+ // https://github.com/webpack-contrib/css-loader/tree/v1.0.1
+ modules: {
+ localIdentName: '[name]-[hash]'
+ },
+ localsConvention: 'camelCaseOnly'
}
}
}
@@ -112,16 +127,25 @@ module.exports = {
Иногда может возникнуть необходимость передать настройки в загрузчик пре-процессора для webpack. Вы можете сделать это с помощью опции `css.loaderOptions` в `vue.config.js`. Например, для передачи глобальных переменных во все стили Sass/Less:
-``` js
+```js
// vue.config.js
module.exports = {
css: {
loaderOptions: {
// передача настроек в sass-loader
+ // @/ это псевдоним к каталогу src/ поэтому предполагается,
+ // что у вас в проекте есть файл `src/variables.scss`
+ // Примечание: эта опция называется "data" в sass-loader v7
sass: {
- // @/ это псевдоним к каталогу src/ поэтому предполагается,
- // что у вас в проекте есть файл `src/variables.scss`
- data: `@import "~@/variables.scss";`
+ prependData: `@import "~@/variables.sass"`
+ },
+ // по умолчанию опция `sass` будет применяться к обоим синтаксисам
+ // потому что синтаксис `scss` по сути также обрабатывается sass-loader
+ // но при настройке опции `data` синтаксис `scss` требует точку с запятой
+ // в конце оператора, в то время как для `sass` точки с запятой не требуется
+ // в этом случае синтаксис `scss` можно настроить отдельно с помощью опции `scss`
+ scss: {
+ prependData: `@import "~@/variables.scss";`
},
// передача настроек Less.js в less-loader
less:{
diff --git a/docs/ru/guide/deployment.md b/docs/ru/guide/deployment.md
index 8d9bb722f2..177a9a8f26 100644
--- a/docs/ru/guide/deployment.md
+++ b/docs/ru/guide/deployment.md
@@ -10,7 +10,7 @@
Каталог `dist` предназначен для обслуживания HTTP-сервером (если не задали `publicPath` относительным значением), поэтому не сработает если напрямую открыть `dist/index.html` через `file://` протокол. Самый простой способ предпросмотра вашей сборки для production локально — использовать статический файловый сервер Node.js, например [serve](https://github.com/zeit/serve):
-``` bash
+```bash
npm install -g serve
# флаг -s означает запуск serve в режиме одностраничного приложения (SPA)
# который решает проблему маршрутизации, описанную ниже
@@ -35,13 +35,15 @@ serve -s dist
### GitHub Pages
+#### Публикация обновлений вручную
+
1. Установите корректное значение `publicPath` в `vue.config.js`.
Если вы публикуете по адресу `https://.github.io/`, вы можете опустить `publicPath`, так как оно по умолчанию `"/"`.
Если вы публикуете по адресу `https://.github.io//`, (т.е. ваш репозиторий находится по адресу `https://github.com//`), установите `publicPath` в значение `"//"`. Например, если ваш репозиторий называется "my-project", то ваш `vue.config.js` будет выглядеть примерно так:
- ``` js
+ ```js
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/my-project/'
@@ -51,7 +53,7 @@ serve -s dist
2. Внутри вашего проекта создайте `deploy.sh` со следующим содержимым (при необходимости раскомментировав подсвеченные строки) и запустите его для публикации:
- ``` bash{13,20,23}
+ ```bash{13,20,23}
#!/usr/bin/env sh
# остановить публикацию при ошибках
@@ -79,9 +81,34 @@ serve -s dist
cd -
```
- ::: tip Совет
- Вы также можете запустить скрипт выше в вашей конфигурации CI чтобы включить автоматическую публикацию на каждый push в репозиторий.
- :::
+#### Использование Travis CI для автоматических обновлений
+
+1. Установите правильный `publicPath` в `vue.config.js`, как описано выше.
+
+2. Установите клиент Travis CLI: `gem install travis && travis --login`
+
+3. Сгенерируйте [токен доступа](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line) на GitHub с правами доступа к репозиторию.
+
+4. Разрешите доступ Travis к репозиторию: `travis set GITHUB_TOKEN=xxx` (`xxx` — это персональный токен доступа из шага 3.)
+
+5. Создайте файл `.travis.yml` в корневом каталоге проекта.
+
+ ```yaml
+ language: node_js
+ node_js:
+ - "node"
+ cache: npm
+ script: npm run build
+ deploy:
+ provider: pages
+ skip_cleanup: true
+ github_token: $GITHUB_TOKEN
+ local_dir: dist
+ on:
+ branch: master
+ ```
+
+6. Добавьте файл `.travis.yml` в репозиторий, чтобы запустить первую сборку.
### GitLab Pages
@@ -98,6 +125,8 @@ pages: # задание должно быть именованными стра
- npm run build
- mv public public-vue # GitLab Pages хук для каталога public
- mv dist public # переименование каталога dist (результат команды npm run build)
+ # опционально, можно активировать поддержку gzip с помощью следующей строки:
+ - find public -type f -regex '.*\.\(htm\|html\|txt\|text\|js\|css\)$' -exec gzip -f -k {} \;
artifacts:
paths:
- public # путь к артефакту должен быть /public для GitLab Pages
@@ -105,15 +134,14 @@ pages: # задание должно быть именованными стра
- master
```
-Как правило, по адресу `https://yourUserName.gitlab.io/yourProjectName` будет располагаться статический веб-сайт, поэтому вы также захотите создать файл `vue.config.js` для указания [значения `BASE_URL`](../config/#publicpath), соответствующего ему:
+Как правило, по адресу `https://yourUserName.gitlab.io/yourProjectName` будет располагаться статический веб-сайт, поэтому потребуется создать файл `vue.config.js` для указания [значения `BASE_URL`](../config/#publicpath), соответствующего имени проекта ([переменная окружения `CI_PROJECT_NAME`](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) содержит его):
```javascript
// файл vue.config.js расположен в корне вашего репозитория
-// убедитесь, что обновили `yourProjectName` на имя вашего проекта GitLab
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
- ? '/yourProjectName/'
+ ? '/' + process.env.CI_PROJECT_NAME + '/'
: '/'
}
```
@@ -126,14 +154,14 @@ module.exports = {
1. На сайте Netlify добавьте новый проект из GitHub со следующими настройками:
- - **Build Command:** `npm run build` или `yarn build`
- - **Publish directory:** `dist`
+ - **Build Command:** `npm run build` или `yarn build`
+ - **Publish directory:** `dist`
2. Нажмите кнопку публикации!
Также посмотрите [vue-cli-plugin-netlify-lambda](https://github.com/netlify/vue-cli-plugin-netlify-lambda).
-Для получения прямых хитов при использовании `режима history` во Vue Router, необходимо создавть файл `_redirects` в каталоге `/public` со следующим содержимым:
+Для получения прямых хитов при использовании `режима history` во Vue Router, необходимо создавать файл `_redirects` в каталоге `/public` со следующим содержимым:
```
# Настройки Netlify для одностраничных приложений (SPA)
@@ -142,6 +170,28 @@ module.exports = {
Подробнее можно изучить в [документации Netlify по перенаправлениям](https://www.netlify.com/docs/redirects/#history-pushstate-and-single-page-apps).
+### Render
+
+[Render](https://render.com) предлагает [бесплатный хостинг статических сайтов](https://render.com/docs/static-sites) с полностью управляемым SSL, глобальным CDN и непрерывным автоматическим развёртыванием из GitHub.
+
+1. Создайте новый Web Service в Render, и предоставьте доступ для GitHub-приложения Render в репозиторий.
+
+2. При создании используйте следующие значения:
+
+ - **Окружение:** `Static Site`
+ - **Команда сборки:** `npm run build` или `yarn build`
+ - **Каталог публикации:** `dist`
+
+Всё! Приложение будет доступно по URL-адресу Render сразу, как только завершится сборка.
+
+Для того, чтобы получать прямые хиты при использовании режима history во Vue Router, необходимо добавить следующее правило на вкладке `Redirects/Rewrites` вашего сайта.
+
+ - **Источник:** `/*`
+ - **Назначение:** `/index.html`
+ - **Статус** `Rewrite`
+
+Узнайте больше о настройке [перенаправлений, перезаписей](https://render.com/docs/redirects-rewrites) и [пользовательских доменах](https://render.com/docs/custom-domains) на Render.
+
### Amazon S3
Плагин [vue-cli-plugin-s3-deploy](https://github.com/multiplegeorges/vue-cli-plugin-s3-deploy).
@@ -211,10 +261,15 @@ firebase deploy --only hosting
### Now
-1. Установите глобально Now CLI:
+В данном примере используется последняя версия платформы Now версии 2.
+
+1. Установите Now CLI:
```bash
npm install -g now
+
+# Или если предпочитаете локальную установку
+npm install now
```
2. Добавьте файл `now.json` в корневой каталог проекта:
@@ -222,38 +277,61 @@ npm install -g now
```json
{
"name": "my-example-app",
- "type": "static",
- "static": {
- "public": "dist",
- "rewrites": [
- {
- "source": "**",
- "destination": "/index.html"
- }
- ]
- },
- "alias": "vue-example",
- "files": [
- "dist"
- ]
+ "version": 2,
+ "builds": [
+ {
+ "src": "package.json",
+ "use": "@now/static-build"
+ }
+ ],
+ "routes": [
+ {
+ "src": "/(js|css|img)/.*",
+ "headers": { "cache-control": "max-age=31536000, immutable" }
+ },
+ { "handle": "filesystem" },
+ { "src": ".*", "dest": "/" }
+ ],
+ "alias": "example.com"
}
```
- Можно детальнее настроить статическую публикацию, обратившись к [документации Now](https://zeit.co/docs/deployment-types/static).
-
-3. Добавьте скрипт для публикации в `package.json`:
+ Если у вас есть другие/дополнительные каталоги, измените маршрут соответствующим образом:
+
+ ```diff
+ - {
+ - "src": "/(js|css|img)/.*",
+ - "headers": { "cache-control": "max-age=31536000, immutable" }
+ - }
+ + {
+ + "src": "/(js|css|img|fonts|media)/.*",
+ + "headers": { "cache-control": "max-age=31536000, immutable" }
+ + }
+ ```
- ```json
- "deploy": "npm run build && now && now alias"
+ Когда значение `outputDir` вместо стандартного `dist` указано `build`:
+
+ ```diff
+ - {
+ - "src": "package.json",
+ - "use": "@now/static-build"
+ - }
+ + {
+ + "src": "package.json",
+ + "use": "@now/static-build",
+ + "config": { "distDir": "build" }
+ + }
```
- Если вы хотите по умолчанию публиковать публично, то измените команду на следующую:
+3. Добавьте `now-build` скрипт для публикации в `package.json`:
```json
- "deploy": "npm run build && now --public && now alias"
+ "now-build": "npm run build"
```
- Это автоматически установит псевдоним сайта на последнюю публикацию. Теперь просто запустите команду `npm run deploy` для публикации приложения.
+ Для публикации запустите `now`.
+
+ Если необходим псевдоним публикации, запустите `now --target production`.
### Stdlib
@@ -261,7 +339,38 @@ npm install -g now
### Heroku
-> TODO | Присылайте пулл-реквесты.
+1. [Установите Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)
+
+2. Создайте файл `static.json`:
+
+ ```json
+ {
+ "root": "dist",
+ "clean_urls": true,
+ "routes": {
+ "/**": "index.html"
+ }
+ }
+ ```
+
+3. Добавьте файл `static.json` в git
+
+ ```bash
+ git add static.json
+ git commit -m "add static configuration"
+ ```
+
+4. Запустите публикацию на Heroku
+
+ ```bash
+ heroku login
+ heroku create
+ heroku buildpacks:add heroku/nodejs
+ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-static
+ git push heroku master
+ ```
+
+Подробная информация: [https://gist.github.com/hone/24b06869b4c1eca701f9](https://gist.github.com/hone/24b06869b4c1eca701f9)
### Surge
@@ -299,7 +408,7 @@ npm install --global surge
3. В проекте создайте `deploy.sh` с указанным содержимым и запустите его для публикации:
- ``` bash{13,20,23}
+ ```bash{13,20,23}
#!/usr/bin/env sh
# остановиться при ошибках
@@ -319,3 +428,93 @@ npm install --global surge
cd -
```
+
+### Docker (Nginx)
+
+Deploy your application using nginx inside of a docker container.
+
+1. Установите [docker](https://www.docker.com/get-started)
+
+2. Создайте файл `Dockerfile` в корневом каталоге проекта
+
+ ```docker
+ FROM node:latest as build-stage
+ WORKDIR /app
+ COPY package*.json ./
+ RUN npm install
+ COPY ./ .
+ RUN npm run build
+
+ FROM nginx as production-stage
+ RUN mkdir /app
+ COPY --from=build-stage /app/dist /app
+ COPY nginx.conf /etc/nginx/nginx.conf
+ ```
+
+3. Создайте файл `.dockerignore` в корневом каталоге проекта
+
+ Настройка файла `.dockerignore` предотвращает копирование `node_modules` и любых промежуточных артефактов сборки в образ, что может вызывать проблемы при сборке.
+
+ ```
+ **/node_modules
+ **/dist
+ ```
+
+4. Создайте файл `nginx.conf` в корневом каталоге проекта
+
+ `Nginx` — это HTTP(s)-сервер, который будет работать в вашем контейнере docker. Он использует конфигурационный файл для определения того как предоставлять содержимое / какие порты прослушивать / и так далее. См. [документацию по конфигурации nginx](https://www.nginx.com/resources/wiki/start/topics/examples/full/) для ознакомления со всеми возможными примерами конфигураций.
+
+ Ниже приведена простая конфигурация `nginx`, которая обслуживает ваш vue-проект на порту `80`. Корневой `index.html` служит для `page not found` / `404` ошибок, что позволяет использовать маршрутизации, основанной на `pushState()`.
+
+ ```nginx
+ user nginx;
+ worker_processes 1;
+ error_log /var/log/nginx/error.log warn;
+ pid /var/run/nginx.pid;
+ events {
+ worker_connections 1024;
+ }
+ http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+ access_log /var/log/nginx/access.log main;
+ sendfile on;
+ keepalive_timeout 65;
+ server {
+ listen 80;
+ server_name localhost;
+ location / {
+ root /app;
+ index index.html;
+ try_files $uri $uri/ /index.html;
+ }
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+ }
+ }
+ ```
+
+5. Соберите образ docker
+
+ ```bash
+ docker build . -t my-app
+ # Sending build context to Docker daemon 884.7kB
+ # ...
+ # Successfully built 4b00e5ee82ae
+ # Successfully tagged my-app:latest
+ ```
+
+6. Запустите образ docker
+
+ Эта сборка основана на официальном образе `nginx`, поэтому перенаправление логов уже настроено и само-демонтизация (self daemonizing) отключена. Для улучшения работы nginx в контейнере docker были установлены некоторые другие настройки по умолчанию. Подробнее см. в [репозитории nginx docker](https://hub.docker.com/_/nginx).
+
+ ```bash
+ docker run -d -p 8080:80 my-app
+ curl localhost:8080
+ # ...
+ ```
diff --git a/docs/ru/guide/html-and-static-assets.md b/docs/ru/guide/html-and-static-assets.md
index c7d61fc1d6..938e4a7006 100644
--- a/docs/ru/guide/html-and-static-assets.md
+++ b/docs/ru/guide/html-and-static-assets.md
@@ -16,7 +16,7 @@
В дополнение к [значениям по умолчанию, предоставляемым `html-webpack-plugin`](https://github.com/jantimon/html-webpack-plugin#writing-your-own-templates), все [переменные окружения в клиентском коде](./mode-and-env.md#испоnьзование-переменных-окружения-в-кnиентском-коде) также доступны напрямую. Например, чтобы использовать значение `BASE_URL`:
-``` html
+```html
```
@@ -39,9 +39,13 @@
Эти подсказки внедряются [@vue/preload-webpack-plugin](https://github.com/vuejs/preload-webpack-plugin) и могут быть изменены / удалены с помощью `chainWebpack` через `config.plugin('prefetch')`.
+::: tip Примечание для многостраничных конфигураций
+При использовании многостраничной конфигурации имя плагина нужно изменить в соответствии со структурой `prefetch-{pagename}`, например `prefetch-app`.
+:::
+
Например:
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -61,7 +65,7 @@ module.exports = {
Когда prefetch плагин отключён, вы можете вручную указывать необходимые фрагменты для prefetch с помощью инлайновых комментариев для webpack:
-``` js
+```js
import(/* webpackPrefetch: true */ './someAsyncComponent.vue')
```
@@ -75,7 +79,7 @@ Webpack добавит prefetch-ссылки когда родительский
При использовании Vue CLI с существующим бэкендом, вам может потребоваться отключить генерацию `index.html`, чтобы сгенерированные ресурсы могли быть использованы с другим документом по умолчанию. Для этого добавьте в файл [`vue.config.js`](../config/#vue-config-js) следующее:
-``` js
+```js
// vue.config.js
module.exports = {
// отключение хэшей в именах файлов
@@ -115,13 +119,13 @@ module.exports = {
Например, `url(./image.png)` будет преобразован в `require('./image.png')`, а тег шаблона
-``` html
+```html
```
будет скомпилирован в:
-``` js
+```js
h('img', { attrs: { src: require('./image.png') }})
```
@@ -129,7 +133,7 @@ h('img', { attrs: { src: require('./image.png') }})
Изменить размер можно через [chainWebpack](../config/#chainwebpack). Например, чтобы установить лимит в 10 КБайт:
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -150,7 +154,7 @@ module.exports = {
- Если URL начинается с `~`, то всё что после него будет интерпретироваться как запрос модуля. Это означает, что вы можете ссылаться на ресурсы даже внутри `node_modules`:
- ``` html
+ ```html
```
@@ -170,13 +174,13 @@ module.exports = {
- В `public/index.html` или других HTML-файлах, используемых `html-webpack-plugin` в качестве шаблонов, необходимо добавлять префикс в ссылки с помощью `<%= BASE_URL %>`:
- ``` html
+ ```html
```
- В шаблонах потребуется сначала передать `BASE_URL` в компонент:
- ``` js
+ ```js
data () {
return {
publicPath: process.env.BASE_URL
@@ -186,7 +190,7 @@ module.exports = {
А затем использовать в шаблоне:
- ``` html
+ ```html
```
diff --git a/docs/ru/guide/installation.md b/docs/ru/guide/installation.md
index f9784b57a4..980b126f69 100644
--- a/docs/ru/guide/installation.md
+++ b/docs/ru/guide/installation.md
@@ -9,9 +9,9 @@
Vue CLI требуется [Node.js](https://nodejs.org/) версии 8.9 или выше (рекомендуется 8.11.0+). Управлять несколькими версиями Node на машине можно с помощью [nvm](https://github.com/creationix/nvm) или [nvm-windows](https://github.com/coreybutler/nvm-windows).
:::
-Для установки новых версий пакетов используйте одну из этих команд:
+Для установки нового пакета используйте одну из следующих команд. Для их выполнения потребуются права администратора, если только npm не был установлен в системе через менеджер версий Node.js (например, n или nvm).
-``` bash
+```bash
npm install -g @vue/cli
# ИЛИ
yarn global add @vue/cli
diff --git a/docs/ru/guide/mode-and-env.md b/docs/ru/guide/mode-and-env.md
index c6a8576674..424dd48efa 100644
--- a/docs/ru/guide/mode-and-env.md
+++ b/docs/ru/guide/mode-and-env.md
@@ -1,8 +1,38 @@
-# Переменные окружения и режимы работы
+# Режимы работы и переменные окружения
-Вы можете указать переменные окружения в специальных файлах в корне вашего проекта:
+## Режимы работы
+
+**Режимы работы** — важная часть проектов Vue CLI. По умолчанию есть три режима работы:
+
+- `development` используется `vue-cli-service serve`
+- `test` используется `vue-cli-service test:unit`
+- `production` используется `vue-cli-service build` и `vue-cli-service test:e2e`
+
+Можно переопределять используемый для команды режим по умолчанию опцией `--mode`. Например, если необходимо использовать переменные для разработки в команде сборки:
+
+```
+vue-cli-service build --mode development
+```
+
+При запуске `vue-cli-service` загрузит переменные окружения из всех [соответствующих файлов](#переменные-окружения). Если в них не указана переменная `NODE_ENV`, то она установится соответствующим образом. Например, `NODE_ENV` будет установлена в `"production"` в режиме production, `"test"` в режиме test, а по умолчанию `"development"` в противном случае.
+
+Затем `NODE_ENV` определяет основной режим работы приложения — разработка, production или тестирование — и, следовательно, какую конфигурацию webpack требуется создавать.
+
+Например, для `NODE_ENV=test` Vue CLI создаёт конфигурацию webpack, которая оптимизирована и предназначена для модульных тестов. В ней не обрабатываются изображения и другие ресурсы, которые не требуются для модульных тестов.
+
+Аналогично, при `NODE_ENV=development` создаётся конфигурация webpack, которая включает горячую перезагрузку модулей (HMR), не добавляет хэши в имена файлов ресурсов и не создаёт сборку для вендоров, чтобы обеспечить быструю пересборку при запуске сервера разработки.
+
+При запуске `vue-cli-service build`, значение всегда должно быть `NODE_ENV=production` для получения приложения готового к публикации, независимо от окружения куда будет осуществляться публиковаться.
+
+::: warning Предупреждение об использовании NODE_ENV
+Если в вашем окружении по умолчанию установлен `NODE_ENV`, необходимо либо удалить его, либо явно установить `NODE_ENV` при запуске команд `vue-cli-service`.
+:::
+
+## Переменные окружения
+
+Переменные окружения можно указать в специальных файлах в корне проекта:
-``` bash
+```bash
.env # загружается во всех случаях
.env.local # загружается во всех случаях, игнорируется git
.env.[mode] # загружается только в указанном режиме работы
@@ -16,37 +46,21 @@ FOO=bar
VUE_APP_SECRET=secret
```
-Эти переменные будут доступны для всех команд `vue-cli-service`, плагинов и зависимостей.
+Обратите внимание, что только переменные с префиксом `VUE_APP_` будут статически внедряться в клиентскую сборку с помощью `webpack.DefinePlugin`.
+
+Подробнее о правилах парсинга env можно узнать [в документации `dotenv`](https://github.com/motdotla/dotenv#rules). Мы также используем [dotenv-expand](https://github.com/motdotla/dotenv-expand) для переменных расширения (доступно в Vue CLI 3.5+).
+
+Загруженные переменные станут доступны всем командам `vue-cli-service`, плагинам и зависимостям.
::: tip Приоритет загрузки переменных окружения
Файл с переменными для определённого режима работы (например, `.env.production`) имеет более высокий приоритет, чем общий файл (например, `.env`).
-Кроме того, переменные окружения, которые уже существуют при загрузке Vue CLI имеют наивысший приоритет и не будут перезаписаны значениями из файлов `.env`.
-:::
+Кроме того, переменные окружения, которые уже существуют при запуске Vue CLI имеют наивысший приоритет и не будут перезаписаны значениями из файлов `.env`.
-::: warning Предупреждение об использовании NODE_ENV
-Если в вашем окружении по умолчанию установлен `NODE_ENV`, вы должны либо удалить его, либо явно установить `NODE_ENV` при выполнении команд `vue-cli-service`.
+Файлы `.env` загружаются при запуске `vue-cli-service`. При внесении изменений в файлы необходимо перезапустить службу.
:::
-## Режимы работы
-
-**Режимы работы** — важная часть проектов Vue CLI. По умолчанию, есть три режима работы:
-
-- `development` используется `vue-cli-service serve`
-- `production` используется `vue-cli-service build` и `vue-cli-service test:e2e`
-- `test` используется `vue-cli-service test:unit`
-
-Обратите внимание, что режим работы отличается от `NODE_ENV`, поскольку режим может устанавливать несколько переменных окружения. Тем не менее, каждый режим устанавливает `NODE_ENV` в такое же значение по умолчанию — например, `NODE_ENV` будет установлен в `"development"` в режиме разработки.
-
-Вы можете установить переменные окружения только для определённого режима работы с помощью постфикса `.env` файла. Например, если создать файл с именем `.env.development` в корне вашего проекта, тогда переменные объявленные в нём будут загружаться только в режиме development.
-
-Вы можете переопределить режим по умолчанию для команды, с помощью опции `--mode`. Например, если необходимо использовать переменные для разработки в команде сборки, добавьте это в свои скрипты `package.json`:
-
-```
-"dev-build": "vue-cli-service build --mode development",
-```
-
-## Пример: режим Staging
+### Пример: режим Staging
Предположим, что у нас есть приложение с `.env` файлом:
@@ -61,23 +75,23 @@ NODE_ENV=production
VUE_APP_TITLE=My App (staging)
```
-- `vue-cli-service build` собирает приложение для production, загружает `.env`, `.env.production` и `.env.production.local` если они присутствуют;
+- `vue-cli-service build` собирает приложение для production, загружает `.env`, `.env.production` и `.env.production.local` если они существуют;
-- `vue-cli-service build --mode staging` собирает приложение для production в режиме staging, используя `.env`, `.env.staging` и `.env.staging.local` если они присутствуют.
+- `vue-cli-service build --mode staging` собирает приложение для production в режиме staging, используя `.env`, `.env.staging` и `.env.staging.local` если они существуют.
В обоих случаях приложение собирается для production из-за установленного `NODE_ENV`, но в режиме staging, `process.env.VUE_APP_TITLE` будет перезаписываться другим значением.
-## Использование переменных окружения в клиентском коде
+### Использование переменных окружения в клиентском коде
-Только переменные с префиксом `VUE_APP_` статически внедряются в клиентскую сборку используя `webpack.DefinePlugin`. К ним можно получить доступ из кода вашего приложения:
+Можно получить доступ к переменным окружения из кода приложения:
-``` js
+```js
console.log(process.env.VUE_APP_SECRET)
```
На этапе сборки `process.env.VUE_APP_SECRET` будет заменяться соответствующим значением. Когда в файле указано `VUE_APP_SECRET=secret` — после сборки значением будет `"secret"`.
-В дополнение к переменным `VUE_APP_*` также есть две специальные переменные, которые всегда доступны в коде вашего приложения:
+В дополнение к переменным `VUE_APP_*` есть также две специальные переменные, которые всегда доступны в коде приложения:
- `NODE_ENV` — значение будет `"development"`, `"production"` или `"test"` в зависимости от [режима работы](#режимы-работы) в котором работает приложение.
- `BASE_URL` — соответствует опции `publicPath` в `vue.config.js` и определяет базовый путь по которому опубликовано ваше приложение.
@@ -85,11 +99,19 @@ console.log(process.env.VUE_APP_SECRET)
Все разрешённые переменные окружения также будут доступны внутри `public/index.html` как обсуждалось ранее в разделе [HTML - Интерполяции](./html-and-static-assets.md#интерпоnяции).
::: tip Совет
-Можно добавлять вычисляемые переменные окружения в `vue.config.js`. Они по-прежнему должны именоваться с префикса `VUE_APP_`. Это может пригодиться например для получения информации о версии `process.env.VUE_APP_VERSION = require('./package.json').version`
+Можно добавлять вычисляемые переменные окружения в `vue.config.js`. Они по-прежнему должны именоваться с префикса `VUE_APP_`. Может пригодиться для получения информации о версии
+
+```js
+process.env.VUE_APP_VERSION = require('./package.json').version
+
+module.exports = {
+ // конфигурация
+}
+```
:::
-## Переменные только для локального окружения
+### Переменные только для локального окружения
-Иногда необходимы переменные окружения, которые не должны быть привязаны к кодовой базе, особенно если ваш проект размещается в публичном репозитории. В таком случае вы должны использовать файл `.env.local`. Локальные env-файлы добавлены в `.gitignore` по умолчанию.
+Иногда необходимы переменные окружения, которые не должны быть привязаны к кодовой базе, особенно если проект размещается в публичном репозитории. В таком случае следует использовать файл `.env.local`. Локальные env-файлы добавлены в `.gitignore` по умолчанию.
`.local` также могут добавляться к env-файлам специфичным для режима работы, например `.env.development.local` будет загружен во время разработки, и будет игнорироваться git.
diff --git a/docs/ru/guide/plugins-and-presets.md b/docs/ru/guide/plugins-and-presets.md
index 93ea96960e..6d8d2ee2a1 100644
--- a/docs/ru/guide/plugins-and-presets.md
+++ b/docs/ru/guide/plugins-and-presets.md
@@ -2,7 +2,7 @@
## Плагины
-Архитектура Vue CLI основана на плагинах. Если изучить `package.json` в свежесозданном проекте, то вы найдёте зависимости, имена которых начинаются с `@vue/cli-plugin-`. Такие плагины могут изменять внутреннюю конфигурацию webpack и внедрять команды в `vue-cli-service`. Большинство возможностей, упоминаемых при создании проекта, реализованы ими.
+Vue CLI использует архитектуру на основе плагинов. Если изучить `package.json` в только что созданном проекте, можно обнаружить зависимости, которые начинаются с `@vue/cli-plugin-`. Плагины могут модифицировать внутреннюю конфигурацию webpack и внедрять команды в `vue-cli-service`. Большинство возможностей, перечисленных в процессе создания проекта, реализованы в виде плагинов.
Основанная на плагинах архитектура позволяет Vue CLI оставаться гибкой и расширяемой. Если вы хотите создать собственный плагин — изучите [руководство по созданию плагинов](../dev-guide/plugin-dev.md).
@@ -14,7 +14,7 @@
Каждый плагин для CLI поставляется с генератором (который создаёт файлы) и плагином для runtime (который меняет конфигурацию webpack и внедряет команды). Когда вы используете `vue create` для создания нового проекта, некоторые плагины будут уже предустановлены, в зависимости от вашего выбора необходимых возможностей. В случае, когда необходимо установить плагин в уже существующий проект, вы должны сделать это командой `vue add`:
-``` bash
+```bash
vue add eslint
```
@@ -28,27 +28,27 @@ vue add eslint
Команда `@vue/eslint` трансформируется в полное название пакета `@vue/cli-plugin-eslint`, устанавливает его из npm, и запускает его генератор.
-``` bash
+```bash
# это аналогично предыдущей команде
vue add cli-plugin-eslint
```
Без префикса `@vue` команда будет трансформировать название к публичному пакету. Например, чтобы установить сторонний плагин `vue-cli-plugin-apollo`:
-``` bash
+```bash
# устанавливает и запускает vue-cli-plugin-apollo
vue add apollo
```
Вы можете также использовать сторонние плагины со специфичным scope. Например, если плагин назван `@foo/vue-cli-plugin-bar`, то его можно добавить командой:
-``` bash
+```bash
vue add @foo/bar
```
Можно передавать опции генерации в установленный плагин (для пропуска интерактивного выбора):
-``` bash
+```bash
vue add eslint --config airbnb --lintOn save
```
@@ -102,7 +102,7 @@ vue add eslint --config airbnb --lintOn save
Вот пример пресета настроек:
-``` json
+```json
{
"useConfigFiles": true,
"cssPreprocessor": "sass",
@@ -120,7 +120,7 @@ vue add eslint --config airbnb --lintOn save
Информация из пресета настроек используется генераторами плагинов для создания в проекте соответствующих файлов. Кроме того, в дополнении к полям выше, возможно добавление дополнительных настроек для встроенных инструментов:
-``` json
+```json
{
"useConfigFiles": true,
"plugins": {...},
@@ -139,7 +139,7 @@ vue add eslint --config airbnb --lintOn save
Вы можете явно указать версии используемых плагинов:
-``` json
+```json
{
"plugins": {
"@vue/cli-plugin-eslint": {
@@ -160,7 +160,7 @@ vue add eslint --config airbnb --lintOn save
Для таких случаев можно указать `"prompts": true` в настройках плагина, чтобы позволить пользователю сделать свой выбор:
-``` json
+```json
{
"plugins": {
"@vue/cli-plugin-eslint": {
@@ -181,23 +181,27 @@ vue add eslint --config airbnb --lintOn save
После публикации репозитория, при создании проекта теперь можно указать опцию `--preset` для использования пресета из удалённого репозитория:
-``` bash
+```bash
# использование пресета из репозитория GitHub
vue create --preset username/repo my-project
```
GitLab и BitBucket также поддерживаются. Убедитесь, что используете опцию `--clone` при загрузке из стороннего репозитория:
-``` bash
+```bash
vue create --preset gitlab:username/repo --clone my-project
vue create --preset bitbucket:username/repo --clone my-project
+
+# self-hosted repos
+vue create --preset gitlab:my-gitlab-server.com:group/projectname --clone my-project
+vue create --preset direct:ssh://git@my-gitlab-server.com/group/projectname.git --clone my-project
```
### Пресет из локального файла
При разработке удалённого пресета настроек может часто требоваться отправлять пресет в удалённый репозиторий для его проверки. Для упрощения разработки можно использовать локальные пресеты напрямую. Vue CLI будет загружать локальные пресеты, если путь в значении `--preset` будет относительным или абсолютным, или заканчиваться на `.json`:
-``` bash
+```bash
# ./my-preset должен быть каталогом, содержащим preset.json
vue create --preset ./my-preset my-project
diff --git a/docs/ru/guide/prototyping.md b/docs/ru/guide/prototyping.md
index 21683e8171..f60f4b2e13 100644
--- a/docs/ru/guide/prototyping.md
+++ b/docs/ru/guide/prototyping.md
@@ -2,8 +2,10 @@
Вы можете быстро создавать прототип в одном файле `*.vue` с помощью команд `vue serve` и `vue build`, но для них сначала потребуется глобально установить дополнительный плагин:
-``` bash
+```bash
npm install -g @vue/cli-service-global
+# или
+yarn global add @vue/cli-service-global
```
Недостаток `vue serve` в том, что он полагается на глобально установленные зависимости, которые могут отличаться на разных машинах. Поэтому его рекомендуется использовать только для быстрого прототипирования.
@@ -18,14 +20,15 @@ npm install -g @vue/cli-service-global
Опции:
- -o, --open Открыть в браузере
- -c, --copy Скопировать локальный URL в буфер обмена
- -h, --help Вывести информацию об использовании команды
+ -o, --open Открыть в браузере
+ -c, --copy Скопировать локальный URL в буфер обмена
+ -p, --port Используемый сервером порт (по умолчанию: 8080 или следующий свободный порт)
+ -h, --help Вывести информацию об использовании команды
```
Всё что вам потребуется — файл `App.vue`:
-``` vue
+```vue
Hello!
@@ -33,13 +36,13 @@ npm install -g @vue/cli-service-global
Затем, в каталоге с файлом `App.vue`, выполните команду:
-``` bash
+```bash
vue serve
```
`vue serve` использует такую же конфигурацию по умолчанию (webpack, babel, postcss & eslint) как и проекты создаваемые с помощью `vue create`. Он автоматически выбирает стартовый файл в текущем каталоге — этот файл может быть одним из `main.js`, `index.js`, `App.vue` или `app.vue`. Можно также явно указать стартовый файл:
-``` bash
+```bash
vue serve MyComponent.vue
```
@@ -62,7 +65,7 @@ vue serve MyComponent.vue
Вы можете собрать целевой файл в режиме production для публикации с помощью `vue build`:
-``` bash
+```bash
vue build MyComponent.vue
```
diff --git a/docs/ru/guide/troubleshooting.md b/docs/ru/guide/troubleshooting.md
new file mode 100644
index 0000000000..4e73a20b30
--- /dev/null
+++ b/docs/ru/guide/troubleshooting.md
@@ -0,0 +1,34 @@
+# Поиск и устранение неисправностей
+
+В это документе рассматриваются некоторые общие проблемы, касающиеся Vue CLI, и способы их решения. Прежде чем открывать новый issue, всегда выполняйте следующие действия.
+
+## Запуск установки через `sudo` или как `root`
+
+Если устанавливаете `@vue/cli-service` как пользователь `root` или с помощью `sudo`, то могут возникнуть проблемы при запуске скриптов `postinstall` пакета.
+
+Это функция безопасности npm. Вы всегда должны избегать запуска npm с привилегиями root, потому что сценарии установки скриптов могут быть непреднамеренно вредоносными.
+
+Однако, если необходимо, то можно обойти эту ошибку, установив флаг `--unsafe-perm` для npm. Это реализуется путём добавления префикса с переменной окружения к команде:
+
+```bash
+npm_config_unsafe_perm=true vue create my-project
+```
+
+## Символические ссылки в `node_modules`
+
+Если есть зависимости, установленные через `npm link` или `yarn link`, ESLint (а иногда и Babel) могут работать некорректно для этих слинкованных зависимостей. Это происходит потому, что [по умолчанию webpack разрешает символические ссылки на их настоящее местоположение](https://webpack.js.org/configuration/resolve/#resolvesymlinks), таким образом ломая поиск конфигурации ESLint / Babel.
+
+Обходным решением этой проблемы будет отключение вручную разрешения символических ссылок в webpack:
+
+```js
+// vue.config.js
+module.exports = {
+ chainWebpack: (config) => {
+ config.resolve.symlinks(false)
+ }
+}
+```
+
+::: warning ПРЕДУПРЕЖДЕНИЕ
+Отключение `resolve.symlinks` может сломать горячую перезагрузку модулей, если ваши зависимости устанавливались сторонними npm-клиентами, использующие символические ссылки, такие как `cnpm` или `pnpm`.
+:::
diff --git a/docs/ru/guide/webpack.md b/docs/ru/guide/webpack.md
index 9151be65cb..0dd02a874c 100644
--- a/docs/ru/guide/webpack.md
+++ b/docs/ru/guide/webpack.md
@@ -4,7 +4,7 @@
Самый простой способ изменять конфигурацию webpack — использовать объект в опции `configureWebpack` в файле `vue.config.js`:
-``` js
+```js
// vue.config.js
module.exports = {
configureWebpack: {
@@ -23,7 +23,7 @@ module.exports = {
Если необходимо условное поведение, в зависимости от окружения, или вы хотите напрямую изменять конфигурацию — используйте функцию (будет лениво выполняться после установки переменных окружения). Она получает итоговую конфигурацию в качестве аргумента. Внутри функции можно напрямую изменить конфигурацию, ИЛИ вернуть объект для объединения:
-``` js
+```js
// vue.config.js
module.exports = {
configureWebpack: config => {
@@ -48,7 +48,7 @@ module.exports = {
### Изменение настроек загрузчика
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -70,7 +70,7 @@ module.exports = {
### Добавление нового загрузчика
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -89,7 +89,7 @@ module.exports = {
Если вы хотите заменить существующий [базовый загрузчик](https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-service/lib/config/base.js), например воспользоваться `vue-svg-loader` для вставки SVG-файлов инлайн вместо загрузки обычными файлами:
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -110,7 +110,7 @@ module.exports = {
### Изменение настроек плагина
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -127,7 +127,7 @@ module.exports = {
Например, предположим, необходимо изменить местоположение `index.html` по умолчанию с `/Users/test/proj/public/index.html` на `/Users/test/proj/app/templates/index.html`. По ссылке [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin#options) перечислен список параметров, которые можем передавать. Чтобы изменить шаблон, передадим новый путь к шаблону следующей конфигурацией:
-``` js
+```js
// vue.config.js
module.exports = {
chainWebpack: config => {
@@ -153,7 +153,7 @@ module.exports = {
Вы можете перенаправить вывод в файл для более удобного изучения:
-``` bash
+```bash
vue inspect > output.js
```
@@ -161,21 +161,21 @@ vue inspect > output.js
Вы также можете указать подмножество конфигурации для проверки, указав путь:
-``` bash
+```bash
# показать только первое правило
vue inspect module.rules.0
```
Или указать именованное правило или плагин:
-``` bash
+```bash
vue inspect --rule vue
vue inspect --plugin html
```
Наконец, вы можете вывести все именованные правила и плагины:
-``` bash
+```bash
vue inspect --rules
vue inspect --plugins
```
diff --git a/docs/ru/migrating-from-v3/README.md b/docs/ru/migrating-from-v3/README.md
new file mode 100644
index 0000000000..d79818e955
--- /dev/null
+++ b/docs/ru/migrating-from-v3/README.md
@@ -0,0 +1,299 @@
+---
+sidebar: auto
+---
+
+# Миграция с версии v3
+
+Для начала глобально установите последнюю версию Vue CLI:
+
+```sh
+npm install -g @vue/cli
+# ИЛИ
+yarn global add @vue/cli
+```
+
+## Обновление всех плагинов сразу
+
+В существующих проектах запустите команду:
+
+```sh
+vue upgrade
+```
+
+После чего ознакомьтесь со следующим разделом с информацией о крупных изменениях (breaking changes) в каждом пакете.
+
+------
+
+## Миграция вручную по одному пакету
+
+При желании выполнить миграцию постепенно и вручную несколько советов:
+
+### Глобальный пакет `@vue/cli`
+
+#### [Переработана команда](https://github.com/vuejs/vue-cli/pull/4090) `vue upgrade`
+
+- Было: `vue upgrade [patch | minor | major]` — выполняла только установку последних версий плагинов Vue CLI.
+- Стало: `vue upgrade [plugin-name]` — кроме обновления плагинов, запускает миграции из них для автоматизации процесса обновления. Для получения информации о дополнительных опциях этой команды выполните `vue upgrade --help`.
+
+#### Изменён формат вывода `vue --version`
+
+При запуске `vue --version`:
+
+- 3.x: выводит `3.12.0`
+- 4.x: выводит `@vue/cli 4.0.0`
+
+#### Добавлен дополнительный шаг подтверждения во избежание перезаписи
+
+При запуске `vue invoke` / `vue add` / `vue upgrade` теперь появляется [дополнительный шаг подтверждения](https://github.com/vuejs/vue-cli/pull/4275) при наличии незафиксированных изменений в текущем репозитории.
+
+
+
+#### Vue Router и Vuex теперь имеют сопутствующие CLI-плагины
+
+При запуске `vue add vuex` или `vue add router`:
+
+- В версии 3, только `vuex` или `vue-router` добавляется в проект;
+- В версии 4, также устанавливается `@vue/cli-plugin-vuex` или `@vue/cli-plugin-router`.
+
+В настоящее время это не привносит ничего особенного для конечных пользователей, но такой подход позволяет добавлять больше возможностей для пользователей Vuex и Vue Router позднее.
+
+Для разработчиков пресетов и плагинов есть ещё несколько изменений в этих двух плагинах:
+
+- Структура каталогов по умолчанию изменена:
+ - `src/store.js` перемещён в `src/store/index.js`;
+ - `src/router.js` перемещён в `src/router/index.js`;
+- Опции `router` и `routerHistoryMode` в файле `preset.json` по-прежнему поддерживаются для совместимости. Но рекомендуется использовать `plugins: { '@vue/cli-plugin-router': { historyMode: true } }` для консистентности.
+- `api.hasPlugin('vue-router')` больше не поддерживается. Теперь `api.hasPlugin('router')`.
+
+### `@vue/cli-service`
+
+#### Обработка пробелов в шаблонах
+
+Во Vue CLI v3 для уменьшения размеров итоговой сборки по умолчанию отключена опция `preserveWhitespace` для `vue-template-compiler`.
+
+Однако это привносило свои тонкости использования.
+
+Но после релиза Vue 2.6 теперь можно управлять обработкой пробелов с помощью [новой опции `whitespace`](https://github.com/vuejs/vue/issues/9208#issuecomment-450012518). Поэтому во Vue CLI v4 перешли на использование этой новой опции по умолчанию.
+
+Возьмём в качестве примера следующий шаблон:
+
+```html
+
+ Welcome to Vue.jsworld.
+ Have fun!
+
+```
+
+С опцией `preserveWhitespace: false` все пробелы между тегами будут удалены, поэтому он скомпилируется в:
+
+```html
+
+```
+
+Обратите внимание, что теперь сохраняется **инлайновый** пробел между тегами.
+
+#### `vue-cli-service build --mode development`
+
+Раньше при запуске команды `build` в режиме `development` расположение каталога `dist` отличалось от расположения в режиме `production`. Теперь, с учётом указанных ниже двух пулл-реквестов, структура и расположение каталогов будет во всех режимах одинакова (имена файлов всё ещё различаются — никаких хэшей в режиме `development`):
+
+- [#4323](https://github.com/vuejs/vue-cli/pull/4323) ensure consistent directory structure for all modes
+- [#4302](https://github.com/vuejs/vue-cli/pull/4302) move dev configs into serve command
+
+#### Для пользователей SASS/SCSS
+
+Раньше во Vue CLI v3 использовался `sass-loader@7` по умолчанию.
+
+Недавно вышел `sass-loader@8` в котором довольно сильно изменился формат конфигурации. Примечания к релизу:
+
+`@vue/cli-service` продолжает поддерживать `sass-loader@7` в v4, но настоятельно рекомендуем обратить внимание на релиз `sass-loader@8` и обновиться до последней версии.
+
+#### Для пользователей Less
+
+`less-loader` v4 несовместим с `less` >= v3.10, см. .
+Настоятельно рекомендуем обновиться до `less-loader@5`, если в проекте используется Less.
+
+#### Для пользователей CSS модулей
+
+- [Устаревшая опция `css.modules` заменена на `css.requireModuleExtension`](https://github.com/vuejs/vue-cli/pull/4387). Это связано с обновлением `css-loader` до v3 и изменением формата конфигурации. С подробным объяснением можно ознакомиться по ссылке.
+
+#### Настройки `vue.config.js`
+
+Уже объявленная как устаревшая [опция `baseUrl`](../config/#baseurl) теперь [удалена](https://github.com/vuejs/vue-cli/pull/4388).
+
+#### `chainWebpack` / `configureWebpack`
+
+##### Метод `minimizer` в `chainWebpack`
+
+Если настраивали правила через `chainWebpack`, то обратите внимание, что `webpack-chain` обновлён с версии v4 до v6. Наиболее заметным изменением является конфигурация `minimizer`.
+
+Например, если необходимо включить опцию `drop_console` в плагине terser.
+В версии v3 это можно сделать через `chainWebpack` так:
+
+```js
+const TerserPlugin = require('terser-webpack-plugin')
+module.exports = {
+ chainWebpack: (config) => {
+ config.optimization.minimizer([
+ new TerserPlugin({ terserOptions: { compress: { drop_console: true } } })
+ ])
+ }
+}
+```
+
+В версии v4 необходимо изменить таким образом:
+
+```js
+module.exports = {
+ chainWebpack: (config) => {
+ config.optimization.minimizer('terser').tap((args) => {
+ args[0].terserOptions.compress.drop_console = true
+ return args
+ })
+ }
+}
+```
+
+##### Другие изменения
+
+- [Правило `pug-plain` переименовано в `pug-plain-loader`](https://github.com/vuejs/vue-cli/pull/4230)
+
+#### Базовые загрузчики / плагины
+
+Скорее всего это вряд ли повлияет на пользователей, если не настраивали опции через `chainWebpack` / `configureWebpack`
+
+`css-loader` был обновлён с версии v1 до v3:
+
+- [История изменений v2](https://github.com/webpack-contrib/css-loader/releases/tag/v2.0.0)
+- [История изменений v3](https://github.com/webpack-contrib/css-loader/releases/tag/v3.0.0)
+
+Несколько базовых загрузчиков и плагинов webpack обновлены, с незначительными изменениями:
+
+- `url-loader` [с версии v1 до v2](https://github.com/webpack-contrib/url-loader/releases/tag/v2.0.0)
+- `file-loader` [с версии v3 до v4](https://github.com/webpack-contrib/file-loader/releases/tag/v4.0.0)
+- `copy-webpack-plugin` [с версии v4 до v5](https://github.com/webpack-contrib/copy-webpack-plugin/blob/master/CHANGELOG.md#500-2019-02-20)
+- `terser-webpack-plugin` [с версии v1 до v2](https://github.com/vuejs/vue-cli/pull/4676)
+
+### `@vue/cli-plugin-babel`, `@vue/babel-preset-app`
+
+#### core-js
+
+Требуется плагину babel в качестве peer-зависимости для полифилов, используемых в транспилированном коде.
+
+Во Vue CLI v3 использовалась `core-js` версии 2.x, теперь она обновлена до 3.x.
+
+Эта миграция автоматизирована, достаточно выполнить команду `vue upgrade babel`. Но если добавлялись пользовательские полифилы, может потребоваться обновить имена полифилов (подробную информацию можно найти в [истории изменений core-js](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md#L279-L297)).
+
+#### Пресет Babel
+
+Эта миграция также автоматизирована, при обновлении командой `vue upgrade babel`.
+
+- В версии v3, babel пресет по умолчанию в `babel.config.js` был `@vue/app`.
+- В версии v4, пресет перемещён в плагин и теперь называется `@vue/cli-plugin-babel/preset`
+
+Необходимость этого в том, что `@vue/babel-preset-app` в действительности является косвенной зависимостью проекта. Это работает благодаря «поднятию» (hoisting) npm-пакета. Однако может стать причиной потенциальных проблем, если у проекта несколько косвенных зависимостей одного и того же пакета, или если менеджер пакетов накладывает более строгие ограничения при разрешении зависимостей (например, yarn plug'n'play или pnpm). Поэтому он вынесен отдельной зависимостью проекта (`@vue/cli-plugin-babel`) для большей совместимости со стандартами и меньшей подверженности ошибкам.
+
+------
+
+### `@vue/cli-plugin-eslint`
+
+Плагин теперь [требует ESLint в качестве peer-зависимости](https://github.com/vuejs/vue-cli/pull/3852).
+
+Это не повлияет на проекты, созданные с помощью Vue CLI 3.1 или более поздних версий.
+
+Если проект был создан с помощью Vue CLI 3.0.x или более ранних версий, то потребуется добавить `eslint@4` к зависимостям проекта (это автоматизированно при обновлении плагина с помощью команды `vue upgrade eslint`).
+
+Также рекомендуется обновить ESLint до версии v5, а конфигурацию ESLint до последней версии (поддержка ESLint v6 будет добавлена в ближайшем будущем).
+
+------
+
+#### Пресет Prettier
+
+Старая реализация пресета prettier была несовершенной. Шаблон по умолчанию обновлён с версии Vue CLI v3.10.
+
+Теперь требуются `eslint`, `eslint-plugin-prettier` и `prettier` в качестве peer-зависимостей, следуя [стандартным практикам экосистемы ESLint](https://github.com/eslint/eslint/issues/3458).
+
+В старых проектах при возникновении проблем как `Cannot find module: eslint-plugin-prettier` необходимо выполнить следующую команду для их исправления:
+
+```sh
+npm install --save-dev eslint@5 @vue/eslint-config-prettier@5 eslint-plugin-prettier prettier
+```
+
+------
+
+#### Настройки `lintOnSave`
+
+(затрагивает только процесс разработки)
+
+Значение по умолчанию для опции `lintOnSave` (если не было указано) [изменено с `true` на `'default'`](https://github.com/vuejs/vue-cli/pull/3975). Ознакомиться с подробным объяснением можно [в документации](../config/#lintonsave).
+
+Вкратце:
+
+- В версии v3, по умолчанию, предупреждения линтинга и ошибки отображаются в браузере в слое для ошибок поверх приложения.
+- В версии v4, по умолчанию, только ошибки линтинга будут таким образом прерывать процесс разработки. Предупреждения будут отображаться в консоли терминала.
+
+### `@vue/cli-plugin-pwa`
+
+Базовый плагин workbox-webpack-plugin обновлён с версии v3 до v4. См. [примечания к релизу](https://github.com/GoogleChrome/workbox/releases/tag/v4.0.0).
+
+Теперь доступно поле `pwa.manifestOptions` (его можно указать в файле `vue.config.js`). Благодаря этой опции можно сгенерировать `manifest.json` из объекта конфигурации, а не копировать из каталога `public`. Это обеспечивает более консистентный интерфейс управления конфигурацией PWA (Обратите внимание, что это опциональная возможность. Связанные пулл-реквесты: [#2981](https://github.com/vuejs/vue-cli/pull/2981), [#4664](https://github.com/vuejs/vue-cli/pull/4664)).
+
+### `@vue/cli-plugin-e2e-cypress`
+
+До Vue CLI v3.0.0-beta.10 команда для E2E-тестирования по умолчанию была `vue-cli-service e2e`. Позднее изменена на `vue-cli-service test:e2e`. Предыдущая команда объявлена устаревшей, но всё ещё поддерживалась. Теперь [поддержка старой команды удалена](https://github.com/vuejs/vue-cli/pull/3774).
+
+### `@vue/cli-plugin-e2e-nightwatch`
+
+Nightwatch.js обновлён с версии 0.9 до 1.x. Рекомендуем сначала изучить [руководство по миграции Nightwatch](https://github.com/nightwatchjs/nightwatch/wiki/Migrating-to-Nightwatch-1.0).
+
+Поставляемая в комплекте конфигурация и генерируемые тесты [были полностью переработаны](https://github.com/vuejs/vue-cli/pull/4541). Перейдите по ссылке для получения более подробной информации. Большинство используемых кейсов во Vue CLI v3 по-прежнему поддерживаются. Это просто добавление новых возможностей.
+
+Поскольку ChromeDriver изменил свою стратегию версионирования с 73-й версии, теперь он сделан peer-зависимостью проекта. В плагине реализована простая проверка версии браузера, поэтому при обновлении до несовместимой версии Chrome появится предупреждение с предложением обновить до соответствующей версии и ChromeDriver.
+
+------
+
+Аналогично плагину для cypress, поддержка устаревшей команды `vue-cli-service e2e` удалена.
+
+### `@vue/cli-plugin-typescript`
+
+При использовании Typescript, webpack в настройках разрешения модулей теперь [отдаёт предпочтение файлам с расширениями `ts(x)`, а не `js(x)`](https://github.com/vuejs/vue-cli/pull/3909).
+
+### `@vue/cli-plugin-unit-jest`
+
+Обновлён Jest с версии v23 до v24, поэтому рекомендуем сначала изучить [примечания к релизу](https://jestjs.io/blog/2019/01/25/jest-24-refreshing-polished-typescript-friendly). А также, при необходимости, ознакомиться с [полной историей изменений](https://github.com/facebook/jest/blob/20ba4be9499d50ed0c9231b86d4a64ec8a6bd303/CHANGELOG.md#user-content-2400).
+
+Плагин `unit-jest` теперь поставляется с 4 пресетами конфигурации:
+
+- `@vue/cli-plugin-unit-jest` — пресет по умолчанию для наиболее распространённых типов проектов
+- `@vue/cli-plugin-unit-jest/presets/no-babel` — если не установлен `@vue/cli-plugin-babel` и требуется не использовать babel в проекте
+- `@vue/cli-plugin-unit-jest/presets/typescript` — пресет с поддержкой TypeScript (но без поддержки TSX)
+- `@vue/cli-plugin-unit-jest/presets/typescript-and-babel` — пресет с поддержкой TypeScript (в том числе TSX) и babel.
+
+Если после создания проекта стандартная конфигурация Jest не изменялась (расположена в файле `jest.config.js` или в поле `jest` в `package.json`), то можно просто заменить массивный объект конфигурации одним единственным полем:
+
+```js
+module.exports = {
+ // Замените имя пресета на одно из списка выше по необходимости
+ preset: '@vue/cli-plugin-unit-jest'
+}
+```
+
+(зависимости `ts-jest`, `babel-jest` можно удалить после миграции конфигурации на использование пресета)
+
+::: tip Напоминание
+По умолчанию тестовое окружение в новых пресетах использует jsdom@15, что отличается от среды по умолчанию в Jest 24 (jsdom@11). Это должно быть согласовано в предстоящем обновлении Jest 25. Большинство пользователей не будут затронуты этим изменением. Подробную информацию, связанную с jsdom, можно найти в истории изменений
+:::
+
+### `@vue/cli-plugin-unit-mocha`
+
+- Теперь используется mochapack вместо mocha-webpack, см. историю изменений . Это изменение вряд ли повлияет на фактическое использование.
+- Обновление mocha до версии 6, см. [историю изменений Mocha](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#600-0--2019-01-01) для подробной информации.
+
+### `@vue/cli-service-global`
+
+См. подробные изменения в пакетах [`@vue/cli-service`](#vue-cli-service) и [`@vue/cli-plugin-eslint`](#vue-cli-plugin-eslint).