diff --git a/.gitignore b/.gitignore index 1e9103153..8ca2fcead 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules # logs npm-debug.log +.DS_Store diff --git a/README.md b/README.md index bad4f0e94..d8de02757 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +Официальный русский перевод документации Nuxt.js (основная часть). + +Russian translation of primary Nuxt.js documentation site. Supported by Translation Gang. Primary maintainer Grigoriy Beziuk. + # Nuxt.js Documentation > This is where the documentation is stored and served as an API diff --git a/ru/api/configuration-build.md b/ru/api/configuration-build.md new file mode 100644 index 000000000..ffe13daa1 --- /dev/null +++ b/ru/api/configuration-build.md @@ -0,0 +1,34 @@ +--- +title: Конфигурация BUILD +description: Nuxt.js позволяет конфигурировать опции webpack'а на ваше усмотрение. +--- + +# Build + +> Nuxt.js позволяет конфигурировать опции webpack'а на ваше усмотрение. + +## build.vendor + +> Nuxt.js позволяет добавлять модули в генерируемый файл `vendor.bundle.js`, чтобы уменьшить размер финального приложения. Это действительно полезно при использовании внешних модулей (например, `axios`). + +Для добавления стороннего модуля/файла внутрь приложения, создайте параметр `build.vendor` внутри `nuxt.config.js`: + +```js +module.exports = { + build: { + vendor: ['axios'] + } +} +``` + +Вы можете также указать путь к файлу, например, к своей собственной библиотеке: +```js +module.exports = { + build: { + vendor: [ + 'axios', + '~plugins/my-lib.js' + ] + } +} +``` diff --git a/ru/api/configuration-cache.md b/ru/api/configuration-cache.md new file mode 100644 index 000000000..f07093a74 --- /dev/null +++ b/ru/api/configuration-cache.md @@ -0,0 +1,7 @@ +--- +title: Конфигурация CACHE +--- + +# Cache + +> Документация скоро будет diff --git a/ru/api/configuration-css.md b/ru/api/configuration-css.md new file mode 100644 index 000000000..bcc40a44c --- /dev/null +++ b/ru/api/configuration-css.md @@ -0,0 +1,32 @@ +--- +title: Конфигурация CSS +description: Nuxt.js позволяет указать глобальные CSS-файлы/модули/библиотеки (подключённые к каждой странице). +--- + +# CSS + +> Nuxt.js позволяет указать глобальные CSS-файлы/модули/библиотеки (подключённые к каждой странице). + +- Type: `Array` + - `String | Object` + +Если элемент типа объект, то параметры следующие: +- src: `String` (путь к файлу) +- lang: `String` ([используется пре-процессор](/guide/pages#using-pre-processors)) + +В `nuxt.config.js` добавьте ресурсы CSS: + +```js +module.exports = { + css: [ + // Загрузить модуль node.js + 'hover.css/css/hover-min.css', + // модуль node.js, но с указанием пре-процессора + { src: 'bulma', lang: 'sass' }, + // CSS-файл в проекте + '~assets/css/main.css' + ] +} +``` + +

**В продакшн-версии приложения** весь CSS-код будет минимизирован, скомпилирован в файл `styles.css` и добавлен в блок страницы ``.

diff --git a/ru/api/configuration-env.md b/ru/api/configuration-env.md new file mode 100644 index 000000000..43cbe5438 --- /dev/null +++ b/ru/api/configuration-env.md @@ -0,0 +1,7 @@ +--- +title: Конфигурация ENV +--- + +# Env + +> Документация скоро будет diff --git a/ru/api/configuration-generate.md b/ru/api/configuration-generate.md new file mode 100644 index 000000000..88e13b8c5 --- /dev/null +++ b/ru/api/configuration-generate.md @@ -0,0 +1,7 @@ +--- +title: Configuration GENERATE +--- + +# Generate + +> Документация скоро будет diff --git a/ru/api/configuration-head.md b/ru/api/configuration-head.md new file mode 100644 index 000000000..f89f56a25 --- /dev/null +++ b/ru/api/configuration-head.md @@ -0,0 +1,7 @@ +--- +title: Конфигурация HEAD +--- + +# Head + +> Документация скоро будет diff --git a/ru/api/configuration-loading.md b/ru/api/configuration-loading.md new file mode 100644 index 000000000..66e06f46d --- /dev/null +++ b/ru/api/configuration-loading.md @@ -0,0 +1,7 @@ +--- +title: Конфигурация LOADING +--- + +# Loading + +> Документация скоро будет diff --git a/ru/api/configuration-plugins.md b/ru/api/configuration-plugins.md new file mode 100644 index 000000000..8624fd3a3 --- /dev/null +++ b/ru/api/configuration-plugins.md @@ -0,0 +1,7 @@ +--- +title: Конфигурация PLUGINS +--- + +# Plugins + +> Документация скоро будет diff --git a/ru/api/configuration-router.md b/ru/api/configuration-router.md new file mode 100644 index 000000000..6fdc9c027 --- /dev/null +++ b/ru/api/configuration-router.md @@ -0,0 +1,7 @@ +--- +title: Конфигурация ROUTER +--- + +# Router + +> Документация скоро будет diff --git a/ru/api/index.md b/ru/api/index.md new file mode 100644 index 000000000..fbc11c533 --- /dev/null +++ b/ru/api/index.md @@ -0,0 +1,27 @@ +--- +title: Модуль Nuxt.js +description: можно использовать nuxt.js программно, как middleware для собственного web-сервера. +--- + +# Программное использование Nuxt.js + +Вероятно, вы захотите использовать свой сервер со своим ПО и API. Для этого вы можете использовать Nuxt.js программно. +Nuxt.js написан на ES2015, из-за чего его код приятен и хорошо читаем. Транспилеры не используются, и всю работу выполняет сам движок Core V8. Поэтому Nuxt.js требует Node.js версии `4.0` или выше. + +Подключить Nuxt.js можно так: +```js +const Nuxt = require('nuxt') +``` + +### Опции Nuxt + +Чтобы узнать о возможных опциях для Nuxt.js, см. раздел конфигурации. +```js +const options = {} + +const nuxt = new Nuxt(options) +nuxt.build() +.then(() => { + // Здесь можно использовать nuxt.render(req, res) или nuxt.renderRoute(route, context) +}) +``` diff --git a/ru/api/menu.json b/ru/api/menu.json new file mode 100644 index 000000000..d0a3c1d0d --- /dev/null +++ b/ru/api/menu.json @@ -0,0 +1,31 @@ +[ + { + "title": "Модуль Nuxt", + "links": [ + { "name": "Использование", "to": "" }, + { "name": "Render", "to": "/nuxt-render" }, + { "name": "RenderRoute", "to": "/nuxt-render-route" }, + { "name": "RenderAndGetWindow", "to": "/nuxt-render-and-get-window" } + ] + }, + { + "title": "Конфигурация", + "links": [ + { "name": "Build", "to": "/configuration-build" }, + { "name": "Cache", "to": "/configuration-cache" }, + { "name": "CSS", "to": "/configuration-css" }, + { "name": "Env", "to": "/configuration-env" }, + { "name": "Generate", "to": "/configuration-generate" }, + { "name": "Head", "to": "/configuration-head" }, + { "name": "Loading", "to": "/configuration-loading" }, + { "name": "Plugins", "to": "/configuration-plugins" }, + { "name": "Router", "to": "/configuration-router" } + ] + }, + { + "title": "Страницы", + "links": [ + { "name": "Контекст (Context)", "to": "/pages-context" } + ] + } +] diff --git a/ru/api/nuxt-render-and-get-window.md b/ru/api/nuxt-render-and-get-window.md new file mode 100644 index 000000000..dbec8e08e --- /dev/null +++ b/ru/api/nuxt-render-and-get-window.md @@ -0,0 +1,7 @@ +--- +title: Модуль Nuxt.js +--- + +# nuxt.renderAndGetWindow() + +> Документация скоро будет diff --git a/ru/api/nuxt-render-route.md b/ru/api/nuxt-render-route.md new file mode 100644 index 000000000..18d5fa77b --- /dev/null +++ b/ru/api/nuxt-render-route.md @@ -0,0 +1,7 @@ +--- +title: Модуль Nuxt.js +--- + +# nuxt.renderRoute() + +> Документация скоро будет diff --git a/ru/api/nuxt-render.md b/ru/api/nuxt-render.md new file mode 100644 index 000000000..52da3b57b --- /dev/null +++ b/ru/api/nuxt-render.md @@ -0,0 +1,24 @@ +--- +title: Модуль Nuxt.js +--- + +# nuxt.render(req, res) + +Вы можете использовать Nuxt.js с помощью `nuxt.render` для сервера node.js. + +Пример с Express.js: +```js +const app = require('express')() +const Nuxt = require('nuxt') + +const nuxt = new Nuxt() +nuxt.build() +.then(() => { + // Рендерить каждый маршрут с Nuxt.js + app.use(nuxt.render) + // Запустить сервер + app.listen(3000) +}) +``` + +

Рекомендуется вызываать **nuxt.render** в конце выполнения вашего кода, поскольку фреймворк отвечает за рендеринг вашего веб-приложения и не будет вызывать next()

diff --git a/ru/api/pages-context.md b/ru/api/pages-context.md new file mode 100644 index 000000000..deddac0e2 --- /dev/null +++ b/ru/api/pages-context.md @@ -0,0 +1,23 @@ +--- +title: Контекст страниц +description: Контекст (context) — полезный объект с набором методов для абстракции клиент-серверного взаимодействия. +--- + +# Контекст + +Список доступных ключей в свойстве `context`: + +| Ключ | Тип | Доступность | Описание | +|-----|------|--------------|-------------| +| `isClient` | Булевское | Клиент & сервер | Значение `true` указывает на то, что рендеринг происходит на стороне клиента. | +| `isServer` | Булевское | Клиент & сервер | Значение `true` указывает на то, что рендеринг происходит на стороне сервера. | +| `isDev` | Булевское | Клиент & сервер | Значение `true` указывает на то, что код выполняется в режиме разработки. Может быть полезно, когда необходимо кешировать данные в продакшн-версии. | +| `route` | [Маршрут Vue](https://router.vuejs.org/en/api/route-object.html) | Клиент & сервер | экземпляр класса маршрута в `vue-router` [см. документацию](https://router.vuejs.org/en/api/route-object.html) | +| `store` | [Хранилище Vuex](http://vuex.vuejs.org/en/api.html#vuexstore-instance-properties) | Клиент & сервер | Экземпляр `Vuex.Store`. **Доступен только в случае, когда `store: true` в `nuxt.config.js`** | +| `env` | Объект | Клиент & сервер | Переменная окружения в `nuxt.config.js`, [см. API окружения](/api/configuration-env) | +| `params` | Объект | Клиент & сервер | Псевдоним route.params | +| `query` | Объект | Клиент & сервер | Псевдоним route.query | +| `req` | [http.Request](https://nodejs.org/api/http.html#http_class_http_incomingmessage) | Сервер | Запрос от сервера node.js. Если nuxt используется в качестве промежуточного ПО, то объект `req` может отличаться в зависимости от выбранного фреймворка. *Не доступен через `nuxt generate`*. | +| `res` | [http.Response](https://nodejs.org/api/http.html#http_class_http_serverresponse) | Сервер | Ответ от сервера node.js. Если nuxt используется в качестве промежуточного ПО, то объект `res` может отличаться в зависимости от выбранного фреймворка. *Не доступен через `nuxt generate`*. | +| `redirect` | Функция | Клиент & сервер | Используйте этот метод, чтобы перенаправить юзерана другой маршрут. Значение статуса запроса (status) используется на сервере, по-умолчанию — 302. `redirect([status,] path [, query])` | +| `error` | Функция | Клиент & сервер | Используйте этот метод, чтобы показать страницу ошибки: `error(params)`. Объект `params`должен содержать свойства `statusCode` и `message`. | diff --git a/ru/examples/async-datas.md b/ru/examples/async-datas.md new file mode 100644 index 000000000..a703f0eee --- /dev/null +++ b/ru/examples/async-datas.md @@ -0,0 +1,102 @@ +--- +title: Async Datas +description: Async Datas example with Nuxt.js +github: async-data +--- + +## Documentation + +### data (context) + +> Nuxt.js *supercharges* the `data` method from vue.js to let you handle async operation before setting the component data. + +`data` is called every time before loading the component (*only if attached to a route*). It can be called from the server-side or before navigating to the corresponding route. + +The `data` method receives the context as the first argument, you can use it to fetch some data and return the component data. To make the data method asynchronous, Nuxt.js offers you 2 ways, choose the one you're the most familiar with: + +1. returning a `Promise`, Nuxt.js will wait for the promise to be resolved before rendering the Component +2. Define a second argument which is a callback method to be called like this: `callback(err, data)` + +Example with returning a `Promise`: +```js +export default { + data ({ params }) { + return axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + return { title: res.data.title } + }) + } +} +``` + +Example with using the `callback` argument: +```js +export default { + data ({ params }, callback) { + axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + callback(null, { title: res.data.title }) + }) + } +} +``` + +And then, you can display the data inside your template: + +```html + +``` + +### Context + +List of all the available keys in `context`: + +| Key | Type | Available | Description | +|-----|------|--------------|-------------| +| `isClient` | Boolean | Client & Server | Boolean to let you know if you're actually renderer from the client-side | +| `isServer` | Boolean | Client & Server | Boolean to let you know if you're actually renderer from the server-side | +| `isDev` | Boolean | Client & Server | Boolean to let you know if you're in dev mode, can be useful for caching some data in production | +| `route` | [vue-router route](https://router.vuejs.org/en/api/route-object.html) | Client & Server | `vue-router` route instance [see documentation](https://router.vuejs.org/en/api/route-object.html) | +| `store` | [vuex store](http://vuex.vuejs.org/en/api.html#vuexstore-instance-properties) | Client & Server | `Vuex.Store` instance. **Available only if `store: true` is set in `nuxt.config.js`** | +| `params` | Object | Client & Server | Alias of route.params | +| `query` | Object | Client & Server | Alias of route.query | +| `req` | [http.Request](https://nodejs.org/api/http.html#http_class_http_incomingmessage) | Server | Request from the node.js server. If nuxt is used as a middleware, the req object might be different depending of the framework you're using. | +| `res` | [http.Response](https://nodejs.org/api/http.html#http_class_http_serverresponse) | Server | Response from the node.js server. If nuxt is used as a middleware, the res object might be different depending of the framework you're using. | +| `redirect` | Function | Client & Server | Use this method to redirect the user to another route, the status code is used on the server-side, default to 302. `redirect([status,] path [, query])` | +| `error` | Function | Client & Server | Use this method to show the error page: `error(params)`. The `params` should have the fields `statusCode` and `message`. | + +### Handling errors + +Nuxt.js add the `error(params)` method in the `context`, you can call it to display the error page. `params.statusCode` will be also used to render the proper status code form the server-side. + +Example with a `Promise`: +```js +export default { + data ({ params, error }) { + return axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + return { title: res.data.title } + }) + .catch((e) => { + error({ statusCode: 404, message: 'Post not found' }) + }) + } +} +``` + +If you're using the `callback` argument, you can call it directly with the error, Nuxt.js will call the `error` method for you: +```js +export default { + data ({ params }, callback) { + axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + callback(null, { title: res.data.title }) + }) + .catch((e) => { + callback({ statusCode: 404, message: 'Post not found' }) + }) + } +} +``` diff --git a/ru/examples/auth-routes.md b/ru/examples/auth-routes.md new file mode 100644 index 000000000..799a468ec --- /dev/null +++ b/ru/examples/auth-routes.md @@ -0,0 +1,210 @@ +--- +title: Auth Routes +description: Authenticated routes example with Nuxt.js +github: auth-routes +livedemo: https://auth-routes.nuxtjs.org +liveedit: https://gomix.com/#!/project/nuxt-auth-routes +--- + +# Documentation + +> Nuxt.js can be used to create authenticated routes easily. + +## Using Express and Sessions + +To add the sessions feature in our application, we will use `express` and `express-session`, for this, we need to use Nuxt.js programmatically. + +First, we install the depedencies: +```bash +yarn add express express-session body-parser whatwg-fetch +``` + +*We will talk about `whatwg-fetch` later.* + +Then we create our `server.js`: +```js +const Nuxt = require('nuxt') +const bodyParser = require('body-parser') +const session = require('express-session') +const app = require('express')() + +// Body parser, to access req.body +app.use(bodyParser.json()) + +// Sessions to create req.session +app.use(session({ + secret: 'super-secret-key', + resave: false, + saveUninitialized: false, + cookie: { maxAge: 60000 } +})) + +// POST /api/login to log in the user and add him to the req.session.authUser +app.post('/api/login', function (req, res) { + if (req.body.username === 'demo' && req.body.password === 'demo') { + req.session.authUser = { username: 'demo' } + return res.json({ username: 'demo' }) + } + res.status(401).json({ error: 'Bad credentials' }) +}) + +// POST /api/logout to log out the user and remove it from the req.session +app.post('/api/logout', function (req, res) { + delete req.session.authUser + res.json({ ok: true }) +}) + +// We instantiate Nuxt.js with the options +const isProd = process.env.NODE_ENV === 'production' +const nuxt = new Nuxt({ dev: !isProd }) +// No build in production +const promise = (isProd ? Promise.resolve() : nuxt.build()) +promise.then(() => { + app.use(nuxt.render) + app.listen(3000) + console.log('Server is listening on http://localhost:3000') +}) +.catch((error) => { + console.error(error) + process.exit(1) +}) +``` + +And we update our `package.json` scripts: +```json +// ... +"scripts": { + "dev": "node server.js", + "build": "nuxt build", + "start": "NODE_ENV=production node server.js" +} +// ... +``` + +## Using the store + +We need a global state to let our application if the user is connected **across the pages**. + +To let Nuxt.js use Vuex, we create a `store/index.js` file: + +```js +import Vue from 'vue' +import Vuex from 'vuex' + +Vue.use(Vuex) + +// Polyfill for window.fetch() +require('whatwg-fetch') + +const store = new Vuex.Store({ + + state: { + authUser: null + }, + + mutations: { + SET_USER: function (state, user) { + state.authUser = user + } + }, + + actions: { + // ... + } + +}) + +export default store +``` + +1. We import `Vue` and `Vuex` (included in Nuxt.js) and we tell Vue to use Vuex to let us use `$store` in our components +2. We `require('whatwg-fetch')` to polyfill the `fetch()` method across all browsers (see [fetch repo](https://github.com/github/fetch)) +3. We create our `SET_USER` mutation which will set the `state.authUser` to the conntected user +4. We export our store instance to Nuxt.js can inject it to our main application + +### nuxtServerInit() action + +Nuxt.js will call a specific action called `nuxtServerInit` with the context in argument, so when the app will be loaded, the store will be already filled with some data we can get from the server. + +In our `store/index.js`, we can add the `nuxtServerInit` action: +```js +nuxtServerInit ({ commit }, { req }) { + if (req.session && req.session.authUser) { + commit('SET_USER', req.session.authUser) + } +} +``` + +### login() action + +We add a `login` action which will be called from our pages component to log in the user: +```js +login ({ commit }, { username, password }) { + return fetch('/api/login', { + // Send the client cookies to the server + credentials: 'same-origin', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + username, + password + }) + }) + .then((res) => { + if (res.status === 401) { + throw new Error('Bad credentials') + } else { + return res.json() + } + }) + .then((authUser) => { + commit('SET_USER', authUser) + }) +} +``` + +### logout() method + +```js +logout ({ commit }) { + return fetch('/api/logout', { + // Send the client cookies to the server + credentials: 'same-origin', + method: 'POST' + }) + .then(() => { + commit('SET_USER', null) + }) +} +``` + +## Pages components + +Then we can use `$store.state.authUser` in our pages components to check if the user is connected in our application or not. + +### Redirect user if not connected + +Let's add a `/secret` route where only the connected user can see its content: +```html + + + +``` + +We can see in the `fetch` method that we call `redirect('/')` when our user is not connected. diff --git a/ru/examples/cached-components.md b/ru/examples/cached-components.md new file mode 100644 index 000000000..4babc0685 --- /dev/null +++ b/ru/examples/cached-components.md @@ -0,0 +1,27 @@ +--- +title: Cached Components +description: Cached Components example with Nuxt.js +github: cached-components +--- + +## Documentation + +> Nuxt.js use [lru-cache](https://github.com/isaacs/node-lru-cache) to allows cached components for better render performances + +### Usage + +Use the `cache` key in your `nuxt.config.js`: +```js +module.exports = { + cache: true +} +``` + +`cache` can be a Boolean of an Object, if an object, you can use theses keys: + +| key | Optional? | Type | Default | definition | +|------|------------|-----|---------|------------| +| `max` | Optional | Integer | 1000 | The maximum size of the cached components, when the 1001 is added, the first one added will be removed from the cache to let space for the new one. | +| `maxAge` | Optional | Integer | 900000 | Maximum age in ms, default to 15 minutes. | + +Other options: https://github.com/isaacs/node-lru-cache#options diff --git a/ru/examples/custom-loading.md b/ru/examples/custom-loading.md new file mode 100644 index 000000000..5d65d17e9 --- /dev/null +++ b/ru/examples/custom-loading.md @@ -0,0 +1,103 @@ +--- +title: Custom Loading Component +description: Custom Loading Component example with Nuxt.js +github: custom-loading +--- + +## Documentation + +> Nuxt.js uses it's own component to show a progress bar between the routes. You can customize it, disable it or create your own component. + +### Disable Nuxt.js progress bar + +If you don't want to display the progress bar between the routes, just add `loading: false` in your `nuxt.config.js` file: +```js +// nuxt.config.js +module.exports = { + loading: false +} +``` + +### Customize Nuxt.js progress bar + +Here are the properties you can customize for Nuxt.js progress bar. + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| `color` | String | `'black'` | CSS color of the progress bar | +| `failedColor` | String | `'red'` | CSS color of the progress bar when an error appended during rendering the route (if `data` or `fetch` sent back an error for example). | +| `height` | String | `'2px'` | Height of the progress bar (used in the `style` property of the progress bar) | +| `duration` | Number | `5000` | In ms, the maximum duration of the progress bar, Nuxt.js assumes that the route will be rendered before 5 seconds. | + +Example: +```js +// nuxt.config.js +module.exports = { + loading: { + color: 'blue', + height: '5px' + } +} +``` + +### Create a custom loading component + +You can create your own component that Nuxt.js will call instead of its default component. To do so, you need to give a path to your component in the `loading` option. + +Your custom component will be called by Nuxt.js, so make sure your component exposes some of theses methods: + +| Method | Required | Description | +|--------|-------------| +| `start()` | Required | Called when a route changes, this is here where you should show your component. | +| `finish()` | Required | Called when a route is loaded (and data fetched), this is here where you should hide your component. | +| `fail()` | *Optional* | Called when a route could not be loaded (failed to fetch data for example). | +| `increase(num)` | *Optional* | Called during loading the route component, `num` is an Integer < 100. | + + +Example: +```js +// nuxt.config.js +module.exports = { + loading: 'components/loading.vue' +} +``` + +And then, in `components/loading.vue`: +```html + + + + + +``` diff --git a/ru/examples/custom-routes.md b/ru/examples/custom-routes.md new file mode 100644 index 000000000..fc1f53eb7 --- /dev/null +++ b/ru/examples/custom-routes.md @@ -0,0 +1,44 @@ +--- +title: Custom Routes +description: Custom Routes example with Nuxt.js +github: custom-routes +livedemo: https://custom-routes.nuxtjs.org +--- + +## Documentation + +> Nuxt.js is based on vue-router and allows you to defined custom routes :rocket: + +### Usage + +Add your custom routes inside `nuxt.config.js`: +```js +module.exports = { + router: { + routes: [ + { path: '/users/:id', component: 'pages/user' } + ] + } +} +``` + +| key | Optional? | definition | +|------|------------|-----------| +| `path` | **Required** | Route path, it can have dynamic mapping, look at [vue-router documentation](https://router.vuejs.org/en/essentials/dynamic-matching.html) about it. | +| `component` | **Required** | Path to the `.vue` component, if relative, it has to be from the app folder. | +| `name` | Optional | Route name, useful for linking to it with ``, see [vue-router documentation](https://router.vuejs.org/en/essentials/named-routes.html) about it. | +| `meta` | Optional | Let you add custom fields to get back inside your component (available in the context via `route.meta` inside `data` and `fetch` methods). See [vue-router documentation](https://router.vuejs.org/en/advanced/meta.html) about it. | +| `children` | Optional | *Not supported* | + +### Hidden pages + +>If you want don't want nuxt.js to generate a route for a specific page, you just have to **rename it with _ at the beginning**. + +Let's say I have a component `pages/user.vue` and I don't want nuxt.js to create the `/user`. I can rename it to `pages/_user.vue` and voilà! + +You can then change the component path in the `nuxt.config.js`: +```js +// ... + { path: '/users/:id', component: 'pages/_user' } +// ... +``` diff --git a/ru/examples/global-css.md b/ru/examples/global-css.md new file mode 100644 index 000000000..77582e930 --- /dev/null +++ b/ru/examples/global-css.md @@ -0,0 +1,42 @@ +--- +title: Global CSS +description: Global CSS example with Nuxt.js +github: global-css +--- + +## Documentation + +> Nuxt.js let you define the CSS files/modules/libraries you want to set as globals (included in every pages). + +### Usage + +In `nuxt.config.js` file, add the CSS resources: + +```js +const { resolve } = require('path') + +module.exports = { + css: [ + // Load a node.js module + 'hover.css/css/hover-min.css', + // node.js module but we specify the lang + { src: 'bulma', lang: 'sass' }, + // Css file in the project + // It is important to give an absolute path + resolve(__dirname, 'css/main.css') + ] +} +``` + +### Production + +In production, they will be minified and extracted in a file named `styles.css` and added in the `` of the page. + +To launch the demo in production mode so you can see the `` populated with the `` tag: + +```bash +npm run build +npm start +``` + +Go to [http://localhost:3000](http://localhost:3000) and check the source code. diff --git a/ru/examples/hello-world.md b/ru/examples/hello-world.md new file mode 100644 index 000000000..d32fb20e5 --- /dev/null +++ b/ru/examples/hello-world.md @@ -0,0 +1,12 @@ +--- +title: Hello World +description: Hello World example with Nuxt.js +github: hello-world +youtube: https://www.youtube.com/embed/kmf-p-pTi40 +livedemo: https://hello-world.nuxtjs.org +liveedit: https://gomix.com/#!/project/nuxt-hello-world +--- + +## Documentation + +> Documentation is coming soon diff --git a/ru/examples/layouts.md b/ru/examples/layouts.md new file mode 100644 index 000000000..7f97ed47d --- /dev/null +++ b/ru/examples/layouts.md @@ -0,0 +1,9 @@ +--- +title: Layouts +description: Layouts example with Nuxt.js +github: custom-layouts +livedemo: https://nuxt-custom-layouts.gomix.me/ +liveedit: https://gomix.com/#!/project/nuxt-custom-layouts +--- + +[Layouts documentation](/guide/layouts) diff --git a/ru/examples/menu.json b/ru/examples/menu.json new file mode 100644 index 000000000..fa28ecfb2 --- /dev/null +++ b/ru/examples/menu.json @@ -0,0 +1,30 @@ +[ + { + "title": "Essentials", + "links": [ + { "name": "Hello world", "to": "" }, + { "name": "SEO HTML Head", "to": "/seo-html-head" } + ] + }, + { + "title": "Customization", + "links": [ + { "name": "Cached Components", "to": "/cached-components" }, + { "name": "Custom Loading", "to": "/custom-loading" }, + { "name": "Custom Routes", "to": "/custom-routes" }, + { "name": "Global CSS", "to": "/global-css" }, + { "name": "Layouts", "to": "/layouts" }, + { "name": "Plugins", "to": "/plugins" }, + { "name": "Routes transitions", "to": "/routes-transitions" } + ] + }, + { + "title": "Advanced", + "links": [ + { "name": "Async Datas", "to": "/async-datas" }, + { "name": "Auth Routes", "to": "/auth-routes" }, + { "name": "Vuex Store", "to": "/vuex-store" }, + { "name": "Testing", "to": "/testing" } + ] + } +] diff --git a/ru/examples/plugins.md b/ru/examples/plugins.md new file mode 100644 index 000000000..953403598 --- /dev/null +++ b/ru/examples/plugins.md @@ -0,0 +1,73 @@ +--- +title: Plugins +description: Using external modules and plugins with nuxt.js +github: plugins-vendor +--- + +## Documentation + +### Configuration: `build.vendor` + +> Nuxt.js allows you to add modules inside the `vendor.bundle.js` file generated to reduce the size of the app bundle. It's really useful when using external modules (like `axios` for example) + +To add a module/file inside the vendor bundle, add the `build.vendor` key inside `nuxt.config.js`: +```js +const { join } = require('path') + +module.exports = { + build: { + vendor: [ + 'axios', // node module + join(__dirname, './js/my-library.js') // custom file + ] + } +} +``` + +### Configuration: `plugins` + +> Nuxt.js allows you to define js plugins to be ran before instantiating the root vue.js application + +I want to use [vue-notifications](https://github.com/se-panfilov/vue-notifications) to validate the data in my inputs, I need to setup the plugin before launching the app. + +File `plugins/vue-notifications.js`: +```js +import Vue from 'vue' +import VueNotifications from 'vue-notifications' + +Vue.use(VueNotifications) +``` + +Then, I add my file inside the `plugins` key of `nuxt.config.js`: +```js +const { join } = require('path') + +module.exports = { + build: { + vendor: ['vue-notifications'] + }, + plugins: [ '~plugins/vue-notifications') ] +} +``` + +I use `~plugins` here because nuxt.js create an alias for the `plugins/` folder, it's equivalent to: `join(__dirname, './plugins/vue-notifications.js')` + +I added `vue-notifications` in the `vendor` key to make sure that it won't be included in any other build if I call `require('vue-notifications')` in a component. + +#### Only in browser build + +Some plugins might work only in the browser, for this, you can use the `process.BROWSER_BUILD` variable to check if the plugin will run from the server or from the client. + +Example: +```js +import Vue from 'vue' +import VueNotifications from 'vue-notifications' + +if (process.BROWSER_BUILD) { + Vue.use(VueNotifications) +} +``` + +#### Only in server build + +In case you need to require some libraries only for the server, you can use the `process.SERVER_BUILD` variable set to `true` when webpack is creating the `server.bundle.js` file. diff --git a/ru/examples/routes-transitions.md b/ru/examples/routes-transitions.md new file mode 100644 index 000000000..ad9877aba --- /dev/null +++ b/ru/examples/routes-transitions.md @@ -0,0 +1,111 @@ +--- +title: Routes transitions +description: Routes transitions example with Nuxt.js +github: routes-transitions +youtube: https://www.youtube.com/embed/RIXOzJWFfc8 +--- + +## Documentation + +> Nuxt.js uses the [``](http://vuejs.org/v2/guide/transitions.html#Transitioning-Single-Elements-Components) component to allow you to create amazing transitions between your routes. + +### Usage + +The default transition name Nuxt.js uses is `page`. + +To add a fade transition to every page of your application, we need a CSS file that is shared across all our routes, so we start by creating a file in the `assets/` folder. + +`assets/main.css`: +```css +.page-enter-active, .page-leave-active { + transition: opacity .5s +} +.page-enter, .page-leave-active { + opacity: 0 +} +``` + +We add it in our `nuxt.config.js` file: +```js +module.exports = { + css: [ + 'assets/main.css' + ] +} +``` + +And voilà! A nice fade animation will be shown between every routes. + +### The `transition` key + +You can update the defaults transition settings by adding the `transition` key in you `nuxt.config.js` file. + +```js +module.exports = { + transition: 'test' + // or + transition: { + name: 'test', + mode: 'out-in' + } +} +``` + +Nuxt.js will use these settings to set the component as follows: +```html + +``` + +To learn more about the Vue.js `` component: http://vuejs.org/v2/guide/transitions.html + +The following properties that the `transition` key can have: + +| key | Default | definition | +|------|------------|-----------| +| `name` | `page` | The transition name applied on all the routes transitions. | +| `mode` | `out-in` | The transition mode applied on all routes, see [Vue.js documentation](http://vuejs.org/v2/guide/transitions.html#Transition-Modes). | + +*Note: if the `transition` key is set as a string, it will be used as the `transition.name`.* + +### Custom transition on a specific route + +To define a custom transition for a specific route, simply add the `transition` key to the page component: + +`pages/about.vue`: +```html + + + +``` + +And then we add the CSS animation for this custom transition: +```css +/* assets/main.css */ +.bounce-enter-active { + animation: bounce-in .8s; +} +.bounce-leave-active { + animation: bounce-out .5s; +} +@keyframes bounce-in { + 0% { transform: scale(0) } + 50% { transform: scale(1.5) } + 100% { transform: scale(1) } +} +@keyframes bounce-out { + 0% { transform: scale(1) } + 50% { transform: scale(1.5) } + 100% { transform: scale(0) } +} +``` + +*Note: you can also the set `transition` key as an object in page components* diff --git a/ru/examples/seo-html-head.md b/ru/examples/seo-html-head.md new file mode 100644 index 000000000..2737259c6 --- /dev/null +++ b/ru/examples/seo-html-head.md @@ -0,0 +1,82 @@ +--- +title: SEO HTML Head +description: SEO HTML Head example with Nuxt.js +github: head-elements +--- + +## Documentation + +Nuxt.js uses [`vue-meta`](https://github.com/declandewet/vue-meta) to update the `headers` and `html attributes` of your applications. + +Nuxt.js configures `vue-meta` with these options: +```js +{ + keyName: 'head', // the component option name that vue-meta looks for meta info on. + attribute: 'n-head', // the attribute name vue-meta adds to the tags it observes + ssrAttribute: 'n-head-ssr', // the attribute name that lets vue-meta know that meta info has already been server-rendered + tagIDKeyName: 'hid' // the property name that vue-meta uses to determine whether to overwrite or append a tag +} +``` + +### Updating the title + +To update the title of the page, just add `head.title` in your page component. + +`pages/index.vue` +```html + + + +``` + +### Meta tags and more + +To know the list of options you can give to `head`, take a look at [`vue-meta` documentation](https://github.com/declandewet/vue-meta#recognized-metainfo-properties). + +### Using `data` values inside `head` + +You might want to use the component data to display different headers, like a post title for example. Just use `head` as a function and you can use `this` inside to access your component data. + +Example of displaying the post title: +```html + +``` + +### Defaults metas + +Nuxt.js let you define all the defaults metas for your application inside the `nuxt.config.js`, use the same field `head`: +```js +module.exports = { + head: { + titleTemplate: '%s - Nuxt.js', + meta: [ + { charset: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { hid: 'description', name: 'description', content: 'Meta description' } + ] + } +} +``` diff --git a/ru/examples/testing.md b/ru/examples/testing.md new file mode 100644 index 000000000..e9cf8757f --- /dev/null +++ b/ru/examples/testing.md @@ -0,0 +1,26 @@ +--- +title: Testing +description: Testing example with Nuxt.js +github: with-ava +--- + +## Documentation + +[`ava`](https://github.com/avajs/ava) is a powerful JavaScript testing framework, mixed with [`jsdom`](https://github.com/tmpvar/jsdom), we can use them to do end-to-end testing easily for `nuxt` applications. + +```bash +npm install --save-dev ava jsdom +``` + +Add test script to the `package.json` + +__package.json__ + +```javascript +// ... +"scripts": { + "test": "ava", +} +// ... + +``` diff --git a/ru/examples/vuex-store.md b/ru/examples/vuex-store.md new file mode 100644 index 000000000..49445cc9f --- /dev/null +++ b/ru/examples/vuex-store.md @@ -0,0 +1,89 @@ +--- +title: Vuex Store +description: Vuex Store example with Nuxt.js +github: vuex-store +--- + +## Documentation + +> Using a store to manage the state is important to every big application, that's why nuxt.js implement Vuex in its core. + +### Activating the store + +Nuxt.js will try to `require('./store/index.js')`, if exists, it will import `Vuex`, add it to the vendors and add the `store` option to the root `Vue` instance. + +### Create the store folder + +Let's create a file `store/index.js`: + +```js +import Vue from 'vue' +import Vuex from 'vuex' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + state: { + counter: 0 + }, + mutations: { + increment (state) { + state.counter++ + } + } +}) + +export default store +``` + +> We don't need to install `Vuex` since it's shipped with nuxt.js + +### Voilà ! + +We can now use `this.$store` inside our `.vue` files. + +```html + +``` + +### fetch (context) + +> Used to fill the store before rendering the page + +The `fetch` method, *if set*, is called every time before loading the component (*only if attached to a route*). It can be called from the server-side or before navigating to the corresponding route. + +The `fetch` method receives the context as the first argument, we can use it to fetch some data and fill the store. To make the fetch method asynchronous, **return a Promise**, nuxt.js will wait for the promise to be resolved before rendering the Component. + +For example: +```js +export default { + fetch ({ store, params }) { + return axios.get('http://my-url') + .then((res) => { + store.commit('setUser', res.data) + }) + } +} +``` + +### Context + +To see the list of available keys in `context`, take a look at [this example](examples/async-datas). + +### Action `nuxtServerInit` + +If we define the action `nuxtServerInit` in our store, Nuxt.js will call it with the context. It can be useful when having some data on the server we want to give directly to the client-side, for example, the authenticated user: +```js +// store/index.js +actions: { + nuxtServerInit ({ commit }, { req }) { + if (req.authUser) { + commit('user', req.authUser) + } + } +} +``` + +The context given to `nuxtServerInit` is the same as the `data` of `fetch` method except `context.redirect()` and `context.error()` are omitted. diff --git a/ru/faq/heroku-deployment.md b/ru/faq/heroku-deployment.md new file mode 100644 index 000000000..9aece69b0 --- /dev/null +++ b/ru/faq/heroku-deployment.md @@ -0,0 +1,40 @@ +--- +title: Развёртывание с Heroku +description: Как развернуть Nuxt на Heroku? +--- + +# Развёртывание с Heroku + +Мы рекомендуем прочитать [документацию Heroku для node.js](https://devcenter.heroku.com/articles/nodejs-support). + +Сперва вам нужно сказать Heroku установить `devDependencies` проекта (чтобы иметь возможность запускать `npm run build`): +```bash +heroku config:set NPM_CONFIG_PRODUCTION=false +``` + +Кроме того, хотелось бы чтобы наше приложение было запущено в production-режиме и слушало хост `0.0.0.0`: +```bash +heroku config:set HOST=0.0.0.0 +heroku config:set NODE_ENV=production +``` + +В панели управления (Dashboard) Heroku (в секции Settings) в увидите что-то вроде этого: + +![nuxt config vars Heroku](https://i.imgur.com/EEKl6aS.png) + +Затем мы говорим Heroku запустить `npm run build` через скрипт `heroku-postbuild` в нашем `package.json`: +```js +"scripts": { + "dev": "nuxt", + "build": "nuxt build", + "start": "nuxt start", + "heroku-postbuild": "npm run build" +} +``` + +Наконец, мы можем добавить приложение в Heroku: +```bash +git push heroku master +``` + +Voilà! Ваше nuxt.js-приложение размещено на Heroku! \ No newline at end of file diff --git a/ru/faq/index.md b/ru/faq/index.md new file mode 100644 index 000000000..64d5fd5ee --- /dev/null +++ b/ru/faq/index.md @@ -0,0 +1,46 @@ +--- +title: Внешние ресурсы +description: Как использовать внешние ресурсы с Nuxt.js? +--- + +# Как использовать внешние ресурсы? + +## Глобальные настройки + +Включите ваши ресурсы в файле nuxt.config.js: + +```js +module.exports = { + head: { + script: [ + { src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js' } + ], + link: [ + { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' } + ] + } +} +``` + +## Локальные настройки + +Включите ваши ресурсы в файле .vue в каталоге pages: + +```html + + + +``` diff --git a/ru/faq/menu.json b/ru/faq/menu.json new file mode 100644 index 000000000..2c0780dfb --- /dev/null +++ b/ru/faq/menu.json @@ -0,0 +1,10 @@ +[ + { + "title": "Часто Задаваемые Вопросы", + "links": [ + { "name": "Как использовать внешние ресурсы?", "to": "" }, + { "name": "Как добавить плагины PostCSS?", "to": "/postcss-plugins" }, + { "name": "Как развернуться на Heroku?", "to": "/heroku-deployment" } + ] + } +] diff --git a/ru/faq/postcss-plugins.md b/ru/faq/postcss-plugins.md new file mode 100644 index 000000000..bf048e9d3 --- /dev/null +++ b/ru/faq/postcss-plugins.md @@ -0,0 +1,20 @@ +--- +title: Плагины Postcss +description: Как добавить плагины Postcss? +--- + +# Как добавить плагины Postcss? + +В вашем файле конфигурации nuxt.config.js укажите: + +```js +module.exports = { + build: { + postcss: [ + require('postcss-nested')(), + require('postcss-responsive-type')(), + require('postcss-hexrgba')(), + ] + } +} +``` diff --git a/ru/guide/assets.md b/ru/guide/assets.md new file mode 100644 index 000000000..b3ec9d6f0 --- /dev/null +++ b/ru/guide/assets.md @@ -0,0 +1,78 @@ +--- +title: Файлы исходного кода +description: По-умолчанию, Nuxt.js использует vue-loader, file-loader и url-loader для Webpack'а, чтобы обрабатывать файлы с исходным кодом. +--- + +> По-умолчанию, Nuxt.js использует vue-loader, file-loader и url-loader для Webpack'а, чтобы обрабатывать файлы с исходным кодом. + +По-умолчанию, [vue-loader](http://vue-loader.vuejs.org/en/) автоматически обрабатывает файлы стилей и шаблонов совместно с `css-loader` и компилятором шаблонов Vue. В этом процессе все URL файлов, такие как ``, `background: url(...)` и CSS `@import`, трактуются как модульные зависимости. + +Например, у нас следующая структура файлов: + +```bash +-| assets/ +----| image.png +-| pages/ +----| index.vue +``` + +Если в CSS мы используем `url('~assets/image.png')`, то эта строчка будет преобразована в `require('~assets/image.png')`. + +Если код страницы `pages/index.vue` следующий: +```html + +``` + +То он будет преобразован к виду: + +```js +createElement('img', { attrs: { src: require('~assets/image.png') }}) +``` + +Из-за того, что `.png` — не JavaScript-файл, то Nuxt.js конфигурирует Webpack таким образом, чтобы [file-loader](https://github.com/webpack/file-loader) и [url-loader](https://github.com/webpack/url-loader) сделали преобразования вместо вас. + +Это даёт нам следующие плюшки: +- `file-loader` позволяет указать, куда копировать файлс с исходным кодом и как его назвать с использованием хеша для правильного кеширования. +- `url-loader` позволяет (по условию) сконвертировать и включить содержимое файла в формате base-64 в случае, если его размер не превосходит допустимый размер. Подоный подход уменьшает количество HTTP-запросов при наличие обычных файлов. Если размер файла больше допустимого размера, процесс автоматически переходит к `file-loader`. + +Конфигурация Nuxt.js по-умолчанию следующая: + +```js +[ + { + test: /\.(png|jpe?g|gif|svg)$/, + loader: 'url-loader', + query: { + limit: 1000, // 1 KO + name: 'img/[name].[hash:7].[ext]' + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + query: { + limit: 1000, // 1 KO + name: 'fonts/[name].[hash:7].[ext]' + } + } +] +``` + +Такая конфигурация означает, что каждый файл с размером, меньшим 1 KO, будет преобразован в формат base-64 и подставлен вместо URL. В противном случае, изображение/шрифт будут скопированы в соответствующую под-папку папки `.nuxt` и переименованы с использованием хеша, содержащего версию файла для правильного кеширования. + +При запуске приложения с помощью `nuxt`, шаблон `pages/index.vue`: + +```html + +``` + +Будет преобразован в: +```html + +``` + +Если вы хотите обновить эти загрузчики или отключить их, пожалуйста, обратитесь к [конфигурации загрузчиков](/api/configuration-build). diff --git a/ru/guide/async-data.md b/ru/guide/async-data.md new file mode 100644 index 000000000..6460ba981 --- /dev/null +++ b/ru/guide/async-data.md @@ -0,0 +1,114 @@ +--- +title: Асинхронные данные +description: Nuxt.js перехватывает метод data от vue.js, чтобы позволить обрабатать асинхронные задачи прежде, чем установить data. +--- + +>Nuxt.js *перехватывает* метод 'data' от vue.js, чтобы позволить обрабатывать асинхронные задачи прежде, чем установить data + +## Метод `data` + +`data` будет вызван каждый раз прежде, чем загрузить компонент (**только для компонентов страниц (pages)**). Это будет вызвано со стороны сервера или перед тем, как переместиться к соответствующему маршруту. Этот метод получает [контекст](/api/pages-context) как первый параметр, Вы можете использовать его, чтобы выбрать некоторые данные и возвратить составляющие данные. + +
**НЕЛЬЗЯ** получить доступ к полноценному контексту `this` внутри `data` потому что это вызывается **перед инициализацией** текущего компонента, т.е в самом начале.
+ +Чтобы сделать метод `data` асинхронным, nuxt.js предлагает Вам различные пути, выберите тот, который более знаком: + +1. Вернуть `Promise`, nuxt.js будет ожидать обещания, которое будет resolved (разрешено) прежде, чем отобразить компонент. +2. Использовать [async/await](https://github.com/lukehoban/ecmascript-asyncawait) ([Подробности](https://zeit.co/blog/async-and-await)) +3. Указать колбэк как второй параметр. Колбэк будет вызван как: `callback(err, data)` + +### Вернуть Promise +```js +export default { + data ({ params }) { + return axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + return { title: res.data.title } + }) + } +} +``` + +### Используя async/await +```js +export default { + async data ({ params }) { + let { data } = await axios.get(`https://my-api/posts/${params.id}`) + return { title: data.title } + } +} +``` + +### Используя callback +```js +export default { + data ({ params }, callback) { + axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + callback(null, { title: res.data.title }) + }) + } +} +``` + +### Возврат объекта + +Если не надо делать никакого асинхронного вызова, то можно просто возвратить объект: + +```js +export default { + data (context) { + return { foo: 'bar' } + } +} +``` + +### Отображение данных + +Когда метод `data` установлен, можно отобразить данные внутри вашего шаблона также как и раньше: + +```html + +``` + +## Контекст + +Для просмотра списка доступных ключей в 'контексте', смотрите на [API контекста страниц](/api/pages-context). + +## Обработка ошибок + +Nuxt.js добавит `error(params)` метод в `контекст`, и Вы сможете отобразить ошибки на странице. Также `params.statusCode` будет использован сервером чтобы указать реальный статус в заголовках ответа + +Пример с `Promise`: +```js +export default { + data ({ params, error }) { + return axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + return { title: res.data.title } + }) + .catch((e) => { + error({ statusCode: 404, message: 'Post not found' }) + }) + } +} +``` + +Если Вы используете параметр 'callback', Вы можете вызвать его непосредственно с нужной ошибкой, и тогда nuxt.js вызовет 'ошибочный' метод: +```js +export default { + data ({ params }, callback) { + axios.get(`https://my-api/posts/${params.id}`) + .then((res) => { + callback(null, { title: res.data.title }) + }) + .catch((e) => { + callback({ statusCode: 404, message: 'Post not found' }) + }) + } +} +``` + +Чтобы настроить ошибочную страницу, смотрите на [раздел Layout](/guide/layouts#error-page). diff --git a/ru/guide/basic-routes.md b/ru/guide/basic-routes.md new file mode 100644 index 000000000..184b2c853 --- /dev/null +++ b/ru/guide/basic-routes.md @@ -0,0 +1,40 @@ +--- +title: Основы маршрутизации +description: Nuxt.js использует файловую систему для генерации маршрутов веб-приложения, это также просто как в PHP. +--- + +Nuxt.js автоматически генерирует конфигурацию [vue-router](https://github.com/vuejs/vue-router) согласно структуре файлов и каталогов в директории `pages` + +Структура файлов: + +```bash +pages/ +--| team/ +-----| index.vue +-----| about.vue +--| index.vue +``` + +автоматически сгенерирует: + +```js +router: { + routes: [ + { + name: 'index', + path: '/', + component: 'pages/index.vue' + }, + { + name: 'team', + path: '/team', + component: 'pages/team/index.vue' + }, + { + name: 'team-about', + path: '/team/about', + component: 'pages/team/about.vue' + } + ] +} +``` diff --git a/ru/guide/commands.md b/ru/guide/commands.md new file mode 100644 index 000000000..db5ff5cf2 --- /dev/null +++ b/ru/guide/commands.md @@ -0,0 +1,87 @@ +--- +title: Команды +description: Nuxt.js поставляется с набором полезных команд как для разрабатываемого, так и для финального продукта. +--- + +> Nuxt.js поставляется с набором полезных команд как для разрабатываемого, так и для финального продукта. + +## Список команд + +| Команда | Описание | +|---------|-------------| +| nuxt | Запустить сервер разработки [localhost:3000](http://localhost:3000) с горячей заменой модулей (hot-reloading). | +| nuxt build | Собрать приложение webpack'ом и минифицировать JS & CSS (для продакшн-версии). | +| nuxt start | Запустить сервер в продакшн-режиме (сперва необходимо запустить `nuxt build`). | +| nuxt generate | Собрать приложение и сгенерировать каждый маршрут в виде HTML файла (используется в случае статического хостинга). | + + +Вы должны добавить эти команды в файл `package.json`: + +```json +"scripts": { + "dev": "nuxt", + "build": "nuxt build", + "start": "nuxt start", + "generate" "nuxt generate" +} +``` + +Затем вы можете запускать команды с помощью `npm run ` (например: `npm run dev`). + +## Продуктовая выкладка + +Вероятно, вы захотите избежать запуска Nuxt при развёртывании на сервере. Для этого команды сборки и запуска приложения выполняются раздельно друг от друга: + +```bash +nuxt build +nuxt start +``` + +Например, чтобы развернуть на [now.sh](https://zeit.co/now), рекомендуется следующий вид `package.json`: +```json +{ + "name": "my-app", + "dependencies": { + "nuxt": "latest" + }, + "scripts": { + "dev": "nuxt", + "build": "nuxt build", + "start": "nuxt start" + } +} +``` + +Затем запустите `now` и наслаждайтесь! + +Заметка: рекомендуем добавить `.nuxt` в `.npmignore` или `.gitignore`. + + +## Развёртывание на статическом хостинге + +Nuxt.js даёт вам возможность хостить веб-приложение на любом статическом хостинге. Например, [surge.sh](https://surge.sh/). + +Чтобы развернуть на сервисе surge.sh, сперва нужно установить его: +```bash +npm install -g surge +``` + +Затем мы говорим nuxt.js сгенерировать веб-приложение: + +```bash +npm run generate +``` + +Будет создана папка `dist` со всем необходимым и готовым к выкладке на статический хостинг. + +Теперь мы можем выложить приложение на surge.sh: + +```bash +surge dist/ +``` + +Вуаля :) + +Если у вас есть проект с [динамическими маршрутами](/guide/dynamic-routes), взгляните на [генерацию конфигурации](/api/configuration-generate), чтобы указать Nuxt.js, как генерировать эти динамические маршруты. + +
В случае генерации веб-приложения через `nuxt generate`, [контекст](/api/pages-context), определённый для [data()](/guide/async-data#the-data-method) и [fetch()](/guide/vuex-store#the-fetch-method), не будет содержать `req` и `res`.
diff --git a/ru/guide/configuration.md b/ru/guide/configuration.md new file mode 100644 index 000000000..e19084457 --- /dev/null +++ b/ru/guide/configuration.md @@ -0,0 +1,61 @@ +--- +title: Конфигурация +description: Поставляемая по-умолчанию конфигурация Nuxt.js покрывает большую часть потребностей. Однако, файл настроек nuxt.config.js даёт возможность изменить её. +--- + +> Поставляемая по-умолчанию конфигурация Nuxt.js покрывает большую часть потребностей. Однако, файл настроек `nuxt.config.js` даёт возможность изменить её. + +### build + +Опция позволяет добавлять модули в генерируемый файл `vendor.bundle.js`, чтобы уменьшить размер финального приложения. Это действительно удобно при использовании внешних модулей. + +[Документация по build](/api/configuration-build) + +### cache + +Опция позволяет включить кешируемые компоненты для улучшения быстродействия. + +[Документация по cache](/api/configuration-cache) + +### css + +Опция позволяет определить файлы CSS/модули/библиотеки, которые вы хотите установить в качестве глобальных (подключенных к каждой странице). + +[Документация по css](/api/configuration-css) + +### env + +Опция позволяет определить переменные окружения для обоих клиентской и серверной сторон. + +[Документация по env](/api/configuration-env) + +### generate + +Опция позволяет определить значения параметров для всех динамических маршрутов в вашем приложении, которые Nuxt.js трансформирует в HTML-файлы. + +[Документация по generate](/api/configuration-generate) + +### head + +Опция позволяет определить все мета-значения по-умолчанию в вашем приложении. + +[Документация по integration](/api/configuration-head) + +### loading + +Опция позволяет настроить компонент индикатора загрузки, который используется по-умолчанию в Nuxt.js при переходе между маршрутами. + +[Документация по loading](/api/configuration-loading) + +### plugins + +Опция позволяет указать JavaScript-плагины, которые вы хотите запустить перед +созданием экземпляра корневого приложения vue.js. + +[Документация по plugins](/api/configuration-plugins) + +### router + +Опция позволяет переписать конфигурацию vue-маршрутизатора, поставляемую по-умолчанию в Nuxt.js. + +[Документация по router](/api/configuration-router) diff --git a/ru/guide/contribution-guide.md b/ru/guide/contribution-guide.md new file mode 100644 index 000000000..f0e3bd734 --- /dev/null +++ b/ru/guide/contribution-guide.md @@ -0,0 +1,19 @@ +--- +title: Помощь в разработке +description: Мы ценим любую помощь в разработке Nuxt.js! +--- + +> Мы ценим любую помощь в разработке Nuxt.js! + +## Отчёт о проблемах + +Неоценимая помощь при разработке проекта — отправка детализированных отчётов о возникаемых ошибках. Вы всегда рады получать грамотно написанные отчёты и очень благодарны за это! Перед тем, как отправить отчёт, пожалуйста, прочитайте внимательно документацию и постарайтесь найти ответ на возникшую проблему в существующем списке https://github.com/nuxt/nuxt.js/issues. + +## Пулл-реквесты + +Мы бы очень хотели получать пулл-реквесты от вас, даже если это небольшая правка какой-либо опечатки. Любые более значимые запросы на улучшение должны быть внесены [в список запросов GitHub](https://github.com/nuxt/nuxt.js/issues), чтобы над ними началась работа. + +### Соглашения + +- Для фикса: ветка должна быть названа в виде `fix-XXX`, где XXX — номер существующего запроса в списке, или название того, что именно фикс делает. +- Для нового функционала: ветка должна быть названа в виде `feature-XXX`, где XXX — номер существующего запроса из списка. diff --git a/ru/guide/custom-loading.md b/ru/guide/custom-loading.md new file mode 100644 index 000000000..fa52a543d --- /dev/null +++ b/ru/guide/custom-loading.md @@ -0,0 +1,99 @@ +--- +title: Индикатор загрузки +description: Nuxt.js использует свой компонент для отображения прогресса загрузки для переходов между маршрутами. Вы можете изменить его, отключить или создать собственный. +--- + +> Nuxt.js использует свой компонент для отображения прогресса загрузки для переходов между маршрутами. Вы можете изменить его, отключить или создать собственный. + +## Отключение индикатора загрузки + +Если вы не хотите отображать индикатор загрузки в переходах между маршрутами, просто установите `loading: false` в файле `nuxt.config.js`: + +```js +module.exports = { + loading: false +} +``` + +## Изменение индикатора загрузки + +Список параметров для изменения индикатора загрузки. + +| Ключ | Тип | По-умолчанию | Описание | +|-----|------|---------|-------------| +| `color` | String | `'black'` | CSS-цвет индикатора загрузки | +| `failedColor` | String | `'red'` | CSS-цвет индикатора загрузки в случае возникновения ошибки при рендеринге маршрута (например, если методы `data` или `fetch` вернули ошибку). | +| `height` | String | `'2px'` | Высота индикатора загрузки (используется в свойстве `style` индикатора) | +| `duration` | Number | `5000` | В мс, максимальная продолжительность работы индикатора. Nuxt.js предполагает, что маршрут будет отрендерен в течение 5 сек. | + +Для создания синего индикатора загрузки высотой 5 пикселей, измените `nuxt.config.js` следующим образом: + +```js +module.exports = { + loading: { + color: 'blue', + height: '5px' + } +} +``` + +## Создание собственного индикатора + +Вы можете создать собственный компонент, который Nuxt.js будет отображать вместо своего. Для этого просто укажите путь к компоненту в параметре `loading`. + +**Ваш собственный компонент должен содержать некоторые из следующих методов:** + +| Метод | Обязательный | Описание | +|--------|----------|-------------| +| `start()` | Да | Вызывается при изменении текущего маршрута, чтобы отобразить индикатор. | +| `finish()` | Да | Вызывается, когда маршрут и его данные загружены, чтобы скрыть индикатор. | +| `fail()` | *Нет* | Вызывается, когда маршрут не может быть загружен (например, ошибка загрузки данных). | +| `increase(num)` | *Нет* | Вызывается во время загрузки компонента маршрута, `num` — число < 100. | + +Мы можем создать собственный индикатор в `components/loading.vue`: +```html + + + + + +``` + +Затем указываем в `nuxt.config.js` параметр `loading`: + +```js +module.exports = { + loading: 'components/loading.vue' +} +``` diff --git a/ru/guide/directory-structure.md b/ru/guide/directory-structure.md new file mode 100644 index 000000000..ac7404c74 --- /dev/null +++ b/ru/guide/directory-structure.md @@ -0,0 +1,89 @@ +--- +title: Структура каталогов +description: Структура каталогов приложения Nuxt.js по умолчанию содержит все необходимое для максимально удобного начала разработки как больших так и маленьких приложений +--- + +> Структура каталогов приложения Nuxt.js по умолчанию содержит все необходимое для максимально удобного начала разработки как больших так и маленьких приложений. Однако, вы также можете и изменить её под свои нужды. + +## Каталоги + +### Каталог `assets` + +Каталог `assets` содержит нескомпилированные файлы с исходным кодом, такие как LESS, SASS, или JavaScript. + +[Больше документации о Assets](/guide/assets) + +### Каталог `components` + +Каталог `components` содержит Ваши Vue.js компоненты. Nuxt.js не подгружает метод `data` на этих компонентах. (от переводчика: Речь об [асинхронной подгрузке `data`](/guide/async-data)) + +### Каталог `layouts` + +Каталог `layouts` содержит в себе шаблоны приложения + +_Этот каталог не может быть переименован._ + +[Больше документации о Layouts](/guide/layouts) + +### Каталог `middleware` + +_Скоро будет_ + +### Каталог `pages` + +Папка `pages` содержит представления (views) и маршруты (routes). Фреймворк считывает все файлы `.vue` внутри папки и создает маршрутизатор для вашего приложения. + +_Этот каталог не может быть переименован._ + +[Подробнее о страницах](/guide/pages) + +### Каталог `plugins` + +Каталог `plugins` содержит javascript-плагины, запускаемые перед созданием экземпляра корневого приложения vue.js. + +[Подробнее о плагинах](/guide/plugins) + +### Каталог `static` + +Каталог `static` содержит Ваши статические файлы. Каждый файл в этом каталоге доступен через `/`. + +**Пример:** /static/robots.txt будет доступен как /robots.txt + +_Этот каталог не может быть переименован._ + +[Подробнее о статике](/guide/static) + +### Каталог `store` + +Каталог `store` может содержать файлы [Vuex хранилища](http://vuex.vuejs.org). Vuex хранилище является опциональным в Nuxt.js. Для того что-бы использовать его, создайте файл `index.js` в этом каталоге, и Vuex будет активирован фреймворком автоматически. + +_Этот каталог не может быть переименован._ + +[Подробнее о работе с хранилищем](/guide/vuex-store) + + +### Файл nuxt.config.js + +Файл `nuxt.config.js` содержит пользовательскую конфигурацию Nuxt.js. + +_Этот файл не может быть переименован._ + +[Подробнее о nuxt.config.js](/guide/configuration) + +### Файл package.json + +Файл `package.json` содержит список зависимостей и команды для вашего приложения. + +_Этот файл не может быть переименован._ + +## Псевдонимы + +| Псевдоним | Каталог | +|-----|------| +| ~ | / | +| ~assets | /assets | +| ~components | /components | +| ~pages | /pages | +| ~plugins | /plugins | +| ~static | /static | +| ~store | /store | diff --git a/ru/guide/dynamic-routes.md b/ru/guide/dynamic-routes.md new file mode 100644 index 000000000..479e4a82c --- /dev/null +++ b/ru/guide/dynamic-routes.md @@ -0,0 +1,59 @@ +--- +title: Динамическая маршрутизация +description: Чтобы объявить динамический маршрут с параметром (param) в Nuxt.js, необходимо создать Vue файл с префиксом "_" +--- + +> Чтобы объявить динамический маршрут с param, Вы должны определить файл Vue **с префиксом нижнее подчеркивание**. + +## Структура директорий + +Структура файлов: + +```bash +pages/ +--| users/ +-----| _id.vue +-----| index.vue +``` + +автоматически сгенерирует: + +```js +router: { + routes: [ + { + name: 'users', + path: '/users', + component: 'pages/users/index.vue' + }, + { + name: 'users-id', + path: '/users/:id', + component: 'pages/users/_id.vue' + } + ] +} +``` + +## Валидация параметров пути + +```js +validate({ params, query }) { + return true // если этот параметр валиден + return false // остановит Nuxt.js, чтобы отобразить маршрут и вывести на экран страницу ошибки +} +``` + +Nuxt.js позволяет Вам определять метод проверки валидности в своем динамическом компоненте пути (В этом примере: `pages/users/_id.vue`). +Если метод валидации не возвратит `true`, Nuxt.js автоматически отобразит страницу с ошибкой 404. + +```js + +``` diff --git a/ru/guide/eslint.md b/ru/guide/eslint.md new file mode 100644 index 000000000..b6669906f --- /dev/null +++ b/ru/guide/eslint.md @@ -0,0 +1,8 @@ +--- +title: ESLint +description: Nuxt.js интегрируется с ESLint, чтобы с лёгкостью поддерживать наилучшее качество кода веб-приложения. +--- + +> Nuxt.js интегрируется с ESLint, чтобы с лёгкостью поддерживать наилучшее качество кода веб-приложения. + +*Документация скоро будет* diff --git a/ru/guide/html-head.md b/ru/guide/html-head.md new file mode 100644 index 000000000..42dd0addf --- /dev/null +++ b/ru/guide/html-head.md @@ -0,0 +1,93 @@ +--- +title: HTML Мета теги +description: Nuxt.js использует vue-meta для обновления содержимого headers и html атрибутов приложения. +--- + +Nuxt.js использует [vue-meta](https://github.com/declandewet/vue-meta) для обновления содержимого headers и html атрибутов приложения. + +Nuxt.js конфигурирует `vue-meta` с такими опциями: +```js +{ + keyName: 'head', // имя опции указанное в компоненте, в котором vue-meta ищет meta информацию. + attribute: 'n-head', // название атрибута vue-meta добавляемое к тегам, за которыми он наблюдает + ssrAttribute: 'n-head-ssr', // название атрибута, которое позволяет vue-meta понимать, что meta информация уже была представлена сервером + tagIDKeyName: 'hid' // имя свойства, на основе которого vue-meta определит, перезаписать или добавить тег (Аналог id) +} +``` + +## Заголовок (title) + +Чтобы обновить заголовок страницы, просто добавьте 'head.title' в своем компоненте страницы. + +Установим название страницы 'pages/index.vue': + +```html + + + +``` + +## Мета теги + +Чтобы понять весь список опций кдоступных для `head` прочтите [vue-meta документацию](https://github.com/declandewet/vue-meta#recognized-metainfo-properties). + +К примеру установим свой viewport и шрифт из Google font: +```js +head: { + meta: [ + { charset: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' } + ], + link: [ + { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' } + ] +} +``` + +## Используя `data` компонента + +Можно использовать `data` компонента, чтобы выводить на экран различные динамические заголовки, например такой как заголовок статьи. Просто используйте 'head' как функцию, и Вы можете использовать 'this' внутри этой функции чтобы получить доступ к `data`. + +Пример вывода заголовка статьи: +```html + +``` + +## Meta - базовые значения +Nuxt.js позволяет определить базовое значение meta для всего приложения в 'nuxt.config.js', используя свойство 'head': + +```js +module.exports = { + head: { + titleTemplate: '%s - Nuxt.js', + meta: [ + { charset: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { hid: 'description', name: 'description', content: 'Мета описание' } + ] + } +} +``` + +

Чтобы избежать любого дублирования, в дочернем компоненте, дайте уникальный идентификатор со 'скрытым' ключом, [читать побробнее](https://github.com/declandewet/vue-meta#lists-of-tags).

diff --git a/ru/guide/index.md b/ru/guide/index.md new file mode 100644 index 000000000..87b5cee8d --- /dev/null +++ b/ru/guide/index.md @@ -0,0 +1,97 @@ +--- +title: Введение +description: "25 октября 2016 команда zeit.co анонсировала Next.js — фреймворк для приложений на React с серверным рендерингом. Через несколько часов после этого объявления родился Nuxt.js — воплощение аналогичной идеи для Vue.js." +--- + +> 25 октября 2016 команда [zeit.co](https://zeit.co/) анонсировала [Next.js](https://zeit.co/blog/next), фреймворк для приложений на React с серверным рендерингом. Через несколько часов после этого объявления родился **Nuxt.js** — воплощение аналогичной идеи для [Vue.js](https://vuejs.org). + +## Что такое Nuxt.js? + +Nuxt.js — это фреймворк для универсальных приложений на Vue.js. + +Основной задачей этого фреймворка является **рендеринг пользовательского интерфейса** в условиях абстракции от клиент-серверной архитектуры. + +Наша цель — создать фреймворк настолько гибкий, чтобы его можно было использовать и как основу, и как дополнение к уже существующим проектам на Node.js. + +Nuxt.js содержит все необходимые конфигурационные заготовки, позволяющие сделать разработку приложений **с серверным рендерингом** на Vue.js лёгкой и приятной. + +Кроме того, мы также предоставляем другую опцию разработки: *nuxt generate*. С помощью неё можно **статически генерировать** приложения на Vue.js. +На наш взгляд, эта опция может оказаться следующим большим шагом на пути разработки микросервисных веб-приложений. + +Как фреймворк, Nuxt.js привносит множество возможностей, помогающих разработке, таких как: асинхронные данные, middleware, шаблоны и др. + +## Как это работает + +![Vue с Webpack и Babel](https://i.imgur.com/avEUftE.png) + +Nuxt.js использует следующие элементы для создания современных веб-приложений: +- [Vue 2](https://github.com/vuejs/vue) +- [Vue-Router](https://github.com/vuejs/vue-router) +- [Vuex](https://github.com/vuejs/vuex) (только при использовании [опции store](/guide/vuex-store)) +- [Vue-Meta](https://github.com/declandewet/vue-meta) + +Общий размер составляет всего лишь **28kb min+gzip** (31kb при использовании vuex). + +Под капотом мы используем [Webpack](https://github.com/webpack/webpack) с [vue-Loader](https://github.com/vuejs/vue-loader) и [babel-loader](https://github.com/babel/babel-loader) для сборки, разделения и минимизации кода. + +## Возможности + +- Написание Vue-файлов +- Автоматическое разделение кода +- Серверный рендеринг +- Мощная система маршрутизации с асинхронными данными +- Обслуживание статических файлов +- Транспиляция ES6/ES7 +- Сборка и минимизация JS & CSS +- Управление элементами в блоке head +- Горячая замена модулей при разработке +- Интеграция c ESLint +- Пре-процессоры: SASS, LESS, Stylus, и др. + +## Серверный рендеринг + +Nuxt.js можно использовать как фреймворк для организации всех этапов рендеринга UI в вашем проекте. + +Выполнение команды `nuxt` запускает сервер разработки, поддерживающий горячую замену модулей и полностью сконфигурированный серверный рендеринг вашего приложения. + +Взгляните на документацию [имеющихся команд](/guide/commands), чтобы узнать больше. + +Если же сервер у вас уже есть, Nuxt.js можно включить как middleware — ограничений нет никаких. См. руководство по [программному использованию Nuxt.js](/api). + +## Статическая генерация + +Большая инновация Nuxt.js скрыта в команде `nuxt generate`. + +Эта команда генерирует HTML-представление для каждого маршрута и сохраняет их в соответствующие файлы. + +Пример: + +```bash +-| pages/ +----| about.vue +----| index.vue +``` + +Будет сгенерировано: +``` +-| dist/ +----| about/ +------| index.html +----| index.html +``` + +Таким образом, появляется возможность размещения созданного приложения на статическом хостинге! + +Сам данный сайт, сгенерированный статически и размещённый на Github Pages, является отличным примером этого подхода: +- [Исходный код](https://github.com/nuxt/nuxtjs.org) +- [Сгенерированный код](https://github.com/nuxt/nuxtjs.org/tree/gh-pages) + +Генерировать HTML вручную при каждом обновлении [репозитория документации](https://github.com/nuxt/docs) мы, разумеется, не хотим, так что каждый пуш вызывает лямбда-функцию AWS, которая: +1. Клонирует [репозиторий nuxtjs.org](https://github.com/nuxt/nuxtjs.org) +2. Устанавливает зависимости через `npm install` +3. Вызывает `nuxt generate` +4. Пушит получившуюся папку `dist` в ветку `gh-pages` + +Таким образом, у нас теперь есть **безсерверное статически-генерируемое веб-приложение** :) + +Неудержимая мысль влечёт нас дальше: представьте интернет-магазин, созданный посредством `nuxt generate` и размещённый на CDN. Каждый раз, когда товар заканчивается на складе, мы регенерируем приложение, но если во время этого процесса кто-то использует наше приложение — всё будет актуально благодаря запросам к API интернет-магазина. Больше нет нужды во множественных серверах и кешировании! diff --git a/ru/guide/installation.md b/ru/guide/installation.md new file mode 100644 index 000000000..53eb6cf4a --- /dev/null +++ b/ru/guide/installation.md @@ -0,0 +1,93 @@ +--- +title: Установка +description: Начать работу с Nuxt.js действительно очень легко. Простой проект требует лишь указания зависимости `nuxt` в package.json. +--- + +> Начать работу с Nuxt.js действительно очень легко. Простой проект требует лишь указания зависимости `nuxt` в package.json. + +## Использование стартового шаблона Nuxt.js + +Для быстрого запуска приложения команда Nuxt.js создала [стартовый шаблон](https://github.com/nuxt/starter). + +[Скачайте .zip](https://github.com/nuxt/starter/archive/source.zip), или установите стартовый шаблон с помощью vue-cli: + +```bash +$ vue init nuxt/starter +``` + +> Если [vue-cli](https://github.com/vuejs/vue-cli) ещё не установлен, это можно сделать так: `npm install -g vue-cli` + +затем установите зависимости: + +```bash +$ cd +$ npm install +``` + +и запустите проект: +```bash +$ npm run dev +``` +Теперь приложение доступно по адресу http://localhost:3000 + +

Nuxt.js отслеживает изменения файлов внутри папки `pages`, поэтому перезапускать приложение после добавления новых страниц не нужно.

+ +Узнать больше о структуре папок проекта можно в разделе [Структура папок](/guide/directory-structure). + +## Создание с нуля + +Начать приложение Nuxt.js с нуля также очень просто — необходимы лишь *1 файл и 1 папка*. +Давайте создадим новую папку: + +```bash +$ mkdir +$ cd +``` + +*Подсказка: замените project-name на название своего проекта.* + +### Файл package.json + +Проекту необходим файл `package.json`, чтобы запустить `nuxt`: +```json +{ + "name": "my-app", + "scripts": { + "dev": "nuxt" + } +} +``` +Раздел `scripts` запускает Nuxt.js командой `npm run dev`. + +### Установка `nuxt` + +После создания `package.json` добавьте `nuxt` в свой проект через NPM: +```bash +npm install --save nuxt +``` + +### Папка `pages` + +Nuxt.js преобразовывает файлы `*.vue` папки `pages` в маршруты приложения. + +Создайте папку `pages`: +```bash +$ mkdir pages +``` + +затем создайте первую страницу `pages/index.vue`: +```html + +``` + +и запустите приложение: +```bash +$ npm run dev +``` +Теперь приложение доступно по адресу http://localhost:3000 + +

Nuxt.js отслеживает изменения файлов внутри папки `pages`, поэтому перезапускать приложение после добавления новых страниц не нужно.

+ +Узнать больше о структуре папок проекта можно в разделе [Структура папок](/guide/directory-structure). diff --git a/ru/guide/layouts.md b/ru/guide/layouts.md new file mode 100644 index 000000000..f4ec0c21e --- /dev/null +++ b/ru/guide/layouts.md @@ -0,0 +1,71 @@ +--- +title: Шаблоны +description: Nuxt.js позволяет расширять основной шаблон и создавать собственные, просто добавляя их в папку /layouts. +--- + +> Nuxt.js позволяет расширять основной шаблон и создавать собственные, просто добавляя их в папку `layouts`. + +## Основной шаблон + +> Вы можете расширить основной шаблон, добавив файл `layouts/default.vue`. + +*Убедитесь в том, что компонент `` прописан в шаблоне страницы.* + +Код обычного шаблона таков: +```html + +``` + +## Страница ошибки + +> Вы можете изменить страницу ошибки, добавив файл `layouts/error.vue`. + +Шаблон страницы ошибки — специальный шаблон, поскольку компонент `` не должен присутствовать в нём. Представляйте себе этот шаблон как отдельный компонент, который отображается во время возникновения ошибки (404, 500, т.п.) + +Исходный код для стандартной страницы ошибки [доступен на Гитхабе](https://github.com/nuxt/nuxt.js/blob/master/lib/app/components/nuxt-error.vue). + +Пример кода страницы ошибки в `layouts/error.vue`: +```html + + + +``` + +## Индивидуальный шаблон + +> Каждый файл *первого уровня* в папке `layouts` будет создавать индивидуальный шаблон, доступный через свойство `layout` в компоненте страницы. + +*Убедитесь в том, что компонент `` прописан в шаблоне страницы.* + +Пример шаблона в `layouts/blog.vue`: +```html + +``` + +Затем в `pages/posts.vue` вы можете сказать Nuxt.js использовать созданный шаблон: +```html + +``` + +Смотрите живой пример в [демонстрационном видео](https://www.youtube.com/watch?v=YOKnSTp7d38). diff --git a/ru/guide/menu.json b/ru/guide/menu.json new file mode 100644 index 000000000..c904aec75 --- /dev/null +++ b/ru/guide/menu.json @@ -0,0 +1,337 @@ +[ + { + "title": "Начало работы", + "links": [ + { + "name": "Введение", + "to": "", + "contents": [ + { + "name": "Что такое Nuxt.js?", + "to": "#what-is-nuxt-js-" + }, + { + "name": "Как это работает", + "to": "#how-it-works" + }, + { + "name": "Особенности", + "to": "#features" + }, + { + "name": "Серверный рендеринг", + "to": "#server-rendered" + }, + { + "name": "Генерация статики", + "to": "#static-generated" + } + ] + }, + { + "name": "Установка", + "to": "/installation", + "contents": [ + { + "name": "Использование стартового шаблона Nuxt.js", + "to": "#using-nuxt-js-starter-template" + }, + { + "name": "Приложение с нуля", + "to": "#starting-from-scratch" + } + ] + }, + { + "name": "Структура папок", + "to": "/directory-structure", + "contents": [ + { + "name": "Папки", + "to": "#directories" + }, + { + "name": "Псевдонимы", + "to": "#aliases" + } + ] + }, + { + "name": "Конфигурация", + "to": "/configuration" + }, + { + "name": "Команды", + "to": "/commands", + "contents": [ + { + "name": "Список команд", + "to": "#list-of-commands" + }, + { + "name": "Развёртывание на продакшн-сервере", + "to": "#production-deployment" + }, + { + "name": "Развёртывание на статичном хостинге", + "to": "#static-hosting-deployment" + } + ] + } + ] + }, + { + "title": "Маршрут", + "links": [ + { + "name": "Базовые маршруты", + "to": "/basic-routes" + }, + { + "name": "Динамические маршруты", + "to": "/dynamic-routes", + "contents": [ + { + "name": "Структура папок", + "to": "#directory-structure" + }, + { + "name": "Валидация параметров маршрутов", + "to": "#validate-route-params" + } + ] + }, + { + "name": "Вложенные маршруты", + "to": "/nested-routes", + "contents": [ + { + "name": "Структура папок", + "to": "#directory-structure" + }, + { + "name": "Динамические вложенные маршруты", + "to": "#dynamic-nested-routes" + } + ] + }, + { + "name": "Переходы маршрутов", + "to": "/routes-transitions", + "contents": [ + { + "name": "Использование", + "to": "#usage" + }, + { + "name": "The transition Key", + "to": "#the-transition-key" + }, + { + "name": "Переход для конкретной страницы", + "to": "#transition-for-a-specific-page" + }, + { + "name": "Динамический переход", + "to": "#dynamic-transition" + } + ] + }, + { + "name": "Middleware", + "to": "/routes-middleware" + } + ] + }, + { + "title": "Представления", + "links": [ + { + "name": "Страницы", + "to": "/pages", + "contents": [ + { + "name": "Специальные ключи", + "to": "#special-keys" + }, + { + "name": "Простая страница", + "to": "#a-simple-page" + }, + { + "name": "Использование пре-процессоров", + "to": "#using-pre-processors" + }, + { + "name": "Использование JSX", + "to": "#using-jsx" + } + ] + }, + { + "name": "Шаблоны", + "to": "/layouts", + "contents": [ + { + "name": "Основной шаблон", + "to": "#default-layout" + }, + { + "name": "Страница ошибки", + "to": "#error-page" + }, + { + "name": "Индивидуальный шаблон", + "to": "#custom-layout" + } + ] + }, + { + "name": "Индикатор загрузки", + "to": "/custom-loading", + "contents": [ + { + "name": "Отключение индикатора загрузки", + "to": "#disable-the-progress-bar" + }, + { + "name": "Изменение индикатора загрузки", + "to": "#customize-the-progress-bar" + }, + { + "name": "Создание своего индикатора загрузки", + "to": "#use-a-custom-loading-component" + } + ] + }, + { + "name": "HTML Head", + "to": "/html-head", + "contents": [ + { + "name": "Заголовок (title)", + "to": "#title" + }, + { + "name": "Мета-теги", + "to": "#meta-tags" + }, + { + "name": "Использование данных страницы", + "to": "#using-page-data" + }, + { + "name": "Meta-значения по-умолчанию", + "to": "#defaults-meta" + } + ] + } + ] + }, + { + "title": "Данные", + "links": [ + { + "name": "Асинхронные данные", + "to": "/async-data", + "contents": [ + { + "name": "Метод data", + "to": "#the-data-method" + }, + { + "name": "Контекст (context)", + "to": "#the-context" + }, + { + "name": "Обработка ошибок", + "to": "#handling-errors" + } + ] + }, + { + "name": "Хранилище Vuex store", + "to": "/vuex-store", + "contents": [ + { + "name": "Активация хранилища", + "to": "#activate-the-store" + }, + { + "name": "Modules Files", + "to": "#modules-files" + }, + { + "name": "Метод fetch", + "to": "#the-fetch-method" + }, + { + "name": "Контекст (context)", + "to": "#the-context" + }, + { + "name": "Действие nuxtServerInit", + "to": "#the-nuxtserverinit-action" + } + ] + } + ] + }, + { + "title": "Ресурсы", + "links": [ + { + "name": "Файлы исходного кода", + "to": "/assets" + }, + { + "name": "Статические файлы", + "to": "/static" + }, + { + "name": "Плагины", + "to": "/plugins", + "contents": [ + { + "name": "Использование внешних модулей", + "to": "#use-external-modules" + }, + { + "name": "Использование плагинов Vue", + "to": "#use-vue-plugins" + }, + { + "name": "Только для браузеров", + "to": "#only-for-browsers" + } + ] + } + ] + }, + { + "title": "Иструменты разработчика", + "links": [ + { + "name": "ESLint", + "to": "/eslint" + }, + { + "name": "Модульное тестирование", + "to": "/unit-testing" + } + ] + }, + { + "title": "Разное", + "links": [ + { + "name": "Помощь в разработке", + "to": "/contribution-guide" + }, + { + "name": "Примечания к релизам", + "to": "/release-notes" + } + ] + } +] diff --git a/ru/guide/nested-routes.md b/ru/guide/nested-routes.md new file mode 100644 index 000000000..44fc5b4ee --- /dev/null +++ b/ru/guide/nested-routes.md @@ -0,0 +1,132 @@ +--- +title: Вложенные маршруты +description: Nuxt.js позволяет создавать вложенные маршруты при помощи дочерних путей vue-router. +--- + +> Nuxt.js позволяет создавать вложенные маршруты при помощи дочерних путей vue-router. + +## Структура директорий + +Чтобы определить вложенный маршрут, вы должны создать файл Vue **с таким же имеменем, как имя каталога**, которые содержат ваши дочерние представления. +> Не забывайте писать `` в Вашем родительском файле Vue. + +Эта структура файлов: + +```bash +pages/ +--| users/ +-----| _id.vue +--| users.vue +``` +автоматически сгенерирует: + +```js +router: { + routes: [ + { + path: '/users', + component: 'pages/users.vue', + children: [ + { + path: ':id?', + component: 'pages/users/_id.vue', + name: 'users-id' + } + ] + } + ] +} +``` +Видно, что у дочерних элементов есть путь `:id?`, который является дополнительным, но если вы хотите сделать его обязательным, создайте `index.vue` в каталоге `users`: + +```bash +pages/ +--| users/ +-----| _id.vue +-----| index.vue +--| users.vue +``` + +Nuxt.js сгенерирует: + +```js +router: { + routes: [ + { + path: '/users', + component: 'pages/users.vue', + children: [ + { + path: '', + component: 'pages/users/index.vue', + name: 'users' + }, + { + path: ':id', + component: 'pages/users/_id.vue', + name: 'users-id' + } + ] + } + ] +} +``` + +## Динамические вложенные пути + +> Этот сценарий не так распространен, но с Nuxt.js он тоже возможен: наличие динамических дочерних элементов в динамических родителях. + +Эта структура файлов: + +```bash +pages/ +--| _category/ +-----| _subCategory/ +--------| _id.vue +--------| index.vue +-----| _subCategory.vue +-----| index.vue +--| _category.vue +--| index.vue +``` + +автоматически сгенерирует: + +```js +router: { + routes: [ + { + path: '/', + component: 'pages/index.vue', + name: 'index' + }, + { + path: '/:category', + component: 'pages/_category.vue', + children: [ + { + path: '', + component: 'pages/_category/index.vue', + name: 'category' + }, + { + path: ':subCategory', + component: 'pages/_category/_subCategory.vue', + children: [ + { + path: '', + component: 'pages/_category/_subCategory/index.vue', + name: 'category-subCategory' + }, + { + path: ':id', + component: 'pages/_category/_subCategory/_id.vue', + name: 'category-subCategory-id' + } + ] + } + ] + } + ] +} +``` diff --git a/ru/guide/pages.md b/ru/guide/pages.md new file mode 100644 index 000000000..4e5475587 --- /dev/null +++ b/ru/guide/pages.md @@ -0,0 +1,114 @@ +--- +title: Страницы +description: Папка /pages позволяет создавать любой вид маршрута, просто создавая Vue-файлы. Эти компоненты обладают свойствами, с помощью которых можно легко создавать и поддерживать приложение. +--- + +> Папка `pages` позволяет создавать любой вид маршрута, просто создавая Vue-файлы. Эти компоненты обладают свойствами, с помощью которых можно легко создавать и поддерживать приложение. + +## Специальные атрибуты + +Каждая страница — это компонент Vue, но Nuxt.js ещё добавляет и специальные ключи, чтобы сделать процесс разработки приложения как можно проще. + +Список всех доступных атрибутов + +| Атрибут | Описание | +|-----------|-------------| +| data | Самый важный ключ, с тем же предназначением, что и [Vue data](https://vuejs.org/v2/api/#Options-Data), но может быть асинхронным и принимать контекст в виде аргумента. Пожалуйста, прочитайте про [асинхронные данные](/guide/async-data), чтобы понять, как именно это работает. | +| fetch | Используется для заполнения хранилища перед рендерингом страницы. Примерно как метод data, за исключением того, что значение data у компонента в данном случае не устанавливается. См. [метод fetch](/guide/vuex-store#the-fetch-method). | +| layout | Назначает шаблон, определённый в папке `layouts`. См. [шаблоны](/guide/layouts). | +| transition | Устанавливает переход для страницы. См. [переходы маршрутов](/guide/routes-transitions). | +| scrollToTop | Булевское значение, по-умолчанию — `false`. Используйте, если страница должна проскроллиться наверх перед рендерингом. Используется для [вложенных маршрутов](/guide/nested-routes). | +| validate | Функция-валидатор для [динамического маршрута](/guide/dynamic-routes#validate-route-params). | +| middleware | Устанавливает промежуточный код для конкретной страницы, который выполняется перед рендерингом страницы. См [промежуточный код маршрутов](/guide/routes-middleware). | + + +## Простая страница + +Компонент страницы — это компонент Vue с дополнительной супер-силой. Сперва, давайте создадим простой компонент, показывающий красный заголовок "Hello World!" + +Назовём первую страницу `pages/index.vue`: + +```html + + + + + +``` + +## Использование пре-процессоров + +Благодаря [vue-loader](http://vue-loader.vuejs.org/en/configurations/pre-processors.html) вы можете использовать любой тип пре-процессоров для `