当前位置:首页 > 文章列表 > 文章 > 前端 > 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提供了 pushStatereplaceStatepopstate 事件,允许你操作浏览器的历史记录栈,而无需重新加载页面。

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 路由

    • 原理: 使用 pushStatereplaceState 来修改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 (
          <Router>
            <div>
              <nav>
                <ul>
                  <li>
                    <Link to="/">Home</Link>
                  </li>
                  <li>
                    <Link to="/about">About</Link>
                  </li>
                </ul>
              </nav>
      
              <Route path="/" exact component={Home} />
              <Route path="/about" component={About} />
            </div>
          </Router>
        );
      }
  4. Memory 路由

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

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

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

    • React Router 的 MemoryRouter:

      import { MemoryRouter, Route, Link } from 'react-router-dom';
      
      function App() {
        return (
          <MemoryRouter initialEntries={['/']} initialIndex={0}>
            <div>
              <nav>
                <ul>
                  <li>
                    <Link to="/">Home</Link>
                  </li>
                  <li>
                    <Link to="/about">About</Link>
                  </li>
                </ul>
              </nav>
      
              <Route path="/" exact component={Home} />
              <Route path="/about" component={About} />
            </div>
          </MemoryRouter>
        );
      }
  5. Static 路由 (预渲染)

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

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

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

    • Next.js 的静态生成:

      // pages/about.js
      function About() {
        return <h1>About Us</h1>;
      }
      
      export default About;
      
      // 在 Next.js 中,这个页面会在构建时被预渲染为静态 HTML 文件。

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

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

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

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

  • Apache .htaccess 文件:

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.html [L]
    </IfModule>
  • 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 (
          <Router>
            <div>
              <nav>
                <ul>
                  <li>
                    <Link to="/">Home</Link>
                  </li>
                  <li>
                    <Link to="/about">About</Link>
                  </li>
                </ul>
              </nav>
      
              <Suspense fallback={<div>Loading...</div>}>
                <Route path="/" exact component={Home} />
                <Route path="/about" component={About} />
              </Suspense>
            </div>
          </Router>
        );
      }
  2. 使用代码分割: 将你的应用拆分成更小的块,每个块只包含特定路由所需的代码。这可以减少初始下载大小。

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

    • :

      <link rel="preload" href="/static/js/about.js" as="script">
  4. 缓存路由数据: 如果你的路由组件需要从服务器获取数据,可以将数据缓存起来,避免重复请求。

    • 使用 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:

      <?xml version="1.0" encoding="UTF-8"?>
      <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        <url>
          <loc>https://example.com/</loc>
          <lastmod>2023-10-27</lastmod>
          <changefreq>daily</changefreq>
          <priority>1.0</priority>
        </url>
        <url>
          <loc>https://example.com/about</loc>
          <lastmod>2023-10-27</lastmod>
          <changefreq>monthly</changefreq>
          <priority>0.8</priority>
        </url>
      </urlset>
  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>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>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>history.pushState({ productId: 123 }, '', '/products/123');</pre></li><li><p><strong>获取状态对象</strong>:</p><pre>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/234535.html" class="img_box" title="手把手教学!HTML轻松实现响应式网格布局"> <img src="/uploads/20250619/1750337461685407b5c463e.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="手把手教学!HTML轻松实现响应式网格布局"> </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>   |  2分钟前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/234535.html" class="aBlack" target="_blank" title="手把手教学!HTML轻松实现响应式网格布局">手把手教学!HTML轻松实现响应式网格布局</a> </dt> <dd class="cont2"> <span><i class="view"></i>222浏览</span> <span class="collectBtn user_collection" data-id="234535" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234534.html" class="img_box" title="CSS边框不会调?手把手教你快速搞定边框样式!"> <img src="/uploads/20250619/175033741168540783cd075.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="CSS边框不会调?手把手教你快速搞定边框样式!"> </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>   |  3分钟前  |   <a href="javascript:;" class="aLightGray" title="border-style">border-style</a> <a href="javascript:;" class="aLightGray" title="border-color">border-color</a> <a href="javascript:;" class="aLightGray" title="CSS边框">CSS边框</a> <a href="javascript:;" class="aLightGray" title="border-width">border-width</a> <a href="javascript:;" class="aLightGray" title="backdrop-filter">backdrop-filter</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/234534.html" class="aBlack" target="_blank" title="CSS边框不会调?手把手教你快速搞定边框样式!">CSS边框不会调?手把手教你快速搞定边框样式!</a> </dt> <dd class="cont2"> <span><i class="view"></i>185浏览</span> <span class="collectBtn user_collection" data-id="234534" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234522.html" class="img_box" title="JS检测离线?4个小技巧教你轻松判断网络状态!"> <img src="/uploads/20250619/1750336685685404ad3d794.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="JS检测离线?4个小技巧教你轻松判断网络状态!"> </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>   |  15分钟前  |   <a href="javascript:;" class="aLightGray" title="JavaScript">JavaScript</a> <a href="javascript:;" class="aLightGray" title="navigator.onLine">navigator.onLine</a> <a href="javascript:;" class="aLightGray" title="网络状态">网络状态</a> <a href="javascript:;" class="aLightGray" title="ServiceWorker">ServiceWorker</a> <a href="javascript:;" class="aLightGray" title="离线检测">离线检测</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/234522.html" class="aBlack" target="_blank" title="JS检测离线?4个小技巧教你轻松判断网络状态!">JS检测离线?4个小技巧教你轻松判断网络状态!</a> </dt> <dd class="cont2"> <span><i class="view"></i>102浏览</span> <span class="collectBtn user_collection" data-id="234522" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234513.html" class="img_box" title="手把手教你搞懂JS迭代器协议,轻松掌握iterator实现原理"> <img src="/uploads/20250619/175033604868540230361dd.png" onerror="this.src='/assets/images/moren/morentu.png'" alt="手把手教你搞懂JS迭代器协议,轻松掌握iterator实现原理"> </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>   |  26分钟前  |   <a href="javascript:;" class="aLightGray" title="JavaScript">JavaScript</a> <a href="javascript:;" class="aLightGray" title="迭代器协议">迭代器协议</a> <a href="javascript:;" class="aLightGray" title="生成器函数">生成器函数</a> <a href="javascript:;" class="aLightGray" title="next()方法">next()方法</a> <a href="javascript:;" class="aLightGray" title="Symbol.iterator">Symbol.iterator</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/234513.html" class="aBlack" target="_blank" title="手把手教你搞懂JS迭代器协议,轻松掌握iterator实现原理">手把手教你搞懂JS迭代器协议,轻松掌握iterator实现原理</a> </dt> <dd class="cont2"> <span><i class="view"></i>111浏览</span> <span class="collectBtn user_collection" data-id="234513" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234511.html" class="img_box" title="JS如何优雅地操作元素样式?(附代码示例)"> <img src="/uploads/20250619/1750335964685401dc6f893.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="JS如何优雅地操作元素样式?(附代码示例)"> </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>   |  27分钟前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/234511.html" class="aBlack" target="_blank" title="JS如何优雅地操作元素样式?(附代码示例)">JS如何优雅地操作元素样式?(附代码示例)</a> </dt> <dd class="cont2"> <span><i class="view"></i>101浏览</span> <span class="collectBtn user_collection" data-id="234511" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234505.html" class="img_box" title="JS缓存问题这样解决,轻松搞定老旧资源加载"> <img src="/uploads/20250619/1750335674685400ba0bcc7.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="JS缓存问题这样解决,轻松搞定老旧资源加载"> </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>   |  32分钟前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/234505.html" class="aBlack" target="_blank" title="JS缓存问题这样解决,轻松搞定老旧资源加载">JS缓存问题这样解决,轻松搞定老旧资源加载</a> </dt> <dd class="cont2"> <span><i class="view"></i>165浏览</span> <span class="collectBtn user_collection" data-id="234505" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234500.html" class="img_box" title="JS如何判断音频能不能播?三种音频状态检测方法"> <img src="/uploads/20250619/17503353846853ff98dd8e4.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="JS如何判断音频能不能播?三种音频状态检测方法"> </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>   |  37分钟前  |   <a href="javascript:;" class="aLightGray" title="JavaScript">JavaScript</a> <a href="javascript:;" class="aLightGray" title="音频播放">音频播放</a> <a href="javascript:;" class="aLightGray" title="事件监听">事件监听</a> <a href="javascript:;" class="aLightGray" title="浏览器兼容性">浏览器兼容性</a> <a href="javascript:;" class="aLightGray" title="canPlayType">canPlayType</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/234500.html" class="aBlack" target="_blank" title="JS如何判断音频能不能播?三种音频状态检测方法">JS如何判断音频能不能播?三种音频状态检测方法</a> </dt> <dd class="cont2"> <span><i class="view"></i>432浏览</span> <span class="collectBtn user_collection" data-id="234500" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234498.html" class="img_box" title="手把手教你用CSS设置圆角边框,超简单教程来了!"> <img src="/uploads/20250619/17503351886853fed4783c7.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="手把手教你用CSS设置圆角边框,超简单教程来了!"> </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>   |  40分钟前  |   <a href="javascript:;" class="aLightGray" title="CSS">CSS</a> <a href="javascript:;" class="aLightGray" title="百分比">百分比</a> <a href="javascript:;" class="aLightGray" title="边框">边框</a> <a href="javascript:;" class="aLightGray" title="圆角">圆角</a> <a href="javascript:;" class="aLightGray" title="border-radius">border-radius</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/234498.html" class="aBlack" target="_blank" title="手把手教你用CSS设置圆角边框,超简单教程来了!">手把手教你用CSS设置圆角边框,超简单教程来了!</a> </dt> <dd class="cont2"> <span><i class="view"></i>447浏览</span> <span class="collectBtn user_collection" data-id="234498" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234496.html" class="img_box" title="html怎么插入图片?img标签src和alt属性超详细解析"> <img src="/uploads/20250619/17503351266853fe96dfb05.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="html怎么插入图片?img标签src和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>   |  41分钟前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/234496.html" class="aBlack" target="_blank" title="html怎么插入图片?img标签src和alt属性超详细解析">html怎么插入图片?img标签src和alt属性超详细解析</a> </dt> <dd class="cont2"> <span><i class="view"></i>134浏览</span> <span class="collectBtn user_collection" data-id="234496" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234495.html" class="img_box" title="手把手教你用CSS弹性布局,超简单实现教程"> <img src="/uploads/20250619/17503350676853fe5bb9922.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="手把手教你用CSS弹性布局,超简单实现教程"> </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>   |  42分钟前  |   <a href="javascript:;" class="aLightGray" title="兼容性">兼容性</a> <a href="javascript:;" class="aLightGray" title="CSS布局">CSS布局</a> <a href="javascript:;" class="aLightGray" title="FLEXBOX">FLEXBOX</a> <a href="javascript:;" class="aLightGray" title="弹性容器">弹性容器</a> <a href="javascript:;" class="aLightGray" title="圣杯布局">圣杯布局</a> </span> </dd> <dt class="lineOverflow"> <a href="/article/234495.html" class="aBlack" target="_blank" title="手把手教你用CSS弹性布局,超简单实现教程">手把手教你用CSS弹性布局,超简单实现教程</a> </dt> <dd class="cont2"> <span><i class="view"></i>362浏览</span> <span class="collectBtn user_collection" data-id="234495" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234494.html" class="img_box" title="搞懂CSS中100vh单位,这篇文章就够了"> <img src="/uploads/20250619/17503350066853fe1e20a3c.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="搞懂CSS中100vh单位,这篇文章就够了"> </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>   |  43分钟前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/234494.html" class="aBlack" target="_blank" title="搞懂CSS中100vh单位,这篇文章就够了">搞懂CSS中100vh单位,这篇文章就够了</a> </dt> <dd class="cont2"> <span><i class="view"></i>178浏览</span> <span class="collectBtn user_collection" data-id="234494" data-type="article" title="收藏"><i class="collect"></i>收藏</span> </dd> </dl> </div> </li> <li> <div class="contBox"> <a href="/article/234492.html" class="img_box" title="手把手教你玩转JavaScriptPromise,轻松搞定异步编程"> <img src="/uploads/20250619/17503348846853fda4398ca.jpg" onerror="this.src='/assets/images/moren/morentu.png'" alt="手把手教你玩转JavaScriptPromise,轻松搞定异步编程"> </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>   |  45分钟前  |   </span> </dd> <dt class="lineOverflow"> <a href="/article/234492.html" class="aBlack" target="_blank" title="手把手教你玩转JavaScriptPromise,轻松搞定异步编程">手把手教你玩转JavaScriptPromise,轻松搞定异步编程</a> </dt> <dd class="cont2"> <span><i class="view"></i>464浏览</span> <span class="collectBtn user_collection" data-id="234492" 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">542次学习</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">508次学习</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">497次学习</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">484次学习</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/13013.html" target="_blank" title="茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信" class="img_box"> <img src="/uploads/20250615/1749942634684e016a05088.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13013.html" class="aBlack" target="_blank" title="茅茅虫AIGC检测">茅茅虫AIGC检测</a></dt> <dd class="cont1 lineTwoOverflow"> 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。 </dd> <dd class="cont2">60次使用</dd> </dl> </li> <li> <a href="/ai/13012.html" target="_blank" title="赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新" class="img_box"> <img src="/uploads/20250608/1749370801684547b1cedf0.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13012.html" class="aBlack" target="_blank" title="赛林匹克平台(Challympics)">赛林匹克平台(Challympics)</a></dt> <dd class="cont1 lineTwoOverflow"> 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。 </dd> <dd class="cont2">78次使用</dd> </dl> </li> <li> <a href="/ai/13011.html" target="_blank" title="SEO 笔格AIPPT:AI智能PPT制作,免费生成,高效演示" class="img_box"> <img src="/uploads/20250608/17493702026845455aaeaaa.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="SEO 笔格AIPPT:AI智能PPT制作,免费生成,高效演示" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13011.html" class="aBlack" target="_blank" title="笔格AIPPT">笔格AIPPT</a></dt> <dd class="cont1 lineTwoOverflow"> SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。 </dd> <dd class="cont2">88次使用</dd> </dl> </li> <li> <a href="/ai/13010.html" target="_blank" title="稿定PPT:在线AI演示设计,高效PPT制作工具" class="img_box"> <img src="/uploads/20250608/1749374402684555c23e035.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="稿定PPT:在线AI演示设计,高效PPT制作工具" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13010.html" class="aBlack" target="_blank" title="稿定PPT">稿定PPT</a></dt> <dd class="cont1 lineTwoOverflow"> 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意! </dd> <dd class="cont2">81次使用</dd> </dl> </li> <li> <a href="/ai/13009.html" target="_blank" title="Suno苏诺中文版:AI音乐创作平台,人人都是音乐家" class="img_box"> <img src="/uploads/20250608/174937140168454a09ec362.jpg" onerror="this.onerror='',this.src='/assets/images/moren/morentu.png'" alt="Suno苏诺中文版:AI音乐创作平台,人人都是音乐家" style="object-fit:cover;width:100%;height:100%;"> </a> <dl> <dt class="lineTwoOverflow"><a href="/ai/13009.html" class="aBlack" target="_blank" title="Suno苏诺中文版">Suno苏诺中文版</a></dt> <dd class="cont1 lineTwoOverflow"> 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感! </dd> <dd class="cont2">85次使用</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/72840.html" class="aBlack" title="优化用户界面体验的秘密武器:CSS开发项目经验大揭秘">优化用户界面体验的秘密武器:CSS开发项目经验大揭秘</a></dt> <dd> <span class="left">2023-11-03</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/76259.html" class="aBlack" title="使用微信小程序实现图片轮播特效">使用微信小程序实现图片轮播特效</a></dt> <dd> <span class="left">2023-11-21</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/83771.html" class="aBlack" title="解析sessionStorage的存储能力与限制">解析sessionStorage的存储能力与限制</a></dt> <dd> <span class="left">2024-01-11</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/85057.html" class="aBlack" title="探索冒泡活动对于团队合作的推动力">探索冒泡活动对于团队合作的推动力</a></dt> <dd> <span class="left">2024-01-13</span> <span class="right">501浏览</span> </dd> </dl> </li> <li> <dl> <dt class="lineTwoOverflow"><a href="/article/91359.html" class="aBlack" title="UI设计中为何选择绝对定位的智慧之道">UI设计中为何选择绝对定位的智慧之道</a></dt> <dd> <span class="left">2024-02-03</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> </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备2023003363号-1</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="6a251720098a8b85c10b34d8cda9a404" /> <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="6a251720098a8b85c10b34d8cda9a404" /> <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> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?3dc5666f6478c7bf39cd5c91e597423d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script src="/assets/js/require.js" data-main="/assets/js/require-frontend.js?v=1671101972"></script> </body> </html>