Size: a a a

Nuxt.js — русскоговорящее сообщество

2020 May 03

R

RusaXXX in Nuxt.js — русскоговорящее сообщество
Александр
Реализация Nuxt Advanced SSR:
1. подключаем обёртки серверного и клиентского апи
nuxt.config.js
plugins: [
   '~/plugins/api-context.server.js' // подключится на только для серверной части
   , '~/plugins/api-context.client.js' // подключится на только для клиентской части
],

2. Клиентское апи забирает данные по http через axios
api-context.client.js
export default (context, inject) => {
   inject('api', async (controller, method, params) => {
       ...
       return await context.$axios['$' + (params ? 'post' : 'get')]('/api/' + controller + '/' + method, params);

3. Серверное апи подключает файл соответствующего контроллера, передаёт ему соединение MySQL и выполняется непосредственно на сервере.
api-context.server.js
export default (context, inject) => {
   inject('api', async (controller, method, params) => {
       ...
       let db = await db_pool.getConnection();
       let api = require('~/api/' + controller);
       ...
       let result = await api[method](db, params);
       ...
       return result;

4. Для обработки клиентских запросов поднимется соответствующее serverMiddleware
nuxt.config.js
serverMiddleware: [
   ...
   {path: '/api', handler: body_parser.json()},
   {path: '/api', handler: (req, res, next) => {
       const url = require('url');
       req.query = url.parse(req.url, true).query;
       next();
   }},
   ...
   {path: '/api', handler: '~/serverMiddleware/api-server.js'},
   ...

5. api-server для клиентских запросов выглядит примерно так
/serverMiddleware/api-server.js
export default async(req, res, next) => {
   ...
   let db = await db_pool.getConnection();
   let url = parseAndCheck(req._parsedUrl.pathname);
   url = url.split('/');
   let method = url.pop();
   let controller = url.join('/');
   let api = require('~/api/' + controller);
   let result = await api[method](db, req.params);
   res.end(JSON.stringify(result));
   ...

6. Пример контроллера:
/api/items.js
let index = async db => {
   let [results, schema] = await db.query(`SELECT * FROM items`);

   return {items: results, schema: db.schemaFromQuery(schema)};
};

export {index}

7. вызов контроллера в компоненте
/components/Items.vue
<template>
   <div>
       <b-button @click.prevent="$fetch">Refresh</b-button>
       <b-table :items="items"></b-table>
   </div>
</template>
<script>
   export default {
       data () {
           return {
               items: []
           }
       }
       , async fetch () {
           let res = await this.$api('items', 'index');
           this.items = res.items;
       }
   }
</script>

Сейчас при заходе на страницу и серверном рендеренге, http запросы никуда отправляться не будут, Нода напрямую вызовет метод контроллера, который сделает запрос к MySQL, а при нажатии на кнопку Refresh, уйдёт запрос
/api/items
и serverMiddleware вернёт данные по http
Спс
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
Моя идея заключается в том, что если у вас есть бэк на Ноде, то этот сервер можно объеденить с сервером Nuxt и тогда при SSR мы получим прирост производительности в ~1,6 раза, за счёт исключения оверхеда протокола HTTP при получении данных
источник

RK

Roman Kolosov in Nuxt.js — русскоговорящее сообщество
откуда прирост?
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
Roman Kolosov
откуда прирост?
"за счёт исключения оверхеда протокола HTTP при получении данных"
источник

RK

Roman Kolosov in Nuxt.js — русскоговорящее сообщество
не пойму что подразумевается под оверхедом
источник

RK

Roman Kolosov in Nuxt.js — русскоговорящее сообщество
приложение все равно же будет обращатся к бэку который будет удалено, в чем профит)
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
бэк расположен здесь же
вместо
Nuxt->HTTP->Node(или другой язык)->MySQL(или другая БД)->Node(или другой язык)->HTTP->Nuxt
идём напрямую
Nuxt->MySQL(или другая БД)->Nuxt
источник

R

RusaXXX in Nuxt.js — русскоговорящее сообщество
Roman Kolosov
приложение все равно же будет обращатся к бэку который будет удалено, в чем профит)
Сервер не будет ходить сам в себя по http, а будет вызываться метод. Может это и не быстрее но логически более правильнее считаю
источник

RK

Roman Kolosov in Nuxt.js — русскоговорящее сообщество
правильнее? бек на фронт отдавать?)
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
и на 10 бэковых запросах разница уже существенна
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
Roman Kolosov
правильнее? бек на фронт отдавать?)
меняется только протокол общения
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
данные получаем те же самые
источник

D

DK in Nuxt.js — русскоговорящее сообщество
не покидает ощущение,что ради эксперимента можно вместо мускуля хранить данные в редисе :D
источник

D

DK in Nuxt.js — русскоговорящее сообщество
и сравнить скорость
источник

D

DK in Nuxt.js — русскоговорящее сообщество
just for fun
источник

VB

Vladislav Bulgakov in Nuxt.js — русскоговорящее сообщество
ну если данные key->value почему бы и нет
источник

RK

Roman Kolosov in Nuxt.js — русскоговорящее сообщество
ну или выкачивать базу на клиент и вообще не нужно будет http запросы делать)
источник

RK

Roman Kolosov in Nuxt.js — русскоговорящее сообщество
че нет
источник

VB

Vladislav Bulgakov in Nuxt.js — русскоговорящее сообщество
Александр
бэк расположен здесь же
вместо
Nuxt->HTTP->Node(или другой язык)->MySQL(или другая БД)->Node(или другой язык)->HTTP->Nuxt
идём напрямую
Nuxt->MySQL(или другая БД)->Nuxt
тоесть обрабатывать данне и давать доступ к бд на клиенте?
источник

А

Александр in Nuxt.js — русскоговорящее сообщество
DK
не покидает ощущение,что ради эксперимента можно вместо мускуля хранить данные в редисе :D
разница 1 и 10 запросов с MySQL была не велика
220 и 250мс
серьёзно замедлилось когда эти данные стали брать по HTTP
источник