Loading...
正在加载...
请稍候

HTMX 使用情况完整分析报告

✨步子哥 (steper) 2025年11月13日 02:33

📋 执行摘要

本报告对智柴论坛项目中 HTMX 的使用情况进行了全面分析,包括配置、使用模式、场景分类、后端集成、事件处理等方面。项目采用 HTMX 1.9.12 版本,主要用于实现单页应用(SPA)风格的页面局部更新,减少整页刷新,提升用户体验。

关键发现:

  • ✅ HTMX 已深度集成到项目架构中
  • ✅ 后端完整支持 HTMX 请求检测和响应
  • ✅ 实现了完善的错误处理和事件监听机制
  • ⚠️ 部分场景存在过度使用或使用不当的情况
  • ⚠️ 缺少统一的 HTMX 使用规范和最佳实践文档

1. HTMX 配置与初始化

1.1 版本与加载

位置: views/layouts/base.html:45

<script src="https://unpkg.com/htmx.org@1.9.12" 
        integrity="sha384-ujb1lZYygJmzgSwoxRggbCHcjc0rB2XoQrxeTUQyRjrOnlCoYta87iKBWq3EsdM2" 
        crossorigin="anonymous"></script>

配置特点:

  • 使用 CDN 加载,版本固定为 1.9.12
  • 启用了 SRI(Subresource Integrity)安全校验
  • 全局加载,所有页面自动可用

1.2 CSRF Token 自动注入

位置: views/layouts/base.html:70-94

项目实现了自动 CSRF Token 注入机制:

// 配置 htmx 自动添加 CSRF token 到请求头
if (typeof htmx !== 'undefined' && csrfToken) {
    document.body.addEventListener('htmx:configRequest', function(event) {
        const method = event.detail.verb || event.detail.method || 'GET';
        if (['post', 'put', 'delete'].includes(method.toLowerCase())) {
            event.detail.headers['X-CSRF-Token'] = csrfToken;
        }
    });
}

特点:

  • 自动为所有 POST/PUT/DELETE 请求添加 CSRF Token
  • 通过 htmx:configRequest 事件统一处理
  • 兼容表单字段和请求头两种方式

1.3 URL 修正机制

位置: static/js/app-main.js:2-9

document.addEventListener('htmx:configRequest', function (e) {
    if (e.detail.path === '/') {
        const currentOrigin = window.location.origin;
        const currentPort = window.location.port ? ':' + window.location.port : '';
        e.detail.path = currentOrigin + currentPort + '/';
        console.log('🔧 HTMX URL corrected from "/" to:', e.detail.path);
    }
});

作用: 修正根路径请求,确保跨端口/跨域场景下的正确路由。


2. HTMX 属性使用统计

2.1 核心属性使用频率

属性 使用次数 主要用途
hx-get 35+ 页面导航、内容加载
hx-post 12+ 表单提交(登录、注册、创建主题、回复)
hx-put 3 编辑主题、编辑回复
hx-target 50+ 指定更新目标元素(主要是 #content
hx-swap 15+ 内容替换方式(innerHTMLouterHTML
hx-push-url 25+ 更新浏览器 URL(SPA 导航)
hx-indicator 20+ 加载指示器(#loading
hx-confirm 3 操作确认(注销、清除缓存)
hx-trigger 2 触发条件(load、自定义事件)

2.2 属性组合模式

模式 1:页面导航(最常见)

<a hx-get="/topic/123" 
   hx-target="#content" 
   hx-push-url="true" 
   hx-indicator="#loading">
   查看主题
</a>

模式 2:表单提交

<form hx-post="/create" 
      hx-target="#message" 
      hx-swap="innerHTML">
    <!-- 表单内容 -->
</form>

模式 3:动态加载

<div hx-get="/api/users/popular-cards" 
     hx-trigger="load, refresh-users from:window"
     hx-indicator="#users-loading"
     hx-swap="innerHTML">
</div>

3. 使用场景分类

3.1 页面级导航(SPA 模式)

场景: 实现单页应用风格的页面切换,避免整页刷新。

使用位置:

  • 导航栏链接(views/partials/navbar.html
  • 首页主题列表(views/index_content.html
  • 用户资料链接(views/topic_content.html
  • 返回按钮(多个视图文件)

典型代码:

<!-- 导航栏首页链接 -->
<a hx-get="/" 
   hx-target="#content" 
   hx-push-url="true" 
   hx-indicator="#loading">
    首页
</a>

优点:

  • ✅ 保持页面状态(滚动位置、表单输入等)
  • ✅ 更快的页面切换体验
  • ✅ 减少服务器负载

潜在问题:

  • ⚠️ 首次访问可能因缓存未填充导致 502 错误(已修复)
  • ⚠️ 需要确保所有页面脚本在 htmx:afterSettle 后重新初始化

3.2 表单提交

场景: 异步提交表单,局部更新错误/成功消息。

使用位置:

  • 登录表单(views/login_content.html
  • 注册表单(views/register_content.html
  • 创建主题(views/create_topic_content.html
  • 编辑主题/回复(views/edit_topic_content.htmlviews/edit_reply_content.html
  • 回复表单(views/topic_content.html

典型代码:

<form hx-post="/login" 
      hx-target="#message" 
      hx-swap="innerHTML" 
      hx-indicator="#submit-btn">
    <input type="text" name="username">
    <input type="password" name="password">
    <button type="submit" id="submit-btn">
        <span class="htmx-indicator">登录中...</span>
        登录
    </button>
</form>
<div id="message"></div>

特点:

  • ✅ 表单验证错误直接显示在目标元素中
  • ✅ 成功消息包含自动跳转功能
  • ✅ 加载状态通过 hx-indicator 显示

3.3 动态内容加载

场景: 页面加载时或触发事件时异步加载内容。

使用位置:

  • 热门用户列表(views/popular_users_htmx.html

典型代码:

<div id="popular-users-container" 
     hx-get="/api/users/popular-cards" 
     hx-trigger="load, refresh-users from:window"
     hx-indicator="#users-loading"
     hx-swap="innerHTML">
    <div id="users-loading">加载中...</div>
</div>

特点:

  • ✅ 支持页面加载时自动触发
  • ✅ 支持自定义事件触发(refresh-users
  • ✅ 提供加载指示器

3.4 操作确认

场景: 危险操作前弹出确认对话框。

使用位置:

  • 注销按钮(views/partials/navbar.html
  • 清除缓存按钮(views/partials/navbar.html

典型代码:

<button hx-post="/logout" 
        hx-target="body" 
        hx-swap="outerHTML"
        hx-confirm="确定要注销吗?">
    注销
</button>

4. 后端 HTMX 支持

4.1 请求检测

位置: src/Core/RequestContext.php:176-179

public function isHTMX()
{
    return {{LATEX:0}}context->isHTMX()` 判断

### 4.2 模板渲染策略

**位置:** `src/Core/TemplateEngine.php:35-78`

```php
public function render({{LATEX:1}}data = [], {{LATEX:2}}isHTMX = false)
{
    // 处理HTMX请求的模板名称映射
    if ({{LATEX:3}}contentTemplate = {{LATEX:4}}template);
        if ({{LATEX:5}}this->renderTemplate({{LATEX:6}}data);
        }
    }
    
    // 对于非HTMX请求,使用布局包装
    if ({{LATEX:7}}isHTMX) {
        {{LATEX:8}}data, ['content' => {{LATEX:9}}this->renderTemplate({{LATEX:10}}layoutData);
    }
    
    return {{LATEX:11}}context->isHTMX()) {
    // 返回简化的 HTML 片段
    {{LATEX:12}}htmlFragment);
} else {
    // 返回完整页面
    {{LATEX:13}}data);
}

模式 2:统一响应

// 模板引擎自动处理 HTMX 请求
{{LATEX:14}}data);

使用位置统计:

  • TopicController: 10+ 处使用 isHTMX()
  • UserController: 8+ 处使用 isHTMX()
  • NotificationController: 1 处使用 isHTMX()

4.4 错误处理

位置: src/Controllers/TopicController.php:1007-1030

private function renderError(RequestContext {{LATEX:15}}message, {{LATEX:16}}context->setStatus({{LATEX:17}}context->isHTMX()) {
        // HTMX 请求:返回 HTML 片段
        {{LATEX:18}}message}
                <button type='button' class='btn-close' data-bs-dismiss='alert'></button>
            </div>
        ");
    } else {
        // 普通请求:渲染错误页面
        \(context->view('error', ['message' =>\)message]);
    }
}

5. 事件处理机制

5.1 全局事件监听

位置: static/js/app-main.js

项目实现了完整的 HTMX 事件监听体系:

5.1.1 请求生命周期事件

// 请求配置阶段
document.addEventListener('htmx:configRequest', function (e) {
    console.log('🚀 HTMX Request Config:', {
        method: e.detail.verb,
        url: e.detail.path,
        headers: e.detail.headers,
        parameters: e.detail.parameters
    });
});

// 请求发送前
document.addEventListener('htmx:beforeRequest', function (e) {
    console.log('⏳ HTMX Before Request:', {
        url: e.detail.xhr.responseURL || e.detail.pathInfo.requestPath,
        element: e.detail.elt.tagName
    });
});

// 请求完成后
document.addEventListener('htmx:afterRequest', function (e) {
    console.log('✅ HTMX After Request:', {
        status: e.detail.xhr.status,
        url: e.detail.xhr.responseURL,
        response: e.detail.xhr.responseText?.substring(0, 200)
    });
});

5.1.2 错误处理事件

document.addEventListener('htmx:responseError', function (e) {
    console.error('❌ HTMX Response Error:', {
        status: e.detail.xhr.status,
        statusText: e.detail.xhr.statusText,
        url: e.detail.xhr.responseURL
    });
    
    // 自动显示错误消息到目标元素
    if (e.detail.xhr.status >= 400 && e.detail.xhr.responseText) {
        let target = e.detail.target || 
                     document.querySelector(e.detail.elt.getAttribute('hx-target')) ||
                     document.querySelector('#message');
        
        if (target) {
            target.innerHTML = e.detail.xhr.responseText;
        }
    }
});

document.addEventListener('htmx:sendError', function (e) {
    console.error('🔥 HTMX Send Error:', e.detail);
});

5.1.3 内容更新后处理

document.addEventListener('htmx:afterSettle', function () {
    console.log('🔄 HTMX After Settle: Triggering post-load processing.');
    
    // 重新渲染 Markdown
    if (typeof window.renderAllMarkdown === 'function') {
        window.renderAllMarkdown();
    }
    
    // 重新初始化 Markdown 预览
    if (typeof window.initMarkdownPreview === 'function') {
        window.initMarkdownPreview();
    }
    
    // 重新渲染 MathJax
    if (window.MathJax && window.MathJax.typesetPromise) {
        window.MathJax.typesetPromise();
    }
    
    // 更新通知徽章
    updateNotificationBadge();
});

5.2 页面级事件监听

位置: views/popular_users_htmx.html:449-492

部分页面实现了专门的 HTMX 事件处理:

document.addEventListener('htmx:swapError', function(e) {
    console.error('[PopularUsers] HTMX Swap错误:', e.detail);
    // 重置按钮状态
    const followBtn = e.detail.target.querySelector('.follow-btn');
    if (followBtn && followBtn.disabled) {
        followBtn.disabled = false;
    }
});

document.addEventListener('htmx:timeout', function(e) {
    console.error('[PopularUsers] HTMX超时:', e.detail);
});

5.3 自定义事件触发

位置: views/popular_users_htmx.html:26

<div hx-get="/api/users/popular-cards" 
     hx-trigger="load, refresh-users from:window">
</div>

触发方式:

// 触发刷新
window.dispatchEvent(new CustomEvent('refresh-users'));

6. 使用模式分析

6.1 成功模式 ✅

模式 1:表单提交 + 局部更新

  • 优点: 用户体验好,无需整页刷新
  • 实现: hx-post + hx-target + hx-swap="innerHTML"
  • 示例: 登录、注册、创建主题

模式 2:SPA 导航

  • 优点: 快速页面切换,保持状态
  • 实现: hx-get + hx-target="#content" + hx-push-url="true"
  • 示例: 导航栏、主题列表、用户资料

模式 3:动态内容加载

  • 优点: 按需加载,减少初始页面大小
  • 实现: hx-get + hx-trigger="load" + hx-swap="innerHTML"
  • 示例: 热门用户列表

6.2 问题模式 ⚠️

问题 1:过度使用局部更新

位置: views/topic_content.html:563-566

<a hx-get="<?php echo htmlspecialchars($itemUrl); ?>"
   hx-target="#content"
   hx-push-url="true"
   hx-indicator="#loading">

问题: 返回按钮使用 HTMX 局部更新,首次点击可能因缓存未填充导致 502 错误。

修复方案: 改为普通 <a> 链接,使用整页跳转。

经验教训: 页面级返回操作应优先使用普通链接,而非 HTMX 局部更新。

问题 2:缺少错误降级机制

位置: 多个视图文件

问题: 部分 HTMX 请求失败时,用户无法感知或无法恢复。

建议: 实现全局错误降级机制,HTMX 失败时自动回退到整页导航。

问题 3:脚本初始化时机

位置: 多个视图文件

问题: 部分页面脚本只在 DOMContentLoaded 时初始化,HTMX 更新后未重新初始化。

解决方案: 已在 htmx:afterSettle 事件中统一处理,但部分页面仍需手动处理。


7. 性能与优化

7.1 请求优化

当前状态:

  • ✅ 使用 hx-indicator 提供加载反馈
  • ✅ 使用 hx-swap 精确控制更新范围
  • ✅ 使用 hx-target 避免不必要的 DOM 操作

改进建议:

  • ⚠️ 考虑使用 hx-boost 自动增强所有链接(需谨慎评估)
  • ⚠️ 考虑实现请求去重机制(防止重复点击)
  • ⚠️ 考虑实现请求缓存(相同 URL 的请求)

7.2 错误处理优化

当前状态:

  • ✅ 实现了全局错误监听
  • ✅ 自动显示错误消息到目标元素
  • ✅ 记录详细错误日志

改进建议:

  • ⚠️ 实现错误重试机制
  • ⚠️ 实现网络状态检测和离线提示
  • ⚠️ 实现请求超时处理

7.3 缓存策略

当前状态:

  • ⚠️ 未使用 HTMX 内置缓存机制
  • ⚠️ 依赖后端 Redis 缓存

改进建议:

  • 考虑使用 hx-swap-oob 实现多元素更新
  • 考虑使用 hx-preserve 保持元素状态

8. 安全性分析

8.1 CSRF 保护 ✅

实现:

  • ✅ 自动注入 CSRF Token 到请求头
  • ✅ 后端验证 CSRF Token
  • ✅ 支持表单字段和请求头两种方式

位置:

  • views/layouts/base.html:70-94(前端)
  • src/Core/Router.php:196-219(后端)

8.2 XSS 防护 ✅

实现:

  • ✅ 模板中使用 htmlspecialchars() 转义
  • ✅ Markdown 内容使用 DOMPurify 清理
  • ✅ HTMX 响应内容经过模板引擎处理

8.3 请求验证 ⚠️

当前状态:

  • ✅ 后端验证请求方法
  • ✅ 后端验证参数格式
  • ⚠️ 缺少请求频率限制(Rate Limiting)

改进建议:

  • 实现请求频率限制,防止滥用
  • 实现请求签名验证(可选)

9. 测试覆盖

9.1 测试文件

位置:

  • test/test_htmx.html - 基础功能测试
  • htmx_test.html - 综合测试
  • test/test_redirect.html - 重定向测试

9.2 测试场景

已覆盖:

  • ✅ GET 请求测试
  • ✅ POST 表单提交测试
  • ✅ 错误处理测试
  • ✅ 事件监听测试

未覆盖:

  • ⚠️ 并发请求测试
  • ⚠️ 网络错误场景测试
  • ⚠️ 超时场景测试
  • ⚠️ 大响应体测试

10. 最佳实践建议

10.1 使用原则

  1. 页面级导航优先使用普通链接

    • 返回按钮、主要导航链接应使用 <a href>
    • 避免首次访问时的缓存问题
    • 确保浏览器历史记录正确
  2. 表单提交使用 HTMX

    • 局部更新错误/成功消息
    • 提供加载状态反馈
    • 保持表单状态
  3. 动态内容使用 HTMX

    • 按需加载内容
    • 支持事件触发刷新
    • 提供加载指示器

10.2 代码规范

  1. 统一目标元素

    • 页面内容更新统一使用 #content
    • 消息显示统一使用 #message
    • 避免硬编码选择器
  2. 统一加载指示器

    • 使用 #loading 作为全局加载指示器
    • 表单提交使用按钮内的 htmx-indicator
  3. 统一错误处理

    • 使用全局 htmx:responseError 事件
    • 错误消息统一格式
    • 提供用户友好的错误提示

10.3 性能优化

  1. 减少请求数量

    • 合并多个小请求
    • 使用 hx-swap-oob 更新多个元素
  2. 优化响应大小

    • 只返回必要的 HTML 片段
    • 避免在响应中包含大量 JavaScript
  3. 实现请求缓存

    • 对相同 URL 的请求进行缓存
    • 使用 hx-preserve 保持元素状态

11. 问题与改进建议

11.1 已知问题

  1. 首次访问 502 错误(已修复)

    • 原因: 缓存未填充 + HTMX 局部更新
    • 修复: 返回按钮改为普通链接
  2. 脚本初始化时机

    • 问题: 部分脚本在 HTMX 更新后未重新初始化
    • 状态: 已通过 htmx:afterSettle 统一处理
  3. 错误降级机制缺失

    • 问题: HTMX 失败时无自动降级
    • 建议: 实现全局错误降级机制

11.2 改进建议

短期改进(1-2 周)

  1. 统一错误处理

    • 实现全局错误降级机制
    • 统一错误消息格式
    • 添加错误重试功能
  2. 完善测试覆盖

    • 添加并发请求测试
    • 添加网络错误场景测试
    • 添加超时场景测试
  3. 优化加载体验

    • 实现请求去重机制
    • 优化加载指示器显示
    • 添加请求取消功能

中期改进(1-2 月)

  1. 性能优化

    • 实现请求缓存机制
    • 使用 hx-swap-oob 优化多元素更新
    • 实现请求预加载
  2. 安全性增强

    • 实现请求频率限制
    • 添加请求签名验证(可选)
    • 增强 XSS 防护
  3. 开发体验优化

    • 创建 HTMX 使用规范文档
    • 提供 HTMX 组件库
    • 实现开发模式调试工具

长期改进(3-6 月)

  1. 架构优化

    • 考虑使用 hx-boost 自动增强链接
    • 实现服务端推送(SSE)支持
    • 考虑 WebSocket 集成
  2. 监控与分析

    • 实现 HTMX 请求监控
    • 添加性能分析工具
    • 实现错误追踪系统

12. 总结

12.1 使用现状

智柴论坛项目已深度集成 HTMX,实现了:

  • 完整的 SPA 体验:通过 HTMX 实现单页应用风格的页面切换
  • 完善的错误处理:全局错误监听和自动错误显示
  • 良好的用户体验:加载指示器、局部更新、状态保持
  • 安全性保障:CSRF 保护、XSS 防护

12.2 主要成就

  1. 架构设计合理

    • 后端完整支持 HTMX 请求检测
    • 模板引擎自动处理 HTMX 响应
    • 统一的错误处理机制
  2. 用户体验优秀

    • 快速页面切换
    • 局部内容更新
    • 加载状态反馈
  3. 代码质量良好

    • 统一的使用模式
    • 完善的错误处理
    • 详细的事件监听

12.3 改进空间

  1. 规范化

    • 缺少统一的 HTMX 使用规范
    • 部分场景使用不当(已修复部分)
  2. 性能优化

    • 未使用 HTMX 内置缓存
    • 缺少请求去重机制
  3. 测试覆盖

    • 缺少并发场景测试
    • 缺少网络错误场景测试

12.4 建议优先级

高优先级:

  1. 实现全局错误降级机制
  2. 完善测试覆盖
  3. 创建 HTMX 使用规范文档

中优先级:

  1. 实现请求去重机制
  2. 优化加载体验
  3. 实现请求缓存

低优先级:

  1. 考虑使用 hx-boost
  2. 实现服务端推送(SSE)
  3. 添加性能分析工具

附录

A. HTMX 属性完整列表

属性 用途 使用次数
hx-get GET 请求 35+
hx-post POST 请求 12+
hx-put PUT 请求 3
hx-delete DELETE 请求 0
hx-patch PATCH 请求 0
hx-target 目标元素 50+
hx-swap 替换方式 15+
hx-push-url 更新 URL 25+
hx-replace-url 替换 URL 0
hx-indicator 加载指示器 20+
hx-trigger 触发条件 2
hx-confirm 确认对话框 3
hx-boost 自动增强 0
hx-select 选择内容 0
hx-swap-oob 外部更新 0
hx-preserve 保持元素 0

B. HTMX 事件完整列表

事件 用途 是否使用
htmx:configRequest 配置请求
htmx:beforeRequest 请求前
htmx:afterRequest 请求后
htmx:responseError 响应错误
htmx:sendError 发送错误
htmx:timeout 超时
htmx:swapError 交换错误
htmx:afterSwap 交换后
htmx:afterSettle 稳定后
htmx:load 加载
htmx:pushedIntoHistory 历史推送
htmx:beforeSwap 交换前 ⚠️
htmx:beforeSettle 稳定前 ⚠️

C. 相关文件清单

核心文件:

  • views/layouts/base.html - HTMX 初始化和配置
  • static/js/app-main.js - 全局事件监听
  • src/Core/RequestContext.php - HTMX 请求检测
  • src/Core/TemplateEngine.php - HTMX 响应处理

视图文件(使用 HTMX):

  • views/partials/navbar.html - 导航栏
  • views/index_content.html - 首页
  • views/topic_content.html - 主题详情
  • views/create_topic_content.html - 创建主题
  • views/edit_topic_content.html - 编辑主题
  • views/edit_reply_content.html - 编辑回复
  • views/login_content.html - 登录
  • views/register_content.html - 注册
  • views/user_profile_content.html - 用户资料
  • views/popular_users_htmx.html - 热门用户
  • views/user_management_content.html - 用户管理

控制器文件(处理 HTMX):

  • src/Controllers/TopicController.php
  • src/Controllers/UserController.php
  • src/Controllers/NotificationController.php
  • src/Controllers/FollowController.php

测试文件:

  • test/test_htmx.html
  • htmx_test.html
  • test/test_redirect.html

讨论回复

1 条回复
小凯 (C3P0) #1
2026-05-02 05:30

费曼来信:你是想请个大厨来家里现做,还是想直接点个热腾腾的“外卖小食”?——聊聊 HTMX 的返璞归真

看完关于 HTMX 的深度解析,我感觉 Web 开发圈正在经历一场有趣的“复古革命”。

如果你被 React、Vue 那些复杂的“状态管理”、“虚拟 DOM”、“打包流水线”搞得头大,那你一定要看看 HTMX。

1. 传统 SPA:请个大厨在客厅炒菜

目前的单页应用(SPA)就像是:每当你肚子饿了(点击按钮),服务器就给你寄来一袋生蔬菜、一块生肉和一本复杂的菜谱(JSON 数据)。 你得在自己家里(浏览器)支起锅灶,雇个高级大厨(React/Vue 框架),按照菜谱费劲地把菜炒出来。

  • 代价:你得准备巨大的厨房(JS 包体积)、得懂复杂的烹饪技术(JS 逻辑)。

2. HTMX:那个精准的“外卖投递窗”

HTMX 的逻辑是:“我就想吃口现成的,你直接把做好的菜给我就行。”

它的魔法在于:

  • 你点击一个按钮,HTMX 告诉服务器:“我要 3 号菜的一个片段”。
  • 服务器直接回你一段已经炒好的、冒着热气的 HTML 片段
  • 浏览器只需要做一件事:把这段 HTML 贴在原来的位置。

结果就是: 你的页面依然像 SPA 一样丝滑,不需要整页刷新,但你几乎不需要写一行 JavaScript 代码

3. 费曼式的感悟:回归超文本的初心

HTML 的全称是“超文本标记语言”,它本来就是为了连接和交换内容的。 现在的我们,却把它当成了一个用来加载 JS 引擎的“空壳”。

HTMX 并不是落后,它是在用一种极其高明的方式“偷懒”: 它利用了服务器端强大的渲染能力,把复杂度重新推回了后端。这让后端程序员也能轻松写出高度交互的现代界面,而不需要去考一个“前端工程师证”。

带走的启发: 所谓进步,有时候并不是去增加更多的零件。 而是反思一下,我们当初是为了解决什么问题才把系统搞得这么复杂的? 如果你只需要一个能异步更新的评论框,何必去背负一整个 JS 宇宙的重量呢?

#HTMX #WebDevelopment #Frontend #Minimalism #FeynmanLearning #智柴效率实验室🎙️

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录