Nuxt.js integrating with Socket.io(very simple)
Integrating Nuxt.js with Socket.io is straightforward and simple.
 
    作者最近有Long Polling(長輪詢)需求, 看蠻多文章都GG
etc. nuxt-socket-io (This module is not yet compatible with Nuxt 3 ...)
所以決定自己重新整合一個環境, 採用前後端分離, 兼容性更高且好管理!!
Long Polling(長輪詢)需求的工具選擇
首先有比較熱門的Websocket(ws) 或 Socket.io 兩個選擇
Websocket沒有心跳檢測、自動重連、瀏覽器兼容性等等高級功能, 需要自己寫
Socket.io則是建立在Websocket上的一個Library,走自己的協議!!
因此需要有Socket.io Server 與Socket.io Client
Websocket則不需要,原生就可以建立自己的Server與Client!!
但考慮到擴充性與維護, 決定使用Socket.io 作為Long Polling(長輪詢)的選擇
Do Not Use Nitro to Build Socket.io Server...
有作者有將Socket.io整合到Nitro, 但有一個問題!!!
使用Nuxt Build + Nuxt Start,Socket.io Server不會自己熱更新還會卡在後台
 哈哈, 直接前後端分離比較方便維護與管理!!

好聽~~
Deployed Kit(部署套件)
# package.json / 主要套件4個
{
	"socket.io": "^4.7.5",
	"socket.io-client": "^4.7.5",
	"nuxt": "^3.11.1",
	"koa": "^2.15.2" (Option, 都可, 用你喜歡的HTTP Server即可)
}
Step1. Build a Socket.io Server
To set up a Socket.io server using Koa as the HTTP interface for clients to establish connections.
# ./server/socket.io.server.js
import { createServer } from 'http'
import { Server } from 'socket.io'
import Koa from 'koa'
// Defined Koa HTTP For Socket.io Server to be a Client Interface
const app = new Koa()
const httpServer = createServer(app.callback())
const socketServer = new Server(httpServer, {
  serveClient: false,
  cors: {
    origin: '*'
  }
})
// count Value
let count = 0
socketServer.on('connection', (socket) => {
  // 1. When Client Establishes A Connection, Update the current value of "total_count" to the Client
  socketServer.emit('total_count', count)
  // 2. Server Listen Client Trigger add_count Event
  socket.on('add_count', (msg) => {
    count = count + msg
    // 3. Server Update new_count For All Client
    socketServer.emit('total_count', count)
  })
  // Client disconnected
  socket.on('disconnect', () => {
    console.log('Client disconnected')
  })
})
// Active Server
httpServer.listen(3003, '0.0.0.0')

Step2. Create a global Socket.io Client in Nuxt.js
Register this.$io for Nuxt.js for global use!!
# ./plugins/socket.io.js
/* eslint-disable no-undef */
import { io } from 'socket.io-client'
import { defineNuxtPlugin } from '#app'
export default defineNuxtPlugin((nuxtApp) => {
  // const config = useRuntimeConfig().public // 這裡假設您已經定義了 useRuntimeConfig() 方法
  const socket = io(`192.168.1.51:3003`, {
    autoConnect: false
  })
  return {
    provide: {
      io: socket
    }
  }
})

Step3. Use Socker.io Client in VUE
Use Socker.io Client to establish connection with Socker.io Server in VUE
# ./pages/socket.vue
<template>
  <div>
    <button @click="$io.emit('add_count', 1)">
      add
    </button>
    <p v-if="connected">
      已連接到伺服器
    </p>
    <p v-else>
      未連接到伺服器
    </p>
    {{ count }}
  </div>
</template>
<script>
export default {
  data () {
    return {
      connected: false,
      count: 0
    }
  },
  mounted () {
    // Establish a connection
    this.$io.connect()
    // Listen connect Success Event
    this.$io.on('connect', () => {
      console.log('socket.io connection success')
      this.connected = true
    })
    // Client listens for 'total_count' and then displays 'total_count' on the Vue page.
    this.$io.on('total_count', (message) => {
      this.count = message
    })
    // this.$io.disconnect()
  }
}
</script>

Start Socket.io
# socket.io server start(node.js)
node server\socket.io.server.js
# socket.io Client start(nuxt) / "dev": "nuxi dev --port=80 --host",
npm run dev
For One Page.
The current setup is establishing a connection per page.
If u need to use it on every page, layouts can be utilized.

For ALL Page.
*Move this.$io.connect() to layout


 
             
             
            
Comments ()