当前位置:首页 > 文章列表 > 文章 > 前端 > JS前端路由实战教学:手把手教你用这5种方式玩转历史记录!

JS前端路由实战教学:手把手教你用这5种方式玩转历史记录!

2025-06-19 16:58:37 0浏览 收藏

前端路由的历史记录管理是提升Web应用用户体验的关键技术。本文深入探讨了JavaScript中利用History API实现前端路由的5种方案,助你玩转历史记录!包括:基于`pushState`、`replaceState`和`popstate`事件的HTML5 History API路由,兼顾兼容性的Hash路由,功能强大的第三方库(如React Router、Vue Router),适用于特定场景的Memory路由,以及SEO友好的Static路由。同时,文章还提供了解决404错误的服务器端配置方案,以及通过懒加载、代码分割、预加载和缓存等优化前端路由性能的方法。更进一步,还介绍了如何利用SSR、预渲染、Sitemap和Meta标签等技术优化SEO,并详细讲解了URL参数、路径参数和状态对象等路由参数的传递与获取方式。掌握这些技巧,让你的前端应用拥有更流畅的用户体验和更出色的搜索引擎表现!

前端路由的历史记录管理是通过浏览器的History API实现的,允许在不刷新页面的前提下操作历史记录栈,提升用户体验。其核心方法包括:1. pushState:添加新的历史记录条目;2. replaceState:替换当前历史记录;3. popstate事件:监听前进/后退按钮操作并更新页面内容。此外,常见的前端路由方案有:Hash路由(基于hashchange事件,兼容性好但URL不够美观)、HTML5 History API路由(URL美观但需要服务器配置)、第三方库(如React Router、Vue Router,功能强大但需学习成本)、Memory路由(适用于测试环境但状态无法持久化)和Static路由(预渲染生成静态页面,SEO友好)。为避免404错误,服务器端需将所有未匹配路由重定向到index.html。性能优化方面可通过懒加载、代码分割、预加载资源和缓存数据来提升体验,同时结合SSR、预渲染、Sitemap和Meta标签优化SEO。路由参数可通过URL参数、路径参数或状态对象传递和获取。

js如何实现历史记录管理 前端路由历史的5种管理方案!

前端路由的历史记录管理,说白了就是如何在不刷新页面的前提下,让浏览器记住你访问过的页面,并且能前进后退。这事儿挺重要的,直接关系到用户体验,要是每次跳转都刷新,那体验可就太差了。

js如何实现历史记录管理 前端路由历史的5种管理方案!

解决方案

JavaScript实现历史记录管理,主要依赖于浏览器的 History API。这个API提供了 pushState、replaceState 和 popstate 事件,允许你操作浏览器的历史记录栈,而无需重新加载页面。

js如何实现历史记录管理 前端路由历史的5种管理方案!
  1. pushState: 这个方法允许你向历史记录栈中添加一个新的状态。它接受三个参数:一个状态对象、一个标题(现在大多数浏览器会忽略这个标题)和一个可选的URL。

    js如何实现历史记录管理 前端路由历史的5种管理方案!
    history.pushState({ page: 'about' }, 'About Us', '/about');

    这会在历史记录中添加一个新的条目,URL变为/about,但不会实际加载这个URL。

  2. replaceState: 这个方法类似 pushState,但它不是添加新的历史记录,而是替换当前的记录。

    history.replaceState({ page: 'home' }, 'Home', '/');

    这会将当前的历史记录替换为新的状态,URL变为/。

  3. popstate 事件: 当用户点击浏览器的前进或后退按钮时,会触发 popstate 事件。你需要监听这个事件,然后根据历史记录中的状态来更新页面内容。

    window.addEventListener('popstate', function(event) {
      if (event.state) {
        // 根据 event.state 来更新页面
        console.log('当前页面状态:', event.state.page);
      } else {
        // 初始页面加载时,state可能为null
        console.log('初始页面加载');
      }
    });

前端路由方案:5种管理方案

  1. Hash 路由 (URL中的#符号)

    • 原理: 利用URL中的hash(#)部分的变化来触发 hashchange 事件。hash的变化不会导致页面重新加载,因此可以用来模拟路由。

    • 优点: 兼容性好,实现简单。

    • 缺点: URL中始终带有#,不够美观,不利于SEO。

    window.addEventListener('hashchange', function() {
      const hash = location.hash.slice(1); // 去掉#
      // 根据hash更新页面内容
      console.log('Hash changed:', hash);
    });
    
    // 手动设置hash
    location.hash = '/about';
  2. HTML5 History API 路由

    • 原理: 使用 pushState 和 replaceState 来修改URL,并通过 popstate 事件监听历史记录的变化。

    • 优点: URL美观,更符合传统路由的形式。

    • 缺点: 需要服务器端配置,否则刷新页面时可能会出现404错误。

    • 服务器端配置 (以Node.js/Express为例): 如果用户直接访问/about,服务器需要返回你的index.html文件,让前端路由接管。

      const express = require('express');
      const path = require('path');
      const app = express();
      const port = 3000;
      
      app.use(express.static('public')); // 静态资源目录
      
      app.get('*', (req, res) => {
        res.sendFile(path.resolve(__dirname, 'public', 'index.html'));
      });
      
      app.listen(port, () => {
        console.log(`Server listening at http://localhost:${port}`);
      });

      这里 app.get('*') 捕获所有未匹配的路由,并返回 index.html。

  3. 使用第三方库 (例如 React Router, Vue Router)

    • 原理: 这些库封装了 History API,提供了更高级的路由管理功能,例如路由参数、嵌套路由、路由守卫等。

    • 优点: 功能强大,易于使用,社区支持良好。

    • 缺点: 增加了项目的依赖,需要学习库的使用方法。

    • React Router 示例:

      import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
      
      function App() {
        return (
          
            
      ); }
  4. Memory 路由

    • 原理: 将路由状态保存在内存中,而不是URL中。适用于不需要持久化路由状态的场景,例如移动应用或测试环境。

    • 优点: 不需要服务器端配置,适用于特定场景。

    • 缺点: 路由状态不会被保存,刷新页面会丢失状态。

    • React Router 的 MemoryRouter:

      import { MemoryRouter, Route, Link } from 'react-router-dom';
      
      function App() {
        return (
          
            
      ); }
  5. Static 路由 (预渲染)

    • 原理: 在构建时生成所有可能的路由页面,然后将它们作为静态文件部署。

    • 优点: SEO友好,加载速度快。

    • 缺点: 不适用于动态内容,需要预先知道所有可能的路由。

    • Next.js 的静态生成:

      // pages/about.js
      function About() {
        return 

      About Us

      ; } export default About; // 在 Next.js 中,这个页面会在构建时被预渲染为静态 HTML 文件。

如何处理404错误?服务器端配置的坑

在使用HTML5 History API时,如果用户直接访问一个前端路由(例如/about),服务器需要返回 index.html 文件。否则,用户会看到404错误。

解决这个问题,你需要配置你的服务器,将所有未匹配的路由都重定向到 index.html。上面Node.js/Express的例子已经展示了如何操作。

对于其他的服务器,例如Apache或Nginx,你需要修改配置文件。

  • Apache .htaccess 文件:

    
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.html [L]
    
  • Nginx nginx.conf 文件:

    server {
      location / {
        try_files $uri $uri/ /index.html;
      }
    }

如何优化前端路由的性能?

  1. 懒加载路由组件: 只有当用户访问某个路由时,才加载对应的组件。这可以减少初始加载时间。

    • React Router 的 React.lazy:

      import React, { Suspense } from 'react';
      import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
      
      const Home = React.lazy(() => import('./Home'));
      const About = React.lazy(() => import('./About'));
      
      function App() {
        return (
          
            
      Loading...
      }>
); }
  • 使用代码分割: 将你的应用拆分成更小的块,每个块只包含特定路由所需的代码。这可以减少初始下载大小。

    • Webpack 的代码分割: Webpack 可以自动将你的代码分割成多个块,并按需加载它们。
  • 预加载关键资源: 在用户可能访问的路由之前,预先加载所需的资源。这可以减少用户切换路由时的延迟。

    • :

  • 缓存路由数据: 如果你的路由组件需要从服务器获取数据,可以将数据缓存起来,避免重复请求。

    • 使用 Redux 或 Context API 进行状态管理: 将数据存储在全局状态中,并在路由组件之间共享。
  • SEO 优化:如何让搜索引擎更好地抓取你的前端路由?

    1. 服务器端渲染 (SSR): 在服务器端生成HTML,然后将其发送给客户端。这可以提高SEO,因为搜索引擎可以直接抓取HTML内容。

      • Next.js: 一个流行的 React 框架,支持服务器端渲染、静态生成和客户端渲染。
    2. 预渲染 (Prerendering): 在构建时生成静态HTML文件,然后将它们部署到服务器。这也可以提高SEO,但不如服务器端渲染灵活。

      • 使用 Puppeteer 或 Headless Chrome: 在构建时运行一个无头浏览器,加载你的应用,并将生成的HTML保存到文件中。
    3. 使用 Sitemap: 创建一个 Sitemap 文件,列出你的所有路由,并将其提交给搜索引擎。

      • sitemap.xml:

        
        
          
            https://example.com/
            2023-10-27
            daily
            1.0
          
          
            https://example.com/about
            2023-10-27
            monthly
            0.8
          
        
    4. 使用 Meta 标签: 为每个路由添加描述性的 Meta 标签,例如 </code> 和 <code><meta name="description"></code>。</p><ul><li><strong>React Helmet</strong>: 一个 React 组件,可以让你在组件中管理 Meta 标签。</li></ul></li></ol><h3>路由参数:如何传递和获取路由参数?</h3><ol><li><p><strong>URL 参数 (Query Parameters)</strong>: 使用 <code>?</code> 符号将参数添加到URL中。例如:<code>/products?category=electronics&page=2</code>。</p><ul><li><p><strong>获取 URL 参数</strong>:</p><pre class="brush:language-javascript;toolbar:false;">const urlParams = new URLSearchParams(window.location.search); const category = urlParams.get('category'); // 'electronics' const page = urlParams.get('page'); // '2'</pre></li></ul></li><li><p><strong>路径参数 (Path Parameters)</strong>: 将参数作为URL的一部分。例如:<code>/products/:id</code>。</p><ul><li><p><strong>React Router 的路径参数</strong>:</p><pre class="brush:language-javascript;toolbar:false;">import { BrowserRouter as Router, Route, useParams } from 'react-router-dom'; function Product() { const { id } = useParams(); return <h1>Product ID: {id}</h1>; } function App() { return ( <Router> <Route path="/products/:id" component={Product} /> </Router> ); }</pre></li></ul></li><li><p><strong>状态对象 (State Object)</strong>: 使用 <code>history.pushState</code> 或 <code>history.replaceState</code> 传递状态对象。</p><ul><li><p><strong>传递状态对象</strong>:</p><pre class="brush:language-javascript;toolbar:false;">history.pushState({ productId: 123 }, '', '/products/123');</pre></li><li><p><strong>获取状态对象</strong>:</p><pre class="brush:language-javascript;toolbar:false;">window.addEventListener('popstate', function(event) { if (event.state) { const productId = event.state.productId; // 123 } });</pre></li></ul></li></ol><p>今天关于《JS前端路由实战教学:手把手教你用这5种方式玩转历史记录!》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于性能优化,SEO优化,前端路由,HistoryAPI,路由参数的内容请关注golang学习网公众号!</p> </div> <div class="labsList"> <a href="javascript:;" title="性能优化">性能优化</a> <a href="javascript:;" title="SEO优化">SEO优化</a> <a href="javascript:;" title="前端路由">前端路由</a> <a href="javascript:;" title="HistoryAPI">HistoryAPI</a> <a href="javascript:;" title="路由参数">路由参数</a> </div> <div class="cateBox"> <div class="cateItem"> <a href="/article/234276.html" title="PHP菜鸟看过来!手把手教你用闭包让代码飞起来~" class="img_box"> <img src="/uploads/20250619/17503234336853d0e9f36cd.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="PHP菜鸟看过来!手把手教你用闭包让代码飞起来~">PHP菜鸟看过来!手把手教你用闭包让代码飞起来~ </a> <dl> <dt class="lineOverflow"><a href="/article/234276.html" title="PHP菜鸟看过来!手把手教你用闭包让代码飞起来~" class="aBlack">上一篇<i></i></a></dt> <dd class="lineTwoOverflow">PHP菜鸟看过来!手把手教你用闭包让代码飞起来~</dd> </dl> </div> <div class="cateItem"> <a href="/article/234278.html" title="PHP字符串大小写转换超详细教程" class="img_box"> <img src="/uploads/20250619/17503236056853d195d364f.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="PHP字符串大小写转换超详细教程"> </a> <dl> <dt class="lineOverflow"><a href="/article/234278.html" class="aBlack" title="PHP字符串大小写转换超详细教程">下一篇<i></i></a></dt> <dd class="lineTwoOverflow">PHP字符串大小写转换超详细教程</dd> </dl> </div> </div> </div> </div> <div class="leftContBox pt0"> <div class="pdl20"> <div class="contTit"> <a href="/articlelist.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit">最新文章</div> </div> </div> <ul class="newArticleList"> <li> <div class="contBox"> <a href="/article/630144.html" class="img_box" title="前端状态更新频繁时,批处理与去抖分别解决什么"> <img src="/uploads/20261007/1791362972-ae57678373-4cae5f28c0-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="前端状态更新频繁时,批处理与去抖分别解决什么"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  5小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/630144.html" class="aBlack" target="_blank" title="前端状态更新频繁时,批处理与去抖分别解决什么">前端状态更新频繁时,批处理与去抖分别解决什么</a> </dt> <dd class="cont2"> <span><i class="view"></i>227浏览</span> <span class="collectBtn user_collection" data-id="630144" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/630120.html" class="img_box" title="可访问弹窗的焦点陷阱、关闭恢复与背景隔离"> <img src="/uploads/20261007/1791355130-00f20d91ca-0222176e54-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="可访问弹窗的焦点陷阱、关闭恢复与背景隔离"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  7小时前  |   <a href="/articletag/243_new_0_1.html" class="aLightGray" title="前端">前端</a> · <a href="/articletag/40050_new_0_1.html" class="aLightGray" title="可访问性">可访问性</a> · <a href="javascript:;" class="aLightGray" title="焦点陷阱">焦点陷阱</a> <a href="javascript:;" class="aLightGray" title="HTML dialog">HTML dialog</a> <a href="javascript:;" class="aLightGray" title="焦点恢复">焦点恢复</a> <a href="javascript:;" class="aLightGray" title="inert">inert</a> <a href="javascript:;" class="aLightGray" title="无障碍弹窗">无障碍弹窗</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/630120.html" class="aBlack" target="_blank" title="可访问弹窗的焦点陷阱、关闭恢复与背景隔离">可访问弹窗的焦点陷阱、关闭恢复与背景隔离</a> </dt> <dd class="cont2"> <span><i class="view"></i>309浏览</span> <span class="collectBtn user_collection" data-id="630120" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/630096.html" class="img_box" title="Web Worker 传大数据为何卡顿:复制与 Transferable 对比"> <img src="/uploads/20261007/1791347663-bc57e219c1-2eaf6c581d-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="Web Worker 传大数据为何卡顿:复制与 Transferable 对比"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  9小时前  |   <a href="/articletag/243_new_0_1.html" class="aLightGray" title="前端">前端</a> · <a href="/articletag/729_new_0_1.html" class="aLightGray" title="性能优化">性能优化</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="javascript:;" class="aLightGray" title="ArrayBuffer">ArrayBuffer</a> <a href="javascript:;" class="aLightGray" title="postMessage">postMessage</a> <a href="javascript:;" class="aLightGray" title="前端性能">前端性能</a> <a href="javascript:;" class="aLightGray" title="Web Worker">Web Worker</a> <a href="javascript:;" class="aLightGray" title="Transferable">Transferable</a> <a href="javascript:;" class="aLightGray" title="structured clone">structured clone</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/630096.html" class="aBlack" target="_blank" title="Web Worker 传大数据为何卡顿:复制与 Transferable 对比">Web Worker 传大数据为何卡顿:复制与 Transferable 对比</a> </dt> <dd class="cont2"> <span><i class="view"></i>220浏览</span> <span class="collectBtn user_collection" data-id="630096" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/630072.html" class="img_box" title="Fetch 请求取消后,超时与用户中断要怎样区分"> <img src="/uploads/20261007/1791339534-45158fb1c5-5ccd1f1f65-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="Fetch 请求取消后,超时与用户中断要怎样区分"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  12小时前  |   <a href="javascript:;" class="aLightGray" title="请求超时">请求超时</a> <a href="javascript:;" class="aLightGray" title="Fetch">Fetch</a> <a href="javascript:;" class="aLightGray" title="AbortController">AbortController</a> <a href="javascript:;" class="aLightGray" title="AbortSignal">AbortSignal</a> <a href="javascript:;" class="aLightGray" title="用户取消">用户取消</a> <a href="javascript:;" class="aLightGray" title="前端异常处理">前端异常处理</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/630072.html" class="aBlack" target="_blank" title="Fetch 请求取消后,超时与用户中断要怎样区分">Fetch 请求取消后,超时与用户中断要怎样区分</a> </dt> <dd class="cont2"> <span><i class="view"></i>466浏览</span> <span class="collectBtn user_collection" data-id="630072" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/630048.html" class="img_box" title="前端上传大文件:分片、暂停与失败续传怎样协作"> <img src="/uploads/20261007/1791332311-23a09cbb67-afa887518d-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="前端上传大文件:分片、暂停与失败续传怎样协作"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  14小时前  |   <a href="/articletag/616_new_0_1.html" class="aLightGray" title="文件上传">文件上传</a> · <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="/articletag/5401_new_0_1.html" class="aLightGray" title="前端开发">前端开发</a> · <a href="javascript:;" class="aLightGray" title="大文件上传">大文件上传</a> <a href="javascript:;" class="aLightGray" title="断点续传">断点续传</a> <a href="javascript:;" class="aLightGray" title="XMLHttpRequest">XMLHttpRequest</a> <a href="javascript:;" class="aLightGray" title="Blob.slice">Blob.slice</a> <a href="javascript:;" class="aLightGray" title="前端分片上传">前端分片上传</a> <a href="javascript:;" class="aLightGray" title="暂停上传">暂停上传</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/630048.html" class="aBlack" target="_blank" title="前端上传大文件:分片、暂停与失败续传怎样协作">前端上传大文件:分片、暂停与失败续传怎样协作</a> </dt> <dd class="cont2"> <span><i class="view"></i>371浏览</span> <span class="collectBtn user_collection" data-id="630048" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/630024.html" class="img_box" title="View Transition API 做列表到详情过渡的渐进增强"> <img src="/uploads/20261007/1791324659-0aa92aaa9b-36ff0ac403-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="View Transition API 做列表到详情过渡的渐进增强"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  16小时前  |   <a href="javascript:;" class="aLightGray" title="列表详情">列表详情</a> <a href="javascript:;" class="aLightGray" title="View Transition API">View Transition API</a> <a href="javascript:;" class="aLightGray" title="前端渐进增强">前端渐进增强</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/630024.html" class="aBlack" target="_blank" title="View Transition API 做列表到详情过渡的渐进增强">View Transition API 做列表到详情过渡的渐进增强</a> </dt> <dd class="cont2"> <span><i class="view"></i>385浏览</span> <span class="collectBtn user_collection" data-id="630024" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/629998.html" class="img_box" title="用 CSS Container Query 让卡片按容器而不是视口响应"> <img src="/uploads/20261007/1791316248-6416323120-96bf208d1b-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="用 CSS Container Query 让卡片按容器而不是视口响应"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  18小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/629998.html" class="aBlack" target="_blank" title="用 CSS Container Query 让卡片按容器而不是视口响应">用 CSS Container Query 让卡片按容器而不是视口响应</a> </dt> <dd class="cont2"> <span><i class="view"></i>289浏览</span> <span class="collectBtn user_collection" data-id="629998" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/629976.html" class="img_box" title="Vite 环境变量为什么在配置加载时取不到"> <img src="/uploads/20261007/1791307141-690b348f90-01070631c9-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="Vite 环境变量为什么在配置加载时取不到"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  21小时前  |   <a href="javascript:;" class="aLightGray" title="环境变量">环境变量</a> <a href="javascript:;" class="aLightGray" title="vite">vite</a> <a href="javascript:;" class="aLightGray" title="loadEnv">loadEnv</a> <a href="javascript:;" class="aLightGray" title="vite.config">vite.config</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/629976.html" class="aBlack" target="_blank" title="Vite 环境变量为什么在配置加载时取不到">Vite 环境变量为什么在配置加载时取不到</a> </dt> <dd class="cont2"> <span><i class="view"></i>133浏览</span> <span class="collectBtn user_collection" data-id="629976" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/629964.html" class="img_box" title="React useOptimistic 怎么在请求失败时回滚列表"> <img src="/uploads/20261007/1791303554-4f7958db3a-e6ceaf866a-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="React useOptimistic 怎么在请求失败时回滚列表"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  22小时前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/629964.html" class="aBlack" target="_blank" title="React useOptimistic 怎么在请求失败时回滚列表">React useOptimistic 怎么在请求失败时回滚列表</a> </dt> <dd class="cont2"> <span><i class="view"></i>153浏览</span> <span class="collectBtn user_collection" data-id="629964" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/629940.html" class="img_box" title="URLPattern 怎么同时匹配域名和路径参数"> <img src="/uploads/20261006/1791295476-e816a2355a-f49a9a5f8c-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="URLPattern 怎么同时匹配域名和路径参数"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  1天前  |   <a href="/articletag/5401_new_0_1.html" class="aLightGray" title="前端开发">前端开发</a> · <a href="javascript:;" class="aLightGray" title="前端路由">前端路由</a> <a href="javascript:;" class="aLightGray" title="hostname">hostname</a> <a href="javascript:;" class="aLightGray" title="URLPattern">URLPattern</a> <a href="javascript:;" class="aLightGray" title="pathname">pathname</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/629940.html" class="aBlack" target="_blank" title="URLPattern 怎么同时匹配域名和路径参数">URLPattern 怎么同时匹配域名和路径参数</a> </dt> <dd class="cont2"> <span><i class="view"></i>108浏览</span> <span class="collectBtn user_collection" data-id="629940" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/629916.html" class="img_box" title="Intl.DurationFormat 怎么本地化显示持续时间"> <img src="/uploads/20261006/1791287517-520c50a84e-214ee003d4-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="Intl.DurationFormat 怎么本地化显示持续时间"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  1天前  |   <a href="/articletag/4701_new_0_1.html" class="aLightGray" title="javascript">javascript</a> · <a href="javascript:;" class="aLightGray" title="JavaScript">JavaScript</a> <a href="javascript:;" class="aLightGray" title="Intl.DurationFormat">Intl.DurationFormat</a> <a href="javascript:;" class="aLightGray" title="前端国际化">前端国际化</a> <a href="javascript:;" class="aLightGray" title="持续时间格式化">持续时间格式化</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/629916.html" class="aBlack" target="_blank" title="Intl.DurationFormat 怎么本地化显示持续时间">Intl.DurationFormat 怎么本地化显示持续时间</a> </dt> <dd class="cont2"> <span><i class="view"></i>141浏览</span> <span class="collectBtn user_collection" data-id="629916" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/629893.html" class="img_box" title="postMessage 转移 MessagePort 后原端口还能用吗"> <img src="/uploads/20261006/1791280507-b0629ee599-15a0b30efe-cover-640.webp" onerror="this.src='/assets/images/moren/morentu.png'" alt="postMessage 转移 MessagePort 后原端口还能用吗"> </a> <dl> <dd class="cont1"> <span> <a href="/articlelist/19_new_0_1.html" class="aLightGray" title="文章">文章</a> · <a href="/articlelist/88_new_0_1.html" class="aLightGray" title="前端">前端</a>   |  1天前  |   <a href="/articletag/5401_new_0_1.html" class="aLightGray" title="前端开发">前端开发</a> · <a href="/articletag/40054_new_0_1.html" class="aLightGray" title="浏览器API">浏览器API</a> · <a href="javascript:;" class="aLightGray" title="postMessage">postMessage</a> <a href="javascript:;" class="aLightGray" title="MessageChannel">MessageChannel</a> <a href="javascript:;" class="aLightGray" title="Web Worker">Web Worker</a> <a href="javascript:;" class="aLightGray" title="MessagePort">MessagePort</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/629893.html" class="aBlack" target="_blank" title="postMessage 转移 MessagePort 后原端口还能用吗">postMessage 转移 MessagePort 后原端口还能用吗</a> </dt> <dd class="cont2"> <span><i class="view"></i>477浏览</span> <span class="collectBtn user_collection" data-id="629893" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> </ul> </div> </div> <div class="mainRight"> <!-- 右侧广告位banner --> <div class="rightContBox" style="margin-top: 0px;"> <div class="rightTit"> <a href="/courselist.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit lineOverflow">课程推荐</div> </div> <ul class="lessonRecomRList"> <li> <a href="/course/9.html" class="img_box" target="_blank" title="前端进阶之JavaScript设计模式"> <img src="/uploads/20221222/52fd0f23a454c71029c2c72d206ed815.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="前端进阶之JavaScript设计模式"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/9.html" target="_blank" class="aBlack" title="前端进阶之JavaScript设计模式">前端进阶之JavaScript设计模式</a></dt> <dd class="cont1 lineTwoOverflow"> 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。 </dd> <dd class="cont2">543次学习</dd> </dl> </li> <li> <a href="/course/2.html" class="img_box" target="_blank" title="GO语言核心编程课程"> <img src="/uploads/20221221/634ad7404159bfefc6a54a564d437b5f.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="GO语言核心编程课程"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/2.html" target="_blank" class="aBlack" title="GO语言核心编程课程">GO语言核心编程课程</a></dt> <dd class="cont1 lineTwoOverflow"> 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。 </dd> <dd class="cont2">516次学习</dd> </dl> </li> <li> <a href="/course/74.html" class="img_box" target="_blank" title="简单聊聊mysql8与网络通信"> <img src="/uploads/20240103/bad35fe14edbd214bee16f88343ac57c.png" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="简单聊聊mysql8与网络通信"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/74.html" target="_blank" class="aBlack" title="简单聊聊mysql8与网络通信">简单聊聊mysql8与网络通信</a></dt> <dd class="cont1 lineTwoOverflow"> 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让 </dd> <dd class="cont2">500次学习</dd> </dl> </li> <li> <a href="/course/57.html" class="img_box" target="_blank" title="JavaScript正则表达式基础与实战"> <img src="/uploads/20221226/bbe4083bb3cb0dd135fb02c31c3785fb.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="JavaScript正则表达式基础与实战"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/57.html" target="_blank" class="aBlack" title="JavaScript正则表达式基础与实战">JavaScript正则表达式基础与实战</a></dt> <dd class="cont1 lineTwoOverflow"> 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。 </dd> <dd class="cont2">487次学习</dd> </dl> </li> <li> <a href="/course/28.html" class="img_box" target="_blank" title="从零制作响应式网站—Grid布局"> <img src="/uploads/20221223/ac110f88206daeab6c0cf38ebf5fe9ed.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="从零制作响应式网站—Grid布局"> </a> <dl> <dt class="lineTwoOverflow"><a href="/course/28.html" target="_blank" class="aBlack" title="从零制作响应式网站—Grid布局">从零制作响应式网站—Grid布局</a></dt> <dd class="cont1 lineTwoOverflow"> 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。 </dd> <dd class="cont2">485次学习</dd> </dl> </li> </ul> </div> <div class="rightContBox"> <div class="rightTit"> <a href="/ai.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit lineOverflow">AI推荐</div> </div> <ul class="lessonRecomRList"> <li> <a href="/ai/13900.html" target="_blank" title="PubMedQA数据集详解:生物医学问答基准、功能与应用指南" class="img_box"> <img src="/uploads/20260908/6a9f83280940e7.65575695.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="PubMedQA数据集详解:生物医学问答基准、功能与应用指南" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13900.html" class="aBlack" target="_blank" title="PubMedQA">PubMedQA</a></dt> <dd class="cont1 lineTwoOverflow"> 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。 </dd> <dd class="cont2">368次使用</dd> </dl> </li> <li> <a href="/ai/13899.html" target="_blank" title="H2O EvalGPT:开源LLM大模型评估与排行榜工具" class="img_box"> <img src="/uploads/20260908/17887986376a9ee6adaf3f5.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="H2O EvalGPT:开源LLM大模型评估与排行榜工具" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13899.html" class="aBlack" target="_blank" title="H2O EvalGPT">H2O EvalGPT</a></dt> <dd class="cont1 lineTwoOverflow"> H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。 </dd> <dd class="cont2">426次使用</dd> </dl> </li> <li> <a href="/ai/13898.html" target="_blank" title="LMArena是什么?伯克利AI模型评估平台使用指南与功能解析" class="img_box"> <img src="/uploads/20260908/6a9f862dbcfec7.27385604.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="LMArena是什么?伯克利AI模型评估平台使用指南与功能解析" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13898.html" class="aBlack" target="_blank" title="LMArena">LMArena</a></dt> <dd class="cont1 lineTwoOverflow"> LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。 </dd> <dd class="cont2">442次使用</dd> </dl> </li> <li> <a href="/ai/13897.html" target="_blank" title="斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解" class="img_box"> <img src="/uploads/20260908/6a9f86b31ed789.06773114.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13897.html" class="aBlack" target="_blank" title="HELM">HELM</a></dt> <dd class="cont1 lineTwoOverflow"> 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。 </dd> <dd class="cont2">390次使用</dd> </dl> </li> <li> <a href="/ai/13896.html" target="_blank" title="MMBench详解:多模态大模型基准测试、功能特点与使用指南" class="img_box"> <img src="/uploads/20260908/6a9f86d3eed3e7.18564236.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="MMBench详解:多模态大模型基准测试、功能特点与使用指南" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13896.html" class="aBlack" target="_blank" title="MMBench">MMBench</a></dt> <dd class="cont1 lineTwoOverflow"> MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。 </dd> <dd class="cont2">217次使用</dd> </dl> </li> </ul> </div> <!-- 相关文章 --> <div class="rightContBox"> <div class="rightTit"> <a href="/articlelist.html" class="more" title="查看更多">查看更多<i class="iconfont"></i></a> <div class="tit lineOverflow">相关文章</div> </div> <ul class="aboutArticleRList"> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/207000.html" class="aBlack" title="JavaScript函数定义及示例详解">JavaScript函数定义及示例详解</a></dt> <dd> <span class="left">2025-05-11</span> <span class="right">502浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/621422.html" class="aBlack" title="智能体安全引领产业升级——国内AI安全产品市场深度分析">智能体安全引领产业升级——国内AI安全产品市场深度分析</a></dt> <dd> <span class="left">2026-08-21</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/619053.html" class="aBlack" title="CSS变量简化按钮悬停效果技巧">CSS变量简化按钮悬停效果技巧</a></dt> <dd> <span class="left">2026-05-31</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/618916.html" class="aBlack" title="JavaScript符号类型详解与应用">JavaScript符号类型详解与应用</a></dt> <dd> <span class="left">2026-05-31</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/612539.html" class="aBlack" title="HTML剪贴板复制粘贴怎么用">HTML剪贴板复制粘贴怎么用</a></dt> <dd> <span class="left">2026-05-26</span> <span class="right">501浏览</span> </dd> </dl> </li> </ul> </div> </div> </div> <div class="footer"> <div class="footerIn"> <div class="footLeft"> <div class="linkBox"> <a href="/about/1.html" target="_blank" class="aBlack" title="关于我们">关于我们</a> <a href="/about/5.html" target="_blank" class="aBlack" title="免责声明">免责声明</a> <a href="#" class="aBlack" title="意见反馈">意见反馈</a> <a href="/about/2.html" class="aBlack" target="_blank" title="联系我们">联系我们</a> <a href="/send.html" class="aBlack" title="广告合作">内容提交</a> <a href="/manual/go/" target="_blank" class="aBlack" title="手册">手册</a> </div> <div class="footTip">Golang学习网:公益在线Go学习平台,帮助Go学习者快速成长!</div> <div class="shareBox"> <span><i class="qq"></i>技术交流群</span> </div> <div class="copyRight"> Copyright 2023 http://www.17golang.com/ All Rights Reserved | <a href="https://beian.miit.gov.cn/" target="_blank" title="备案">湘ICP备19018815号-4</a> </div> </div> <div class="footRight"> <ul class="encodeList"> <li> <div class="encodeImg"> <img src="/assets/examples/qrcode_for_gh.jpg" alt="Golang学习网"> </div> <div class="tit">关注公众号</div> <div class="tip">Golang学习网</div> </li> <div class="clear"></div> </ul> </div> <div class="clear"></div> </div> </div> <!-- 微信登录弹窗 --> <style> .popupBg .n-error{ color: red; } </style> <div class="popupBg"> <div class="loginBoxBox"> <div class="imgbg"> <img src="/assets/images/leftlogo.jpg" alt=""> </div> <!-- 微信登录 --> <div class="loginInfo encodeLogin" style="display: none;"> <div class="closeIcon" onclick="$('.popupBg').hide();"></div> <div class="changeLoginType cursorPointer create_wxqrcode" onclick="$('.loginInfo').hide();$('.passwordLogin').show();"> <div class="tip">密码登录在这里</div> </div> <div class="encodeInfo"> <div class="tit"><i></i> 微信扫码登录或注册</div> <div class="encodeImg"> <span id="wx_login_qrcode"><img src="/assets/examples/code.png" alt="二维码"></span> <!-- <div class="refreshBox"> <p>二维码失效</p> <button type="button" class="create_wxqrcode">刷新1111</button> </div> --> </div> <div class="tip">打开微信扫一扫,快速登录/注册</div> </div> <div class="beforeLoginTip">登录即同意 <a href="#" class="aBlue" title="用户协议">用户协议</a> 和 <a href="#" class="aBlue" title="隐私政策">隐私政策</a></div> </div> <!-- 密码登录 --> <div class="loginInfo passwordLogin"> <div class="closeIcon" onclick="$('.popupBg').hide();"></div> <div class="changeLoginType cursorPointer create_wxqrcode" onclick="$('.loginInfo').hide();$('.encodeLogin').show();"> <div class="tip">微信登录更方便</div> </div> <div class="passwordInfo"> <ul class="logintabs selfTabMenu"> <li class="selfTabItem loginFormLi curr">密码登录</li> <li class="selfTabItem registerFormBox ">注册账号</li> </ul> <div class="selfTabContBox"> <div class="selfTabCont loginFormBox" style="display: block;"> <form name="form" id="login-form" class="form-vertical form" method="POST" action="/index/user/login"> <input type="hidden" name="url" value="//www.17golang.com/article/234277.html"/> <input type="hidden" name="__token__" value="ccb4c659ef480e382ab005c4a69273cf" /> <div class="form-group" style="height:70px;"> <input class="form-control" id="account" type="text" name="account" value="" data-rule="required" placeholder="邮箱/用户名" autocomplete="off"> </div> <div class="form-group" style="height:70px;"> <input class="form-control" id="password" type="password" name="password" data-rule="required;password" placeholder="密码" autocomplete="off"> </div> <div class="codeBox" style="height:70px;"> <div class="form-group" style="height:70px; width:205px; float: left;"> <input type="text" name="captcha" class="form-control" placeholder="验证码" data-rule="required;length(4)" /> </div> <span class="input-group-btn" style="padding:0;border:none;"> <img src="/captcha.html" width="100" height="45" onclick="this.src = '/captcha.html?r=' + Math.random();"/> </span> </div> <div class="other"> <a href="#" class="forgetPwd aGray" onclick="$('.loginInfo').hide();$('.passwordForget').show();" title="忘记密码">忘记密码</a> </div> <div class="loginBtn mt25"> <button type="submit">登录</button> </div> </form> </div> <div class="selfTabCont registerFormBox" style="display: none;"> <form name="form1" id="register-form" class="form-vertical form" method="POST" action="/index/user/register"> <input type="hidden" name="invite_user_id" value="0"/> <input type="hidden" name="url" value="//www.17golang.com/article/234277.html"/> <input type="hidden" name="__token__" value="ccb4c659ef480e382ab005c4a69273cf" /> <div class="form-group" style="height:70px;"> <input type="text" name="email" id="email2" data-rule="required;email" class="form-control" placeholder="邮箱"> </div> <div class="form-group" style="height:70px;"> <input type="text" id="username" name="username" data-rule="required;username" class="form-control" placeholder="用户名必须3-30个字符"> </div> <div class="form-group" style="height:70px;"> <input type="password" id="password2" name="password" data-rule="required;password" class="form-control" placeholder="密码必须6-30个字符"> </div> <div class="codeBox" style="height:70px;"> <div class="form-group" style="height:70px; width:205px; float: left;"> <input type="text" name="captcha" class="form-control" placeholder="验证码" data-rule="required;length(4)" /> </div> <span class="input-group-btn" style="padding:0;border:none;"> <img src="/captcha.html" width="100" height="45" onclick="this.src = '/captcha.html?r=' + Math.random();"/> </span> </div> <div class="loginBtn"> <button type="submit">注册</button> </div> </form> </div> </div> </div> <div class="beforeLoginTip">登录即同意 <a href="https://www.17golang.com/about/3.html" target="_blank" class="aBlue" title="用户协议">用户协议</a> 和 <a href="https://www.17golang.com/about/4.html" target="_blank" class="aBlue" title="隐私政策">隐私政策</a></div> </div> <!-- 重置密码 --> <div class="loginInfo passwordForget"> <div class="closeIcon" onclick="$('.popupBg').hide();"></div> <div class="returnLogin cursorPointer" onclick="$('.passwordForget').hide();$('.passwordLogin').show();">返回登录</div> <div class="passwordInfo"> <ul class="logintabs selfTabMenu"> <li class="selfTabItem">重置密码</li> </ul> <div class="selfTabContBox"> <div class="selfTabCont"> <form id="resetpwd-form" class="form-horizontal form-layer nice-validator n-default n-bootstrap form" method="POST" action="/api/user/resetpwd.html" novalidate="novalidate"> <div style="height:70px;"> <input type="text" class="form-control" id="email" name="email" value="" placeholder="输入邮箱" aria-invalid="true"> </div> <div class="codeBox" style="height:70px;"> <div class="form-group" style="height:70px; width:205px; float: left;"> <input type="text" name="captcha" class="form-control" placeholder="验证码" /> </div> <span class="input-group-btn" style="padding:0;border:none;"> <a href="javascript:;" class="btn btn-primary btn-captcha cursorPointer" style="background: #2080F8; border-radius: 4px; color: #fff; padding: 12px; position: absolute;" data-url="/api/ems/send.html" data-type="email" data-event="resetpwd">发送验证码</a> </span> </div> <input type="password" class="form-control" id="newpassword" name="newpassword" value="" placeholder="请输入6-18位密码"> <div class="loginBtn mt25"> <button type="submit">重置密码</button> </div> </form> </div> </div> </div> </div> </div> </div> <script src="/assets/js/juejin-theme.js?v=20260613b" defer></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?e34c3e8ab31ba35d7e1c48ea8d77315f"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script src="/assets/js/frontend/common.js"></script> </body> </html>