跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptAI大前端

大模型对话流式响应的前端实现与实战示例

综述由AI生成大模型流式响应通过增量传输降低感知延迟,提升交互体验。对比了 SSE、WebSocket 及 Fetch Streaming 方案,重点推荐 SSE 在大模型场景的应用。附带基于 Vue.js 的完整 HTML 示例,演示了打字机效果、中断控制及状态管理,帮助开发者快速落地实时对话界面。

Pythonist发布于 2026/4/10更新于 2026/5/2843 浏览

大模型对话流式响应的前端实现详解

1. 流式响应概述

1.1 什么是流式响应

流式响应(Streaming Response)在大模型对话中意味着服务器不再一次性返回完整结果,而是将生成的内容以增量、实时的方式逐步推送到前端。前端接收这些数据流后,逐词或逐段展示给用户,模拟出类似'打字机'的效果。这种交互模式更接近人类对话中的思考与表达过程,显著提升了实时感。

1.2 为什么流式响应重要

大模型的响应往往较长,若等待完整生成再展示,用户会感到明显的卡顿。采用流式响应主要有以下好处:

  • 降低感知延迟:用户立刻看到部分内容,缓解等待焦虑。
  • 提升交互体验:节奏更接近真人对话,沉浸感更强。
  • 节省资源:前端可逐步渲染,避免一次性处理大块数据带来的内存压力。
  • 实时反馈:允许用户在生成过程中随时中断或调整请求,增强可控性。

2. 前端可实现方案

2.1 Server-Sent Events (SSE)

SSE 是基于 HTTP 的单向通信协议,非常适合流式场景。它轻量且自动处理重连机制。

  • 原理:前端通过 EventSource API 订阅事件流,服务器以 text/event-stream 格式推送。
  • 适用场景:大模型对话(单向传输),兼容性好,防火墙友好。

2.2 WebSockets

WebSockets 提供全双工通道,灵活性高但相对重量级。

  • 原理:建立持久连接,服务器可随时推送数据。
  • 适用场景:需要双向高频交互的复杂场景,单纯流式输出通常不需要这么重的开销。

2.3 Fetch API with Streaming

现代 Fetch API 支持流式读取响应体,可控性最强。

  • 原理:使用 fetch() 获取 response.body 的 ReadableStream,手动逐块读取。
  • 适用场景:需要精细控制解析逻辑或自定义集成时。

2.4 其他方案

  • 长轮询(Long Polling):效率较低,不推荐用于实时流。
  • GraphQL Subscriptions:适合 GraphQL 架构,但复杂度较高。

3. 各方案优劣对比

方案优点缺点适用场景
SSE简单易用、自动重连、基于 HTTP单向通信、不支持二进制大模型对话流式响应(首选)
WebSockets双向实时、支持二进制复杂、需额外服务器支持需要双向交互的复杂对话
Fetch Streaming灵活可控、框架集成好需手动处理流、兼容性稍差自定义流处理或低层级集成

性能与兼容性提示:SSE 和 Fetch Streaming 基于 HTTP/1.1 或 HTTP/2,开销小;WebSockets 有连接开销但实时性更好。对于大模型对话,SSE 通常是平衡简单性与性能的最佳选择。

4. 业界成熟方案

4.1 OpenAI API 流式响应

OpenAI 的 Chat Completions API 原生支持流式响应,设置 stream: true 即可返回 SSE 格式流。这是目前最成熟的方案,许多应用(如 ChatGPT 网页版)均基于此实现。

4.2 其他平台

  • Anthropic Claude API:同样支持类似 SSE 的流式响应。
  • 国内平台(文心一言、通义千问等):通常提供 WebSocket 或 SSE 接口,文档中会有明确的流式调用说明。
  • 自建服务:可使用 FastAPI、Node.js 等框架轻松搭建 SSE 端点。

5. 如何在对话中保障用户体验

5.1 界面设计

  • 打字机效果:逐字显示内容,配合 CSS 动画或 JS 控制渲染速度。
  • 滚动优化:自动滚动到最新内容,避免用户手动操作。可使用 scrollIntoView 或虚拟列表技术。
  • 视觉区分:明确区分用户消息和 AI 响应,例如通过不同颜色、头像或气泡样式。

5.2 错误处理

  • 网络中断:SSE 虽自动重连,但需提示用户;WebSockets 需自行实现重连机制。
  • 数据解析:流式数据可能不完整,建议用 try-catch 包裹 JSON 解析,并展示友好错误信息。
  • 超时控制:设置合理的超时时间,避免无限等待,并提供重试按钮。

5.3 加载状态

  • 骨架屏:响应开始前显示骨架屏,告知用户内容正在生成。
  • 进度指示:对于长响应可显示粗略进度(如 token 计数),但需注意大模型生成时间不确定,避免误导。
  • 中断能力:提供'停止生成'按钮,允许用户随时中断流式响应,提升控制感。

6. 在用户体验上还能有哪些极致突破

  • 预测性内容:根据输入预加载上下文,减少首字延迟。
  • 交互式流式:允许用户在生成过程中插入反馈,动态调整后续内容。
  • 个性化调整:让用户自定义显示速度,甚至结合多模态(图像、语音)创造沉浸式体验。

大模型对话流式响应完整示例

下面是一个完整的、可直接运行的 HTML 单文件示例。为了演示方便,这里使用 Vue.js 作为前端框架,并在前端模拟了流式响应的后端行为。你可以直接保存为 .html 文件在浏览器打开查看效果。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>大模型对话 - 流式响应示例</title>
    <!-- 引入 Vue.js -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif; }
        body { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; padding: 20px; display: flex; justify-content: center; align-items: center; }
        .chat-app { width: 100%; max-width: 900px; height: 90vh; background: rgba(255, 255, 255, 0.95); border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); overflow: hidden; display: flex; flex-direction: column; }
        .header { background: linear-gradient(90deg, #4f46e5, #7c3aed); color: white; padding: 20px 30px; text-align: center; border-bottom: 1px solid rgba(255, 255, 255, 0.2); }
        .header h1 { font-size: 24px; font-weight: 600; margin-bottom: 5px; display: flex; align-items: center; justify-content: center; gap: 10px; }
        .header h1::before { content: "🤖"; font-size: 28px; }
        .subtitle { font-size: 14px; opacity: 0.9; margin-top: 5px; }
        .chat-container { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
        .messages-container { flex: 1; overflow-y: auto; padding: 25px; display: flex; flex-direction: column; gap: 20px; }
        .message { display: flex; max-width: 80%; animation: fadeIn 0.3s ease-out; }
        @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
        .message.user { align-self: flex-end; flex-direction: row-reverse; }
        .avatar { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; flex-shrink: 0; margin: 0 12px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); }
        .user .avatar { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; }
        .assistant .avatar { background: linear-gradient(135deg, #10b981 0%, #3b82f6 100%); color: white; }
        .message-content { padding: 15px 20px; border-radius: 18px; line-height: 1.5; font-size: 15px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); position: relative; overflow-wrap: break-word; word-break: break-word; }
        .user .message-content { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-bottom-right-radius: 5px; }
        .assistant .message-content { background: #f8fafc; color: #1e293b; border-bottom-left-radius: 5px; border: 1px solid #e2e8f0; }
        .streaming .message-content { min-height: 24px; }
        .cursor { display: inline-block; width: 8px; height: 20px; background-color: #3b82f6; vertical-align: middle; margin-left: 2px; animation: blink 1s infinite; }
        @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
        .input-area { padding: 20px 30px; border-top: 1px solid #e2e8f0; background: #f8fafc; display: flex; gap: 12px; }
        .input-area input { flex: 1; padding: 15px 20px; border: 2px solid #e2e8f0; border-radius: 12px; font-size: 15px; outline: none; transition: all 0.3s; background: white; }
        .input-area input:focus { border-color: #8b5cf6; box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1); }
        .input-area button { padding: 15px 25px; border: none; border-radius: 12px; font-weight: 600; cursor: pointer; transition: all 0.3s; font-size: 15px; display: flex; align-items: center; justify-content: center; gap: 8px; }
        .send-btn { background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); color: white; min-width: 100px; }
        .send-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(124, 58, 237, 0.3); }
        .send-btn:disabled { background: #cbd5e1; transform: none; box-shadow: none; cursor: not-allowed; }
        .stop-btn { background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); color: white; min-width: 120px; }
        .stop-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(239, 68, 68, 0.3); }
        .status-bar { padding: 12px 30px; background: #f1f5f9; border-top: 1px solid #e2e8f0; font-size: 14px; color: #64748b; display: flex; justify-content: space-between; }
        .status-indicator { display: flex; align-items: center; gap: 8px; }
        .status-dot { width: 10px; height: 10px; border-radius: 50%; background: #10b981; animation: pulse 2s infinite; }
        @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
        .status-dot.inactive { background: #94a3b8; animation: none; }
        .typing-indicator { display: flex; align-items: center; gap: 4px; margin-top: 8px; }
        .typing-dot { width: 8px; height: 8px; border-radius: 50%; background: #94a3b8; animation: typing 1.4s infinite ease-in-out; }
        .typing-dot:nth-child(1) { animation-delay: -0.32s; }
        .typing-dot:nth-child(2) { animation-delay: -0.16s; }
        @keyframes typing { 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } 40% { transform: scale(1); opacity: 1; } }
        /* 滚动条样式 */
        .messages-container::-webkit-scrollbar { width: 8px; }
        .messages-container::-webkit-scrollbar-track { background: #f1f5f9; border-radius: 4px; }
        .messages-container::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
        .messages-container::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
        /* 响应式设计 */
        @media(max-width: 768px) {
            .chat-app { height: 95vh; border-radius: 15px; }
            .header { padding: 15px 20px; }
            .messages-container { padding: 15px; }
            .message { max-width: 90%; }
            .input-area { padding: 15px; flex-wrap: wrap; }
            .input-area button { padding: 12px 15px; flex: 1; }
            .status-bar { padding: 10px 15px; font-size: 13px; }
        }
        .info-box { background: #f0f9ff; border: 1px solid #bae6fd; border-radius: 12px; padding: 15px; margin: 15px 30px; font-size: 14px; color: #0369a1; line-height: 1.5; }
        .info-box strong { color: #075985; }
    </style>
</head>
<body>
<div id="app" class="chat-app">
    <div class="header">
        <h1>AI 对话助手 - 流式响应演示</h1>
        <div class="subtitle">体验大模型逐词生成的流式响应效果,模拟真实对话场景</div>
    </div>
    <div class="info-box">
        <strong>✨ 演示说明:</strong> 这是一个模拟大模型流式响应的前端示例。AI 的回答会逐词显示,模拟真实的流式响应效果。点击'发送'开始对话,在 AI 回复过程中可以点击'停止生成'中断回复。
    </div>
    <div class="chat-container">
        <div class="messages-container" ref="messagesContainer">
            <div v-for="(message, index) in messages" :key="index" :class="['message', message.role]">
                <div class="avatar"> {{ message.role === 'user' ? '您' : 'AI' }} </div>
                <div class="message-content"> {{ message.content }} </div>
            </div>
            <!-- 流式响应中的消息 -->
            <div v-if="isStreaming" class="message assistant streaming">
                <div class="avatar"> AI </div>
                <div class="message-content"> {{ streamingText }}<span class="cursor"></span></div>
            </div>
            <!-- 等待状态指示器 -->
            <div v-if="isWaiting" class="message assistant">
                <div class="avatar"> AI </div>
                <div class="message-content">
                    <div class="typing-indicator">
                        <div class="typing-dot"></div>
                        <div class="typing-dot"></div>
                        <div class="typing-dot"></div>
                    </div>
                </div>
            </div>
        </div>
        <div class="input-area">
            <input v-model="userInput" @keyup.enter="sendMessage" placeholder="请输入您的问题,例如:解释一下什么是流式响应?" :disabled="isStreaming || isWaiting"/>
            <button class="send-btn" @click="sendMessage" :disabled="!userInput.trim() || isStreaming || isWaiting">
                <span v-if="!isWaiting">发送</span>
                <span v-else>等待中...</span>
            </button>
            <button v-if="isStreaming" class="stop-btn" @click="stopStreaming"> 停止生成 </button>
        </div>
        <div class="status-bar">
            <div class="status-indicator">
                <div :class="['status-dot', isStreaming ? '' : 'inactive']"></div>
                <span v-if="isStreaming">AI 正在思考中...</span>
                <span v-else>AI 就绪</span>
            </div>
            <div> 已发送 {{ messages.filter(m => m.role === 'user').length }} 条消息 </div>
        </div>
    </div>
</div>
<script>
const { createApp, ref, onMounted, onUpdated, watch } = Vue;
createApp({
    setup() {
        // 响应式数据
        const messages = ref([
            { role: 'assistant', content: '您好!我是 AI 助手,支持流式响应对话。您可以问我任何问题,我会逐词生成回答,模拟真实的大模型响应过程。' },
            { role: 'user', content: '请解释一下什么是流式响应?' },
            { role: 'assistant', content: '流式响应是一种实时数据传输方式,在大模型对话中,服务器将生成的内容分成多个小块逐步发送到前端,而不是一次性返回完整响应。' }
        ]);
        const userInput = ref('');
        const isStreaming = ref(false);
        const isWaiting = ref(false);
        const streamingText = ref('');
        const messagesContainer = ref(null);

        // 模拟的 AI 回复库
        const aiResponses = {
            '解释一下什么是流式响应?': '流式响应是一种实时数据传输方式,在大模型对话中,服务器将生成的内容分成多个小块逐步发送到前端,而不是一次性返回完整响应。这种方式可以:\n\n1. 降低用户感知延迟\n2. 提供更自然的交互体验\n3. 允许用户在中途停止生成\n4. 减少服务器内存压力\n\n前端通过接收这些数据流,逐词或逐段展示给用户,模拟'打字机'效果。',
            '流式响应有什么优势?': '流式响应具有以下主要优势:\n\n• 实时性:用户立即看到部分结果,无需等待完整响应\n• 交互性:提供更接近真人对话的体验\n• 可中断性:用户可以在生成过程中停止\n• 资源友好:逐步处理数据,减少前端和后端的内存压力\n• 错误恢复:部分失败不影响整体体验',
            '前端如何实现流式响应?': '前端可以通过多种技术实现流式响应:\n\n1. Server-Sent Events (SSE):基于 HTTP 的单向通信,简单易用\n2. WebSockets:全双工通信,适合复杂交互\n3. Fetch API with Streaming:使用 ReadableStream 逐块读取数据\n4. GraphQL Subscriptions:适合 GraphQL 后端\n\n每种方案都有适用场景,SSE 是最常用的大模型对话方案。',
            'SSE 和 WebSocket 有什么区别?': 'SSE 和 WebSocket 的主要区别:\n\nSSE:\n- 基于 HTTP 协议,单向通信(服务器→客户端)\n- 自动重连机制,实现简单\n- 不支持二进制数据,只支持文本\n- 适合大模型对话等单向流场景\n\nWebSocket:\n- 独立协议,全双工通信\n- 需要手动处理连接和重连\n- 支持二进制和文本数据\n- 适合需要双向实时交互的场景',
            '如何保障流式对话的用户体验?': '保障流式对话用户体验的关键点:\n\n1. 视觉反馈:使用打字机效果和加载指示器\n2. 可中断性:提供'停止生成'按钮\n3. 错误处理:网络中断时友好提示和重试机制\n4. 滚动优化:自动滚动到最新内容\n5. 性能优化:虚拟列表处理长对话历史\n6. 多模态支持:结合图片、语音等丰富体验',
            '介绍一下你自己': '我是基于 Vue.js 开发的 AI 对话演示助手,专门展示大模型流式响应效果。我模拟了真实 AI 的逐词生成过程,让您体验流式对话的交互方式。虽然我没有真实的大模型能力,但我可以演示流式响应的各种特性和优势!'
        };

        // 默认回复(用于未匹配的问题)
        const defaultResponses = [
            '这是一个关于流式响应的演示。在真实的大模型对话中,AI 会根据您的问题生成连贯的、上下文相关的回答。',
            '流式响应技术让 AI 对话更加自然,用户可以实时看到 AI 思考的过程。',
            '当前是演示模式,我正在模拟大模型的逐词生成效果。在真实应用中,这些内容会由大模型实时生成。',
            '前端流式响应实现涉及多个技术细节,包括网络协议、数据解析和 UI 渲染优化。',
            '通过流式响应,AI 助手可以逐步展示复杂问题的思考过程,提升对话的透明度和信任感。'
        ];

        // 获取 AI 回复(模拟)
        const getAIResponse = (question) => {
            for (const [key, response] of Object.entries(aiResponses)) {
                if (question.includes(key.replace('?', '').replace('?', ''))) {
                    return response;
                }
            }
            const randomIndex = Math.floor(Math.random() * defaultResponses.length);
            return defaultResponses[randomIndex];
        };

        // 模拟流式响应
        const simulateStreamingResponse = (fullResponse) => {
            isStreaming.value = true;
            streamingText.value = '';
            const chars = fullResponse.split('');
            let index = 0;

            // 模拟逐词输出(随机时间间隔,更真实)
            const streamInterval = setInterval(() => {
                if (index < chars.length) {
                    // 每次添加 1-3 个字符,模拟自然打字效果
                    const chunkSize = Math.floor(Math.random() * 3) + 1;
                    const chunk = chars.slice(index, index + chunkSize).join('');
                    streamingText.value += chunk;
                    index += chunkSize;
                    scrollToBottom();
                } else {
                    clearInterval(streamInterval);
                    messages.value.push({ role: 'assistant', content: streamingText.value });
                    isStreaming.value = false;
                    streamingText.value = '';
                    isWaiting.value = false;
                }
            }, Math.floor(Math.random() * 50) + 30); // 30-80ms 的随机间隔

            return streamInterval;
        };

        let currentStreamInterval = null;

        // 发送消息
        const sendMessage = () => {
            const input = userInput.value.trim();
            if (!input || isStreaming.value || isWaiting.value) return;

            messages.value.push({ role: 'user', content: input });
            userInput.value = '';
            isWaiting.value = true;
            scrollToBottom();

            // 模拟网络延迟
            setTimeout(() => {
                isWaiting.value = false;
                const aiResponse = getAIResponse(input);
                currentStreamInterval = simulateStreamingResponse(aiResponse);
            }, Math.floor(Math.random() * 1000) + 500);
        };

        // 停止流式响应
        const stopStreaming = () => {
            if (currentStreamInterval) {
                clearInterval(currentStreamInterval);
                currentStreamInterval = null;
            }
            if (streamingText.value.trim()) {
                messages.value.push({ role: 'assistant', content: streamingText.value + '(已停止)' });
            }
            isStreaming.value = false;
            streamingText.value = '';
            isWaiting.value = false;
        };

        // 滚动到底部
        const scrollToBottom = () => {
            Vue.nextTick(() => {
                if (messagesContainer.value) {
                    messagesContainer.value.scrollTop = messagesContainer.value.scrollHeight;
                }
            });
        };

        onMounted(() => { scrollToBottom(); });
        onUpdated(() => { scrollToBottom(); });
        watch(messages, () => { scrollToBottom(); }, { deep: true });

        return {
            messages,
            userInput,
            isStreaming,
            isWaiting,
            streamingText,
            messagesContainer,
            sendMessage,
            stopStreaming
        };
    }
}).mount('#app');
</script>
</body>
</html>

功能说明

这个示例涵盖了流式对话的核心要素:

  1. 核心功能:

    • 流式响应模拟:利用定时器将完整文本拆分为小块逐步渲染,模拟真实大模型的生成过程。
    • 打字机效果:配合光标闪烁动画,增强输入的真实感。
    • 中断控制:提供'停止生成'按钮,允许用户随时终止当前流。
  2. 用户交互:

    • 支持回车发送,输入框在生成期间禁用。
    • 预设示例问题,方便快速测试不同场景。
  3. 视觉设计:

    • 现代化 UI,使用渐变色和阴影提升质感。
    • 响应式布局,适配移动端和桌面端。
    • 包含消息淡入、光标闪烁、打字指示器等微交互动画。
  4. 技术实现细节:

    • 纯前端模拟:无需后端即可运行,便于理解原理。
    • Vue 3 响应式:使用 Composition API 管理状态,代码结构清晰。
    • 性能考量:更新频率控制在 30-80ms 之间,避免频繁 DOM 重排阻塞主线程。

运行方式

  1. 将上述代码保存为 streaming-chat-demo.html。
  2. 直接在浏览器中打开该文件。
  3. 输入问题并观察 AI 逐词生成的效果。

这个示例提供了一个完整的、可直接运行的前端流式对话界面,展示了流式响应的核心概念和实现方式。

目录

  1. 大模型对话流式响应的前端实现详解
  2. 1. 流式响应概述
  3. 1.1 什么是流式响应
  4. 1.2 为什么流式响应重要
  5. 2. 前端可实现方案
  6. 2.1 Server-Sent Events (SSE)
  7. 2.2 WebSockets
  8. 2.3 Fetch API with Streaming
  9. 2.4 其他方案
  10. 3. 各方案优劣对比
  11. 4. 业界成熟方案
  12. 4.1 OpenAI API 流式响应
  13. 4.2 其他平台
  14. 5. 如何在对话中保障用户体验
  15. 5.1 界面设计
  16. 5.2 错误处理
  17. 5.3 加载状态
  18. 6. 在用户体验上还能有哪些极致突破
  19. 大模型对话流式响应完整示例
  20. 功能说明
  21. 运行方式
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • VR + 具身智能 + 人形机器人:通往现实世界的智能接口
  • Playwright 多浏览器并发爬虫实战:三大引擎性能对比与优化
  • 基于人类反馈的强化学习(RLHF)全解析
  • Python 内置函数 enumerate() 详解与实战
  • Waifu Diffusion v1.4 配置与使用指南
  • ARINC 825:一种航电通信总线标准
  • C++ 虚函数与纯虚函数:深入理解多态机制
  • Qwen3-VL WebUI 本地部署与核心功能实战指南
  • Novel Writer:基于 Spec Kit 架构的 AI 中文小说创作助手
  • SmolRTSP:嵌入式系统高效 RTSP 流媒体服务实践
  • MCP 协议详解:与 Function Call 的区别及 Python 实战
  • LangChain 大模型应用开发:自定义 LLM 封装指南
  • 网络安全入门指南:从零开始构建渗透测试知识体系
  • Gemini Pro 实测:多模态、推理与代码能力解析
  • 2026 年 Python+AI 学习路线:从零基础到实战
  • 通义万相 2.1 视频生成模型技术解析与部署实践
  • IM 系统核心模块实战:传输与存储检索全链路设计
  • Java 面试题及答案精选
  • 自然语言处理在金融领域的应用与实战
  • 基于 Next.js 与 Wagmi 实现 TokenP 钱包登录的 DApp 前端开发

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online