Ответы пользователя по тегу Vue.js
  • Как исправить ошибки в консоли при установке пакетов Vue?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Сообщение об ошибке указывает на проблему с разрешением зависимостей, вызванную конфликтом версий eslint.
    Обычно это происходит когда например одна из зависимостей вашего проекта или сам проект требует версии eslint конфликтующей с версией eslint требуемой другой зависимостью вашего проекта.

    Вам нужно устранить конфликт и повторить установку.
    Вот несколько вариантов решения проблемы:

    Сначала обновите npm: npm i -g npm
    1. Обновите версию eslint до версии, которая удовлетворяет требованиям всех зависимостей.
      Попробуйте выполнить следующую команду:
      npm install -D eslint@7.28.0
      Если это не помогает, перейдите к следующему шагу.
    2. Удалите папку node_modules и файл package-lock.json, затем переустановите зависимости с флагом --force:
      npm install --force
    3. Используйте флаг --legacy-peer-deps при установке зависимостей:
      npm install --legacy-peer-deps
      Этот флаг отключает новую систему разрешения зависимостей, введенную в NPM 7, и использует более старую версию. Он может помочь в случае проблем с разрешением зависимостей.

    Ну и настоятельно рекомендую уже не использовать vue-cli при старте новых проектов на Vue, тк это инструмент который в будущем не будет поддерживаться (уже сейчас мало поддерживается).
    Посмотрите в сторону Vite:
    npm create vue@3
    или:
    npm create vite@latest my-vue-app -- --template vue

    Гайд по миграции Vue проекта с vue-cli на vite:
    https://vueschool.io/articles/vuejs-tutorials/how-... (мог уже немного устареть)
    Ответ написан
  • Как сделать отслеживание ширины экрана автоматически на vue?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Подключите библиотеку @vueuse/core и используйте из неё готовый реактивный хук (1.16 kB весит) useWindowSize, пример:

    <script setup lang="ts">
    import { useWindowSize } from '@vueuse/core'
    const { width, height } = useWindowSize()
    
    function checkChapter(idFromEvent) {
      if (width < 1228) {
        // ...
      }
    }
    </script>
    
    <template>
      <p>{{ width }} x {{ height }}</p>
    </template>
    Ответ написан
    Комментировать
  • В каком жизненном цикле Vue 3 закрыть соединение с вебсокетом после закрытия клиентом сайта?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Надо понимать что вы имеете в виду под фразой "когда клиент выходит с сайта", и какие конкретно вебсокеты используете - стандартные, или либу Socket.io работающую по Websocket транспорту.
    • Если подразумеваете закрытие вкладки браузера клиентом (как пример), то в этот момент браузер разорвёт соединение с socket.io сервером, а на сервере произойдёт событие `disconnect` у конкретного сокета, который был привязан к данному подключению.
      Более того - при закрытии вкладки с сайтом, у Vue не вызывается `beforeUnmount` или `unmounted`, поэтому ваш код не сработает - клиент (браузер) ничего не отправит, сервер ничего не получит.
      *Но это можно реализовать самому через слушатель события `beforeunload` у `window` (правда событие не сработает, если произойдёт вылет браузера или самой ОС) , подробнее тут:
      https://forum.vuejs.org/t/detect-browser-close/5001/2
      https://developer.mozilla.org/en-US/docs/Web/API/B...
      https://developers.google.com/web/updates/2018/07/...
      https://developer.mozilla.org/en-US/docs/Web/API/W...

    • Если подразумеваете выход из учетной записи клиента на сайте, то ваш код сработает

    Пример обработки первого случая (когда клиент выходит с сайта закрывая вкладку) на серверной стороне, если используете Socket.io (по аналогии можно и с обычными вебсокетами, но там придётся детектить разрыв соединения на базе отсутствия ответа на ping-pong со стороны браузера):
    // https://socket.io/docs/v4/server-initialization/
    import * as Server from 'socket.io'
    const io = Server()
    io.listen(3000)
    
    // коллекция сокет-подключений
    const connections = new Set()
    
    // когда Socket.io сервер словил новое подключение
    io.on('connection', (s) => {
      // добавляем это подключение в коллекцию
      connections.add(s)
      // слушаем событие отключения сокета и реагируем на него
      s.once('disconnect', () => {
        // удаляем данное сокет-подключение из коллекции
        connections.delete(s)
      })
    })
    // connections.size - покажет размер коллекции, то есть количество подключенных клиентов к серверу Socket.io (онлайн на сайте в вашем случае)

    Однако данный код можно не использовать в таком виде, тк в Socket.io уже есть под капотом готовые функции и коллекции для работы с подключенными сокетами, поэтому нет необходимости создавать и хранить в памяти свои собственные списки сокет-подключений.
    Например в v4, количество/список подключенных клиентов можно получить таким способом:
    // https://socket.io/docs/v4/server-instance/#Server-engine
    io.engine.clientsCount
    // или:
    // https://socket.io/docs/v4/server-api/#namespace-allSockets
    await io.allSockets()
    Ответ написан
    1 комментарий