Ответы пользователя по тегу Nuxt.js
  • Почему приложение не билдится из-за vue-yandex-maps?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Я, как и сборщик, не вижу экспорта yandexMap и yandexMarker, вижу YandexMap и YandexMarker.
    Ответ написан
    2 комментария
  • Не могу адекватно интегрировать шрифты Nuxt3?

    Aetae
    @Aetae
    Тлен
    Шрифты всегда и везде мерцают если не в кэше. Единственный способ надёжно избежать этого - ничего не показывать пока шрифт не загрузится - т.е. отображать лоадер или ещё что. "Не надёжно" это можно сделать просто поигравшись со свойством font-display.
    Наверняка же дождаться загрузки помогут соответствующие библиотеки, например webfontloader или напрямую Font Loading API.

    Также следует убедиться, что сервер нормально отдаёт кэширующе заголовки для файлов шрифтов, чтоб задержка была только на первой загрузке.

    К сожалению из-за cache partitioning в современных браузерах использование всяких cdn для шрифтов, делу никак не поможет, т.к. для каждого сайта всё равно своё кэш.
    Ответ написан
    Комментировать
  • Как заставить hmr в vite подключатсья по wss?

    Aetae
    @Aetae
    Тлен
    Нужно сконфигурировать nuxt devServer в режиме https из-за этого куска кода(хотя все мы понимаем что в 99% за https у нас отвечает nginx). Ну или монкипатчить.
    Ответ написан
    Комментировать
  • Почему .value в nuxt3 выдает не тот результат в консоли?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Во первых: всё зависит от сигнатуры этого вашего useApiFetch, очень многое в vue 3 можно сломать неудачной деструктуризацией. Но допустим сам хук нормальный.
    В таком случае isPending - это ref, а значит он и должен быть прокси, чтоб собственно работала энтая самая реактивность. Чтоб отобразить в консоли чистый объект - есть хэлпер toRaw(только после этого он уже не будет динамическим).

    Далее: если вы выводите в консоль isPending.value - то в консоль, очевидно, попадает значение на момент вызова console.log. Магическим образом прямо в консоли оно уже не изменится.

    Если ты хочешь понаблюдать за изменениями isPending - можешь сделать так:
    watch(isPending, (value) => console.log('watch isPending', value), { immediate: true });


    В заключение предположу, что всё у вас работает как должно, а проблемы с пониманием реактивности vue и асинхронности как таковой.
    Ответ написан
    Комментировать
  • Smooth scroll to anchor links in Nuxt3 как сделать?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Точно также как и не в nuxt.
    function manualSmoothScroll(event) {
      // находим хэш ссылу по которой мы кликнули
      const id = event.target.closest('a[href^="#"]')?.hash;
      // если клик куда-то ещё - ничего не делаем
      if (!id) return;
      
      
      // находим цель куда будем скроллить по хэшу
      const target = document.querySelector(id);
      // если не нашли - ничего не делаем
      if (!target) return;
      
      // отменяем стандартный переход
      event.preventDefault();
      // едем руками
      target.scrollIntoView({ behavior: "smooth" });
    }
    
    // при загрузке
    addEventListener('click', manualSmoothScroll, true);
    
    
    // при выгрузке
    removeEventListener('click', manualSmoothScroll, true);
    
    // если действовать надо только в рамках элнметата
    // elementRef.value.addEvent... elementRef.value.removeve... 
    // или this.$refs.element... 
    // или this.$el...
    Ответ написан
    1 комментарий
  • Как во Vue Router указать не обязательную часть url?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    На обычном Vue роутере такие маршруты делаются примерно так:
    {
    		path: '/catalog/mebel', 
    		children: [
    			{
    				path: 'page-:page(\\d+)?', 
    				alias: '',
    				component: Mebel,
    			},
    			{
    				path: ':category', 
    				children: [
    					{
    						path: 'page-:page(\\d+)?', 
    						alias: '',
    						component: MebelCategory
    					},
    					{
    						path: ':article', 
    						component: MebelArticle
    					}
    				]
    			},
    		], 
    	}



    В nuxt это можно добавить\изменить тут.
    Ответ написан
    Комментировать
  • TypeScript: как убрать null из свойства объекта?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    if (error.value?.statusCode !== 404) не гарантирует, что в user не будет null, мало ли там ошибка 50х или даже нет ошибки, а просто сервер глюканул.

    Так что у тебя два варианта:
    1. То что от тебя хочет typescript, явная проверка:
    if (!user) {
      throw new Error('empty responce')
    }

    2. Исправление типа, если ты очень доверяешь своему серверу:
    а) Вариант предложенный Lynn «Кофеман» с явным кастом;
    б) Обёртка над useFetch которая внутри себя скастует тип по новому или изменение самого типа useFetch.
    Ответ написан
    Комментировать
  • Можно ли в Nuxt не рендерить сайт на каждом хите?

    Aetae
    @Aetae
    Тлен
    На всякий, чтоб убедиться что мы на одной волне: обычный SSR работает ровно один раз - когда пользователь только зашёл на сайт. Дальше пользователь перемещается внутри SPA. Каждый раз перезапрашивают SSR страницы только боты.
    По этому обычно тут ничего не оптимизируют.

    Однако если хочется - вместо того, чтоб что-то городить, следует воспользоваться классическим кэшированием: выделить nginx который будет кэшировать ответы, а не мучать сервер, и не париться.
    Ответ написан
    1 комментарий
  • Как заставить Nuxt Image работать с изображениями из папки assets?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    С одной стороны для кастомных компонентов тебе потребовался бы transformAssetUrls. Однако открыв доки я вижу там:
    Converts src to provider optimized URLs

    В связи с чем вопрос: а путь то такой вообще работает?
    Что будет в img если ты делаешьimport img from '~/assets/images/header.jpg'?
    Ответ написан
    3 комментария
  • Как использовать директивы внутри кастомных директив в nuxt 3?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Встроенного механизма наследования нет. Директивы - это уже продвинутый механизм, подразумевается, что раз уж вы взялись за директивы - вы глубоко понимаете механизмы Vue. Если вам сильно хочется таки использовать чужую директиву внутри своей, надо будет самостоятельно экспериментировать, навскидку вижу два варианта:
    1. "тупой", но точно работающий - пробрасывать все возможные хуки директивы напрямую:
    const myDirective = {
      created(el, binding, vnode, prevVnode) {
         otherDirective?.created(el, binding, vnode, prevVnode);
         ...
      },
      beforeMount(el, binding, vnode, prevVnode) {
         otherDirective?.beforeMount(el, binding, vnode, prevVnode);
         ...
      },
      ....
    }

    2. "умный", но требующий знаний и экспериментов - манипуляции напрямую с vNode.

    Однако, возможно, лучше будет сделать просто-компонент-обёртку, который просто навесит все нужные директивы на обёрнутый компонент, примерно так:
    import { useSlots, withDirectives, resolveDirective } from 'vue'
    
    export default {
      setup() {
        const htmlDirective = {
          mounted(el, html) {
            el.innerHTML = html.value
          }
        }
    
        const colorDirective = {
          mounted(el, color) {
            el.style.color = color.value
          }
        }
        
        // const someDirective = resolveDirective('some-directive');
    
        const slots = useSlots();
    
        return () => withDirectives(slots.default()[0], [
          [htmlDirective, 'some html'],
          [colorDirective, 'red'],
        ])
      }
    }

    <wrapper><some-compnent /></wrapper>
    Ответ написан
    1 комментарий
  • Верный ли алгоритм для фильтра товаров?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Нормально. Источником состояния должно быть только одно место: в данном случае этим источником выступает url.
    Ответ написан
    Комментировать
  • Как проверить наличие nuxt во vue3?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Можно с помощью getCurrentInstance, но не нужно(прочтите предупреждение по ссылке).
    Лучше расскажите зачем оно вам надо, а мы предложим лучшее решение. :)
    Ответ написан
    Комментировать
  • Почему не работает поиск по массиву из объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Во-первых: вопрос не относится к vue, он о чистом js.
    Во-вторых: код рабочий, просто у вас, судя по всему, отсутствуют такие item, где одновременно были бы равны item.product.article, item.size и item.warehouse.id, т.к. только в таком случае ветка уйдёт в нужную вам сторону. Если логика предполагалась какой-то другой - уточняйте.
    Во-третьих: используйте, по возможности, для отдельно стоящих объектов reactive вместо ref, код чище и приятней будет.
    Ответ написан
    Комментировать
  • Как работает State Managment в nuxt 3?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    SSR-friendly - значит что ты не должен об этом думать, а за тебя подумает фреймворк и сделает всё интуитивно снаружи и правильно внутри.)
    Ответ написан
    Комментировать
  • Как лучше сделать авторизацию в NUXT?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Про "очень просто" ты меня сейчас сильно насмешил. Тот же OAuth - это просто адище под капотом. Но даже в basic auth есть куча мелочей на которых можно запороться.
    В общем использовать само собой следует либу, сам ты гарантировано словишь тонну багов и дыр в безопасности, только выбирать более-менее приличную(на глазок - больше 1000 Weekly Downloads на npmjs.com и от не вызывающего подозрений автора).

    Со стороны nuxt очевидно лучше всего подойдёт https://auth.nuxtjs.org/ , со стороны laravel - хз, гугли реализацию одного из вариантов поддерживаемых auth.nuxtjs.

    Ну и прекратят поддержку либы скорее всего задолго после того как ты прекратишь поддержку и обновление разрабатываемого приложения.:)
    Ответ написан
    Комментировать
  • Как добавить параметры в query?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Нужна - сделайте. Это элементарный javascript, vue тут не при чём.
    типа этого
    function concatenateFieldValue(previous, value) {
      if (typeof value !== 'string')
        value = String(value);
      if (!previous)
        return value;
    
      const uniqueValues = splitFieldValues(previous);
      uniqueValues.add(value.trim());
    
      return [...uniqueValues].join(' ');
    }
    
    function splitFieldValues(values) {
      return new Set(values.split(' ').filter(Boolean));
    }
    
    function getUpdatedQuery(query, field, value) {
      return {
        ...query,
        [field]: concatenateFieldValue(query[field], value)
      }
    }
    
    
    this.$router.push({
      query: getUpdatedQuery(
        this.$route.query, 
        itemNameParent, 
        e.target.value
      )
    });
    Ответ написан
    Комментировать
  • Как во vue/nuxt запретить роутинг по условию?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    beforeEach, либо заполнять все маршруты динамически через addRoute.
    Ответ написан
  • Как для отдельного layout создать отдельный css, js и не подключать основной?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Vue поддерживает динамическую загрузку компонентов.
    Компонент подгружаемы таким образом, как и любой код подключаемый webpack'ом через динамический import(), будет лежать в отдельном js файле, который подгрузится только когда попросят.

    Также можно настроить Vue pages, тогда код будет разбит на один общий файл js где лежит всё что используется на каждой странице и отдельные файлы для каждой страницы.

    Можно совмещать.)
    Ответ написан
    Комментировать
  • Можно ли восстановить папку проекта из папки dist?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Теоретически - это возможно. На практике - никто нужного софта(декомпилятора) не писал за отсутствием спроса. Ты можешь с помощью мощных beautifier'ов типа jsnice привести код к боль-мене читаемому виду, но от исходника это будет бесконечно далеко.

    Лучше смотри в сторону софта для восстановления файлов типа recuva и, возможно, восстановления local history в ide.
    Ответ написан
    Комментировать