節點幫助

Socket.io node.js(如何為開發者運作)

發佈 2024年9月29日
分享:

即時互動和動態內容創建已成為現代網頁開發中提供引人入勝的用戶體驗的必要條件。 即時數據共享由諸如 Socket.IO,可實現客戶端與服務器之間的雙向實時通信。 同時, IronPDF 在Node.js環境中,提供強大的功能,從HTML文本生成高質量的PDF文檔。

Socket.IOIronPDF 集成後,開發者可以構建應用程式,讓使用者即時互動並立即看到其操作的效果。 這些應用程式的例子包括生成和下載 PDF 報告、發票和其他動態創建的文件的功能。 這個強大的組合最適合用於電子商務、報告系統、教育平台和其他需要實時更新和快速反饋的領域。

為了展示如何結合這些技術以產生流暢且引人入勝的用戶體驗,我們將研究如何建立一個使用 Socket.IO 進行即時套接字通信和 IronPDF 進行 PDF 生成的 Node.js 應用程序。

什麼是 Socket.IO Node.js JS?

Socket.IO 的強大客戶端 JavaScript 庫使客戶端與服務器之間的實時、雙向和事件驅動的通信成為可能。 作為 WebSockets 的擴展構建,該技術提供了補充功能和回退選擇,以確保在不同環境中的可靠通訊。 若要建立需即時共享數據的動態在線應用程式,例如聊天程式、團隊合作工具、即時更新和遊戲平台,Socket.IO JavaScript 客戶端庫是一個很好的選擇。

Socket io node.js(對開發者的運作方式):圖1 - Socket.IO:每個平台的雙向和低延遲通信。

Socket IO 的優勢

實時通訊

允許 HTTP 伺服器、客戶端、IO 應用程式和 IO 伺服器進行雙向即時通訊。 它非常適合需要實時數據更新的應用程式,因為它保證了低延遲的訊息傳遞。

事件驅動架構

使開發人員能夠輕鬆使用基於事件的範式來建立和管理定制事件。 降低管理複雜的客戶端-伺服器互動的複雜性。

跨瀏覽器相容性

在各種系統和瀏覽器上完美運行。 提供備選選擇 (例如延長輪詢) 在不支持 WebSockets 的情況下。

可擴展性

支持連接多個適配器,包括 Redis,以進行橫向連接擴展,使應用程式能夠同時連接和管理多個連接的客戶端。 由於其高效的資源利用設計,它可以用於高流量應用程式。

自動重新連接

在連線中斷的情況下,自動嘗試重新連接並永遠重新加入,以達到彈性和可靠性。可配置的重新連接邏輯,用於調節重新連接嘗試的頻率和性質。

房間支援

可以將連接到客戶端的插座組織成“房間”,這樣可以更輕鬆地將消息廣播給特定客戶端的插座對象或插座客戶端的子集。 支援動態進入和退出房間,這對於遊戲、聊天應用程式以及其他語言和團隊合作工具來說很有幫助。

中介軟體

允許事件的處理、事件資料的發送,以及透過中介軟體功能在接收處理程序之前進行消息的處理。 對於資料驗證聊天消息、聊天消息記錄和身份驗證等工作有益。

安全性

支持多項安全功能,包括授權、身份驗證和 CORS。 (跨來源資源共享) 設置。 集成 HTTPS 和其他安全協議,以保證安全通信途徑。

除錯和日誌記錄

集成的調試和日誌記錄功能有助於在代碼後進行問題診斷,以及程序行為的監控。 可調整的日誌級別允許您管理控制台日誌輸出的詳細程度。

創建和配置 Socket.io

Socket.IO 庫允許客戶端和伺服器進行實時、雙向和基於事件的通信。 以下是關於在 Node.js 程式中配置 Socket.IO 客戶端的逐步教程。

安裝所需套件

使用 npm 安裝 socket.io 和 express 套件:

npm install express
npm install socket.io
npm install express
npm install socket.io
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'npm install express npm install socket.io
VB   C#

創建伺服器

通過創建一個名為 server.js 的文件,建立具有 Socket.IO 集成的基礎 Express WebSocket 伺服器。

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// Serve static files from the "public" directory
app.use(express.static('public'));
// Handle socket connection
io.on('connection', (socket) => {
    console.log('a user connected');
    // Handle custom event from client
    socket.on('message', (msg) => {
        console.log('message received: ' + msg);
        // Broadcast the message to all clients
        io.emit('message', msg);
    });
    // Handle disconnection
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const PORT = process.env.PORT 
 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// Serve static files from the "public" directory
app.use(express.static('public'));
// Handle socket connection
io.on('connection', (socket) => {
    console.log('a user connected');
    // Handle custom event from client
    socket.on('message', (msg) => {
        console.log('message received: ' + msg);
        // Broadcast the message to all clients
        io.emit('message', msg);
    });
    // Handle disconnection
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const PORT = process.env.PORT 
 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
Private const express = require( 'express');
Private const http = require( 'http');
Private const socketIo = require( 'socket.io');
Private const app = express()
Private const server = http.createServer(app)
Private const io = socketIo(server)
' Serve static files from the "public" directory
app.use(express.static( 'public'));
' Handle socket connection
io.on( 'connection', (socket) =>
If True Then
	console.log( 'a user connected');
	socket.on( 'message', (msg) =>
	If True Then
		console.log( 'message received: ' + msg);
		io.emit( 'message', msg);
	End If
	)
	socket.on( 'disconnect', () =>
	If True Then
		console.log( 'user disconnected');
	End If
	)
End If
)
const PORT = process.env.PORT 3000
server.listen(PORT, Sub()
	console.log(`TypeOf Server Is running on port ${PORT}`)
End Sub)
VB   C#

Socket io node.js(對開發人員的工作原理):圖2 - 主控台輸出顯示伺服器正在執行於3000端口,有一位使用者連線,接收到的訊息是 Hello Hi。

建立客戶端

作為客戶端,創建一個名為 public 的目錄,並在其中創建一個名為 index.html 的文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Socket.IO Demo</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <h1>Socket.IO Demo</h1>
    <button onclick="sendMessage()">Send</button>
    <ul id="messages"></ul>
    <script>
        const socket = io();
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
        // Function to send a message to the server
        function sendMessage() {
            const msg = document.getElementById('messageInput').value;
            socket.emit('message', msg);
            document.getElementById('messageInput').value = '';
        }
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Socket.IO Demo</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <h1>Socket.IO Demo</h1>
    <button onclick="sendMessage()">Send</button>
    <ul id="messages"></ul>
    <script>
        const socket = io();
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
        // Function to send a message to the server
        function sendMessage() {
            const msg = document.getElementById('messageInput').value;
            socket.emit('message', msg);
            document.getElementById('messageInput').value = '';
        }
    </script>
</body>
</html>
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id="messages"></ul> <script> const socket = io();
"messages"></ul> (Of script) const socket = io()
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id="messages"></ul> <script> const socket
"sendMessage()"> Send</button> <ul id="messages"></ul> (Of script) const socket
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id
"/socket.io/socket.io.js"></script> </head> (Of body) (Of h1) Socket.IO Demo</h1> <button onclick="sendMessage()"> Send</button> <ul id
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> <body> <h1> Socket.IO Demo</h1> <button onclick
"width=device-width, initial-scale=1.0"> (Of title) Socket.IO Demo</title> <script src="/socket.io/socket.io.js"></script> </head> (Of body) (Of h1) Socket.IO Demo</h1> <button onclick
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title> Socket.IO Demo</title> <script src
"viewport" content="width=device-width, initial-scale=1.0"> (Of title) Socket.IO Demo</title> <script src
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content
"UTF-8"> <meta name="viewport" content
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Private Private <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name
"en"> (Of head) <meta charset="UTF-8"> <meta name
Private Private Private Private Private Private Private Private <(Not DOCTYPE) html> <html lang="en"> (Of head) <meta charset
		' Listen for messages from the server
		socket.on( 'message', (msg) =>
		If True Then
			const li = document.createElement( 'li');
			li.textContent = msg
			document.getElementById( 'messages').appendChild(li);
		End If
		)
		' Function to send a message to the server
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		@function sendMessage()
'		{
'			const msg = document.getElementById('messageInput').value;
'			socket.emit('message', msg);
''INSTANT VB TODO TASK: The following line uses invalid syntax:
''			document.getElementById('messageInput').value = ''; } </script> </body> </html>
VB   C#

Socket io node.js (開發者如何使用):圖 3 - 輸出:Socket.IO 演示網頁,包含訊息輸入框和發送按鈕。 發送到伺服器的兩個訊息也顯示出來:「Hello」「Hi」。

入門 IronPDF

我們可以結合構建互動式網頁應用程式,快速生成和提供PDF。 IronPDF 使用 Socket.IO 進行動態 PDF 生成,以實現即時的實時 socket 通信。 您將透過此指南學習如何設置一個結合 IronPDF 和 Socket.IO 的 Node.js 專案。

什麼是 IronPDF?

使用強大的 IronPDF Node.js 庫來創建、修改和轉換 PDF 文件。 它使程式設計師能夠處理現有的 PDF、將 HTML 轉換為 PDF,並執行與 PDF 相關的一些基於程式設計的任務。 IronPDF 提供靈活且直觀的方式來創建高品質的 PDF 文件,使其成為需要動態 PDF 生成和處理的應用程式的絕佳選擇。

Socket io node.js(它如何為開發者運作):圖4 - IronPDF for Node.js:Node.js 的 PDF 函式庫

IronPDF 的主要特點

IronPDF 的一些主要功能如下:

1. 將 HTML 轉換為 PDF

我們可以使用 IronPDF 將 HTML 文件的內容轉換為 PDF 文檔。 透過這個功能,可以使用最新版本的HTML5、CSS3和JavaScript將網頁內容轉換成美觀的PDF出版物。

2. 製作和編輯PDFs

可以將文字、圖像、表格及其他材料添加到新生成的程序化 PDF 文件中。 IronPDF 允許您開啟和編輯現有的 PDF 文件。 您可以新增或修改 PDF 的內容,亦可移除特定部分。

3. 精緻的佈局和樣式

使用 CSS 來設計使用者瀏覽 PDF 時的瀏覽器樣式。 這包括對複雜布局、字體、顏色和其他設計元素的支援。 使用 JavaScript 渲染 HTML 內容使您的瀏覽器能夠將動態內容添加到 PDF。

IronPDF 安裝

使用 Node 套件管理器安裝所需的 IronPDF 套件,以啟用 IronPDF 功能。 添加以下命令:

npm install @ironsoftware/ironpdf
npm install @ironsoftware/ironpdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'npm install @ironsoftware/ironpdf
VB   C#

客戶代碼

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
  <title>WebSocket Client</title>
</head>
<body>
  <button onclick="sendMessage()">Send</button>
  <script>
            const socket = io('http://localhost:3000');
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
    function sendMessage() {
      const ITitle = document.getElementById('Title');
      const IContent = document.getElementById('content');
      const message = {
        Title:ITitle.value,
        content:IContent.value
      };
      //ws.send(message);
      socket.emit('message', message);
      ITitle.value = '';
      IContent.value = '';
    }
  </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
  <title>WebSocket Client</title>
</head>
<body>
  <button onclick="sendMessage()">Send</button>
  <script>
            const socket = io('http://localhost:3000');
        // Listen for messages from the server
        socket.on('message', (msg) => {
            const li = document.createElement('li');
            li.textContent = msg;
            document.getElementById('messages').appendChild(li);
        });
    function sendMessage() {
      const ITitle = document.getElementById('Title');
      const IContent = document.getElementById('content');
      const message = {
        Title:ITitle.value,
        content:IContent.value
      };
      //ws.send(message);
      socket.emit('message', message);
      ITitle.value = '';
      IContent.value = '';
    }
  </script>
</body>
</html>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script> <title> WebSocket Client</title> </head> <body> <button onclick="sendMessage()"> Send</button> <script> const socket = io('http: socket.on('message', (msg) => { const li = document.createElement('li'); li.textContent = msg; document.getElementById('messages').appendChild(li); }); @function sendMessage() { const ITitle = document.getElementById('Title'); const IContent = document.getElementById('content'); const message = { Title:ITitle.value, content:IContent.value }; socket.emit('message', message); ITitle.value = ''; IContent.value = ''; } </script> </body> </html>
VB   C#

Socket io node.js(它如何為開發人員工作):圖5 - 輸入數據和標題的文本,然後點擊發送按鈕將消息發送到服務器。

發送訊息並使用IronPDF生成PDF

讓我們仔細看看程式碼,看看如何在 Node.js 應用程式中使用 Socket.IO 和 IronPDF 即時創建 PDF。

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const IronPdf = require("@ironsoftware/ironpdf");
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const document=IronPdf.PdfDocument;
app.use(express.static('public'));
io.on('connection', (socket) => {
    console.log('a user connected');
    socket.on('generatePDF', async (data) => {
        try {
            const pdfPath = await generatePDF(data);
            socket.emit('pdfGenerated', { pdfUrl: pdfPath });
        } catch (error) {
            socket.emit('error', error.message);
        }
    });
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const generatePDF = async (data) => {
    console.log('pdf generated started');
    const htmlContent = `<h1>${data.title}${data.content}</h1>`;
    console.log(`Received message into HTML content: ${htmlContent}`);
    const pdf = await document.fromHtml(htmlContent);
    const filePath = `./public/pdfs/${Date.now()}.pdf`;
    await pdf.saveAs(filePath);
    console.log('pdf generated completed');
    return filePath.replace('./public', '');
};
const PORT = process.env.PORT 
 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const IronPdf = require("@ironsoftware/ironpdf");
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const document=IronPdf.PdfDocument;
app.use(express.static('public'));
io.on('connection', (socket) => {
    console.log('a user connected');
    socket.on('generatePDF', async (data) => {
        try {
            const pdfPath = await generatePDF(data);
            socket.emit('pdfGenerated', { pdfUrl: pdfPath });
        } catch (error) {
            socket.emit('error', error.message);
        }
    });
    socket.on('disconnect', () => {
        console.log('user disconnected');
    });
});
const generatePDF = async (data) => {
    console.log('pdf generated started');
    const htmlContent = `<h1>${data.title}${data.content}</h1>`;
    console.log(`Received message into HTML content: ${htmlContent}`);
    const pdf = await document.fromHtml(htmlContent);
    const filePath = `./public/pdfs/${Date.now()}.pdf`;
    await pdf.saveAs(filePath);
    console.log('pdf generated completed');
    return filePath.replace('./public', '');
};
const PORT = process.env.PORT 
 3000;
server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
Private const express = require( 'express');
Private const http = require( 'http');
Private const socketIo = require( 'socket.io');
Private const IronPdf = require("@ironsoftware/ironpdf")
Private const app = express()
Private const server = http.createServer(app)
Private const io = socketIo(server)
Private const document=IronPdf.PdfDocument
app.use(express.static( 'public'));
io.on( 'connection', (socket) =>
If True Then
	console.log( 'a user connected');
	socket.on( 'generatePDF', async(data) =>
	If True Then
		Try
			const pdfPath = Await generatePDF(data)
			socket.emit( 'pdfGenerated', { pdfUrl: pdfPath });
		Catch e1 As [error]
			socket.emit( '@error', @error.message);
		End Try
	End If
	)
	socket.on( 'disconnect', () =>
	If True Then
		console.log( 'user disconnected');
	End If
	)
End If
)
'INSTANT VB TODO TASK: Lambda expressions and anonymous methods are not converted by Instant VB if local variables of the outer method are referenced within the anonymous method:
const generatePDF = async(data) =>
If True Then
	console.log( 'pdf generated started');
	const htmlContent = `(Of h1) $
	If True Then
		data.title
	End If
	$
	If True Then
		data.content
	End If
	</h1>`
	console.log(`Received message into HTML content:= ${htmlContent}`)
	const pdf = Await document.fromHtml(htmlContent)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'	const filePath = `./public/pdfs/$
'	{
'		@Date.now()
'	}
	.pdf`
	Await pdf.saveAs(filePath)
	console.log( 'pdf generated completed');
	Return filePath.replace( './public', '');
End If
const PORT = process.env.PORT 3000
'INSTANT VB TODO TASK: Lambda expressions and anonymous methods are not converted by Instant VB if local variables of the outer method are referenced within the anonymous method:
server.listen(PORT, () =>
VB   C#

上述代碼在 Node.js 應用中結合了 IronPDF 用於動態 PDF 生成和 Socket.IO 用於實時通訊。 必要的模組,如用於即時通訊的 socket.io、用於 PDF 生成的 IronPDF、一個用於生成客戶端和通話伺服器的 HTTP 伺服器和客戶端及伺服器端實例,以及用於構建網頁伺服器的 express,首先在伺服器端代碼中導入。 靜態文件會在公共目錄中創建,並由 Express 應用程序提供服務。 接下來,服務器透過偵聽 Socket.IO 連接來處理自定義的 generatePDF 事件。 伺服器使用IronPDF來 從 HTML 內容創建 PDF 根據客戶提供的數據在接收到此事件時處理。 PDF 然後被儲存到檔案系統中,客戶端接著從伺服器接收到 PDF 生成事件,並且獲得所創建 PDF 的檔案路徑。

Socket io node.js(開發者如何使用):圖 6 - 控制台日誌

在伺服器和客戶端上通過一個 HTML 文件設置了一個簡單的表單來收集標題和內容。 提交後,表單會停止執行預設的提交行為,並將表單資料連同 generatePDF 事件一起發送到伺服器。

Socket io node.js(開發者如何使用):圖7 - 使用IronPDF創建的輸出PDF。

此外,當客戶端監聽到 PDF 生成事件後,會顯示一個下載鏈接,以獲取已創建的 PDF 的 URL。 此外,用戶端會持續監聽任何錯誤事件,並在發生錯誤時顯示警告以及錯誤訊息。 此集成展示了如何使用 Socket.IO 和 IronPDF 构建一個響應式網頁應用程式,讓使用者可以即時創建和接收 PDF。

結論

在 Node.js 應用程式中,整合一個強大的解決方案,用於互動式、即時的 PDF 生產。 Socket.IO 客戶與 IronPDF. 開發者可以利用 Socket.IO 客戶端的即時通訊功能構建響應式應用程式,為使用者提供快速反饋,這可以大大改善伺服器和使用者的體驗。 結合 IronPDF 可從 HTML 內容動態開發出高品質的 PDF 文件。 這使得它非常適合用於像內容管理系統、報告工具和需要快速生成文檔的發票系統等應用程式。

此配置說明了動態內容創建和即時通訊如何協同工作。 它展示了如何以無縫方式運用尖端的網路技術,為棘手的問題提供可靠且有效的解決方案。 有了 IronPDF 處理 PDF 生成和 Socket.IO 處理即時數據傳輸,開發人員可以專注於創建功能豐富的網頁應用程式,為使用者提供顯著且即時的結果。 此方法除了增強線上客戶端應用程式的功能性和可用性外,還為互動和數據驅動的應用程式開發創造了新的機會。

通過結合 IronPDFIronSoftware的產品整合到您的開發堆疊中,我們可以確保客戶和最終用戶獲得功能豐富的高端軟體解決方案。 此外,這將支持項目和流程的優化。

IronPDF 提供一個 免費試用 起價 $749,使它們成為現代軟體開發專案中可靠的合作夥伴。

< 上一頁
toastify npm(如何為開發者工作)
下一個 >
WebSockets Node.js js(開發人員如何運作)

準備開始了嗎? 版本: 2024.9 剛剛發布

免費 npm 安裝 查看許可證 >