微网站 前景/如何做网站营销

微网站 前景,如何做网站营销,做网站的app有什么作用,做网盟的网站必须备案文章目录 引言1. Vue Router 简介1.1 安装 Vue Router1.2 配置 Vue Router1.3 在 Vue 实例中使用 Vue Router 2. 路由的基本用法2.1 路由映射2.2 路由视图2.3 路由链接 3. 动态路由3.1 动态路径参数3.2 访问动态参数3.3 响应路由参数的变化 4. 嵌套路由4.1 定义嵌套路由4.2 渲染…

文章目录

    • 引言
    • 1. Vue Router 简介
      • 1.1 安装 Vue Router
      • 1.2 配置 Vue Router
      • 1.3 在 Vue 实例中使用 Vue Router
    • 2. 路由的基本用法
      • 2.1 路由映射
      • 2.2 路由视图
      • 2.3 路由链接
    • 3. 动态路由
      • 3.1 动态路径参数
      • 3.2 访问动态参数
      • 3.3 响应路由参数的变化
    • 4. 嵌套路由
      • 4.1 定义嵌套路由
      • 4.2 渲染嵌套路由
    • 5. 路由守卫
      • 5.1 全局守卫
      • 5.2 路由独享守卫
      • 5.3 组件内守卫
    • 6. 路由懒加载
      • 6.1 使用动态导入实现懒加载
      • 6.2 使用 Webpack 的魔法注释
    • 7. 路由元信息
      • 7.1 定义路由元信息
      • 7.2 使用路由元信息
    • 8. 路由过渡效果
      • 8.1 使用 `<transition>` 组件
      • 8.2 自定义过渡效果
    • 9. 路由滚动行为
      • 9.1 定义路由滚动行为
      • 9.2 滚动到指定元素
    • 10. 路由模式
      • 10.1 Hash 模式
      • 10.2 History 模式
      • 10.3 服务器配置
    • 11. 路由错误处理
      • 11.1 捕获路由错误
      • 11.2 定义 404 路由
    • 12. 路由与状态管理
      • 12.1 在路由守卫中更新状态
      • 12.2 在组件中访问路由和状态
    • 13. 路由与权限控制
      • 13.1 权限验证
      • 13.2 动态路由
    • 14. 路由与 SEO
      • 14.1 服务器端渲染
      • 14.2 预渲染
    • 15. 路由与性能优化
      • 15.1 路由懒加载
      • 15.2 路由预取
      • 15.3 路由缓存
    • 16. 路由与国际化
      • 16.1 定义国际化路由
      • 16.2 动态切换语言
    • 17. 路由与动画
      • 17.1 使用 `<transition>` 组件
      • 17.2 自定义路由动画
    • 18. 路由与测试
      • 18.1 单元测试
      • 18.2 端到端测试
    • 19. 路由与调试
      • 19.1 使用 Vue Devtools
      • 19.2 使用 `router.beforeEach` 调试
    • 20. 路由与插件
      • 20.1 使用 `VueRouter.prototype`
      • 20.2 使用插件
    • 21. 路由与 TypeScript
      • 21.1 定义路由类型
      • 21.2 使用路由类型
    • 22. 路由与性能监控
      • 22.1 使用 `router.onReady`
      • 22.2 使用 `router.afterEach`
    • 23. 路由与错误监控
      • 23.1 使用 `router.onError`
      • 23.2 使用 `router.beforeEach`
    • 24. 路由与日志
      • 24.1 使用 `router.beforeEach`
      • 24.2 使用 `router.afterEach`
    • 25. 路由与安全
      • 25.1 使用路由守卫
      • 25.2 使用 HTTPS
    • 26. 路由与缓存
      • 26.1 使用 `<keep-alive>`
      • 26.2 动态缓存
    • 27. 路由与懒加载
      • 27.1 使用动态导入
      • 27.2 使用 Webpack 的魔法注释
    • 28. 路由与预加载
      • 28.1 使用 `router.beforeEach`
      • 28.2 使用 `router.onReady`

引言

在现代前端开发中,单页面应用(SPA)已经成为主流。SPA 通过动态地重写当前页面来与用户交互,而不是从服务器加载整个新页面。这种方式不仅提高了用户体验,还减少了服务器的负担。Vue.js 作为一个流行的前端框架,提供了强大的路由功能,使得开发者能够轻松地构建复杂的单页面应用。

本文将深入探讨 Vue 前端开发中的路由知识,涵盖从基础概念到高级用法的各个方面。我们将从 Vue Router 的安装和配置开始,逐步介绍路由的基本用法、动态路由、嵌套路由、路由守卫、懒加载等高级特性,并通过丰富的代码示例和实际案例帮助读者更好地理解和掌握这些知识。

1. Vue Router 简介

Vue Router 是 Vue.js 官方的路由管理器,它与 Vue.js 核心深度集成,使得构建单页面应用变得轻而易举。Vue Router 允许我们定义路由映射关系,并在用户访问不同 URL 时渲染不同的组件。

1.1 安装 Vue Router

在使用 Vue Router 之前,我们需要先安装它。可以通过 npm 或 yarn 来安装 Vue Router:

npm install vue-router

或者:

yarn add vue-router

1.2 配置 Vue Router

安装完成后,我们需要在 Vue 项目中配置 Vue Router。通常,我们会创建一个 router 目录,并在其中创建一个 index.js 文件来配置路由。

// src/router/index.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';Vue.use(VueRouter);const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];const router = new VueRouter({mode: 'history',routes
});export default router;

在上面的代码中,我们首先引入了 Vue 和 VueRouter,然后通过 Vue.use(VueRouter) 来安装 Vue Router。接着,我们定义了一个路由数组 routes,其中每个路由对象都包含 pathnamecomponent 属性。最后,我们创建了一个 VueRouter 实例,并将其导出。

1.3 在 Vue 实例中使用 Vue Router

配置好路由后,我们需要在 Vue 实例中使用它。通常,我们会在 main.js 文件中引入并使用路由。

// src/main.js
import Vue from 'vue';
import App from './App.vue';
import router from './router';Vue.config.productionTip = false;new Vue({router,render: h => h(App)
}).$mount('#app');

在上面的代码中,我们将 router 实例注入到 Vue 实例中,这样整个应用就可以使用 Vue Router 了。

2. 路由的基本用法

2.1 路由映射

在 Vue Router 中,路由映射是通过 routes 数组来定义的。每个路由对象都包含 pathnamecomponent 属性。

  • path:表示路由的路径,可以是静态路径或动态路径。
  • name:表示路由的名称,可以通过名称来引用路由。
  • component:表示路由对应的组件。
const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];

2.2 路由视图

在 Vue Router 中,路由视图是通过 <router-view> 组件来渲染的。<router-view> 是一个占位符,用于显示与当前路由匹配的组件。

<!-- src/App.vue -->
<template><div id="app"><router-view></router-view></div>
</template>

在上面的代码中,<router-view> 会根据当前路由动态渲染对应的组件。

2.3 路由链接

在 Vue Router 中,路由链接是通过 <router-link> 组件来创建的。<router-link> 是一个导航链接,用于在不同的路由之间切换。

<!-- src/App.vue -->
<template><div id="app"><nav><router-link to="/">Home</router-link><router-link to="/about">About</router-link></nav><router-view></router-view></div>
</template>

在上面的代码中,<router-link> 会根据 to 属性生成相应的链接,并在用户点击时导航到对应的路由。

3. 动态路由

在实际开发中,我们经常需要根据不同的参数来动态渲染组件。Vue Router 提供了动态路由的功能,允许我们在路由路径中使用动态参数。

3.1 动态路径参数

在路由路径中,我们可以使用 : 来定义动态参数。例如,我们可以定义一个包含用户 ID 的动态路由:

const routes = [{path: '/user/:id',name: 'User',component: User}
];

在上面的代码中,:id 是一个动态参数,它可以匹配任何值。例如,/user/1/user/2 都会匹配到这个路由。

3.2 访问动态参数

在组件中,我们可以通过 this.$route.params 来访问动态参数。例如,在 User 组件中,我们可以通过 this.$route.params.id 来获取用户 ID。

// src/views/User.vue
<template><div><h1>User ID: {{ userId }}</h1></div>
</template><script>
export default {computed: {userId() {return this.$route.params.id;}}
};
</script>

在上面的代码中,我们通过 this.$route.params.id 获取了用户 ID,并在模板中显示出来。

3.3 响应路由参数的变化

当路由参数发生变化时,Vue Router 会复用同一个组件实例,而不是销毁并重新创建。这意味着,组件的生命周期钩子(如 mounted)不会再次触发。为了响应路由参数的变化,我们可以使用 watch 来监听 $route 对象的变化。

// src/views/User.vue
<template><div><h1>User ID: {{ userId }}</h1></div>
</template><script>
export default {computed: {userId() {return this.$route.params.id;}},watch: {'$route.params.id'(newId, oldId) {console.log('User ID changed from', oldId, 'to', newId);}}
};
</script>

在上面的代码中,我们通过 watch 监听 $route.params.id 的变化,并在控制台中输出变化信息。

4. 嵌套路由

在实际开发中,我们经常需要在一个组件中嵌套其他组件。Vue Router 提供了嵌套路由的功能,允许我们在一个路由中定义子路由。

4.1 定义嵌套路由

在路由配置中,我们可以通过 children 属性来定义嵌套路由。例如,我们可以在 User 组件中定义两个子路由:ProfilePosts

const routes = [{path: '/user/:id',component: User,children: [{path: 'profile',component: Profile},{path: 'posts',component: Posts}]}
];

在上面的代码中,User 组件是父路由,ProfilePosts 是子路由。当用户访问 /user/1/profile 时,User 组件会渲染 Profile 组件;当用户访问 /user/1/posts 时,User 组件会渲染 Posts 组件。

4.2 渲染嵌套路由

在父组件中,我们可以通过 <router-view> 来渲染子路由。例如,在 User 组件中,我们可以使用 <router-view> 来渲染 ProfilePosts 组件。

<!-- src/views/User.vue -->
<template><div><h1>User ID: {{ userId }}</h1><router-view></router-view></div>
</template><script>
export default {computed: {userId() {return this.$route.params.id;}}
};
</script>

在上面的代码中,<router-view> 会根据当前子路由动态渲染 ProfilePosts 组件。

5. 路由守卫

路由守卫是 Vue Router 提供的一种机制,允许我们在路由导航过程中执行一些操作,例如权限验证、数据预取等。Vue Router 提供了三种路由守卫:全局守卫、路由独享守卫和组件内守卫。

5.1 全局守卫

全局守卫是在路由导航过程中全局生效的守卫。Vue Router 提供了三种全局守卫:beforeEachbeforeResolveafterEach

  • beforeEach:在路由导航之前执行,常用于权限验证。
  • beforeResolve:在路由导航确认之前执行,常用于数据预取。
  • afterEach:在路由导航完成之后执行,常用于日志记录。
// src/router/index.js
const router = new VueRouter({mode: 'history',routes
});router.beforeEach((to, from, next) => {console.log('Global beforeEach guard');next();
});router.beforeResolve((to, from, next) => {console.log('Global beforeResolve guard');next();
});router.afterEach((to, from) => {console.log('Global afterEach guard');
});export default router;

在上面的代码中,我们定义了三个全局守卫,并在控制台中输出相应的日志信息。

5.2 路由独享守卫

路由独享守卫是在某个特定路由上生效的守卫。我们可以在路由配置中通过 beforeEnter 属性来定义路由独享守卫。

const routes = [{path: '/user/:id',component: User,beforeEnter: (to, from, next) => {console.log('Route-specific beforeEnter guard');next();}}
];

在上面的代码中,我们为 /user/:id 路由定义了一个 beforeEnter 守卫,并在控制台中输出日志信息。

5.3 组件内守卫

组件内守卫是在组件内部定义的守卫。Vue Router 提供了三种组件内守卫:beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave

  • beforeRouteEnter:在路由进入组件之前执行,常用于权限验证。
  • beforeRouteUpdate:在路由更新时执行,常用于响应路由参数的变化。
  • beforeRouteLeave:在路由离开组件之前执行,常用于提示用户保存未保存的数据。
// src/views/User.vue
<template><div><h1>User ID: {{ userId }}</h1></div>
</template><script>
export default {computed: {userId() {return this.$route.params.id;}},beforeRouteEnter(to, from, next) {console.log('Component beforeRouteEnter guard');next();},beforeRouteUpdate(to, from, next) {console.log('Component beforeRouteUpdate guard');next();},beforeRouteLeave(to, from, next) {console.log('Component beforeRouteLeave guard');next();}
};
</script>

在上面的代码中,我们定义了三个组件内守卫,并在控制台中输出相应的日志信息。

6. 路由懒加载

随着应用的规模增大,打包后的 JavaScript 文件也会变得越来越大,这会导致应用的初始加载时间变长。为了优化应用的性能,Vue Router 提供了路由懒加载的功能,允许我们将路由对应的组件按需加载。

6.1 使用动态导入实现懒加载

在 Vue Router 中,我们可以使用动态导入(import())来实现路由懒加载。动态导入会返回一个 Promise,Vue Router 会在需要时加载对应的组件。

const routes = [{path: '/',name: 'Home',component: () => import('../views/Home.vue')},{path: '/about',name: 'About',component: () => import('../views/About.vue')}
];

在上面的代码中,我们使用动态导入来懒加载 HomeAbout 组件。这样,只有在用户访问 //about 时,才会加载对应的组件。

6.2 使用 Webpack 的魔法注释

在使用动态导入时,我们可以使用 Webpack 的魔法注释来为生成的 chunk 命名。这样,我们可以更好地管理和调试生成的代码。

const routes = [{path: '/',name: 'Home',component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')},{path: '/about',name: 'About',component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')}
];

在上面的代码中,我们使用 webpackChunkName 魔法注释为 HomeAbout 组件生成的 chunk 命名。这样,生成的 chunk 文件会被命名为 home.jsabout.js

7. 路由元信息

在实际开发中,我们经常需要为路由添加一些额外的信息,例如权限、标题等。Vue Router 提供了路由元信息的功能,允许我们在路由配置中添加自定义的元信息。

7.1 定义路由元信息

在路由配置中,我们可以通过 meta 属性来定义路由元信息。例如,我们可以为每个路由添加一个 requiresAuth 元信息,表示该路由是否需要登录才能访问。

const routes = [{path: '/',name: 'Home',component: Home,meta: {requiresAuth: false}},{path: '/dashboard',name: 'Dashboard',component: Dashboard,meta: {requiresAuth: true}}
];

在上面的代码中,我们为 //dashboard 路由分别定义了 requiresAuth 元信息。

7.2 使用路由元信息

在路由守卫中,我们可以通过 to.meta 来访问路由元信息。例如,我们可以在全局守卫中检查路由是否需要登录。

router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isAuthenticated()) {next('/login');} else {next();}
});

在上面的代码中,我们检查 to.meta.requiresAuth 是否为 true,并且用户是否已经登录。如果路由需要登录但用户未登录,则重定向到 /login 路由。

8. 路由过渡效果

在 Vue Router 中,我们可以通过 <transition> 组件为路由切换添加过渡效果。Vue 提供了多种过渡效果,例如淡入淡出、滑动等。

8.1 使用 <transition> 组件

App.vue 中,我们可以使用 <transition> 组件包裹 <router-view>,并为路由切换添加过渡效果。

<!-- src/App.vue -->
<template><div id="app"><transition name="fade" mode="out-in"><router-view></router-view></transition></div>
</template><style>
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}
</style>

在上面的代码中,我们使用 <transition> 组件为 <router-view> 添加了淡入淡出的过渡效果。name="fade" 表示使用 fade 过渡效果,mode="out-in" 表示在切换路由时,先离开当前路由,再进入新路由。

8.2 自定义过渡效果

除了使用 Vue 提供的过渡效果外,我们还可以自定义过渡效果。例如,我们可以为不同的路由定义不同的过渡效果。

<!-- src/App.vue -->
<template><div id="app"><transition :name="transitionName" mode="out-in"><router-view></router-view></transition></div>
</template><script>
export default {data() {return {transitionName: 'fade'};},watch: {'$route'(to, from) {if (to.meta.transitionName) {this.transitionName = to.meta.transitionName;} else {this.transitionName = 'fade';}}}
};
</script><style>
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}.slide-enter-active, .slide-leave-active {transition: transform 0.5s;
}
.slide-enter, .slide-leave-to {transform: translateX(100%);
}
</style>

在上面的代码中,我们通过 watch 监听 $route 的变化,并根据路由的 meta.transitionName 属性动态设置过渡效果。例如,如果路由的 meta.transitionNameslide,则使用滑动过渡效果。

9. 路由滚动行为

在单页面应用中,当用户切换路由时,页面的滚动位置通常会保持不变。为了提升用户体验,Vue Router 提供了路由滚动行为的功能,允许我们在路由切换时控制页面的滚动位置。

9.1 定义路由滚动行为

在 Vue Router 配置中,我们可以通过 scrollBehavior 函数来定义路由滚动行为。scrollBehavior 函数接收 tofromsavedPosition 三个参数,并返回一个滚动位置对象。

const router = new VueRouter({mode: 'history',routes,scrollBehavior(to, from, savedPosition) {if (savedPosition) {return savedPosition;} else {return { x: 0, y: 0 };}}
});

在上面的代码中,我们定义了一个 scrollBehavior 函数。如果 savedPosition 存在(即用户通过浏览器的前进/后退按钮导航),则返回 savedPosition;否则,返回 { x: 0, y: 0 },即滚动到页面顶部。

9.2 滚动到指定元素

除了滚动到页面顶部外,我们还可以滚动到页面中的指定元素。例如,我们可以滚动到某个锚点。

const router = new VueRouter({mode: 'history',routes,scrollBehavior(to, from, savedPosition) {if (to.hash) {return { selector: to.hash };} else if (savedPosition) {return savedPosition;} else {return { x: 0, y: 0 };}}
});

在上面的代码中,如果 to.hash 存在(即 URL 中包含锚点),则滚动到对应的元素;否则,按照默认行为滚动。

10. 路由模式

Vue Router 支持两种路由模式:hash 模式和 history 模式。

10.1 Hash 模式

Hash 模式是 Vue Router 的默认模式。在 Hash 模式下,URL 中的路径会以 # 开头。例如,http://example.com/#/user/1

Hash 模式的优点是兼容性好,可以在不支持 HTML5 History API 的浏览器中使用。缺点是 URL 不够美观,且 # 后面的部分不会被发送到服务器。

const router = new VueRouter({mode: 'hash',routes
});

10.2 History 模式

History 模式使用 HTML5 History API 来实现路由。在 History 模式下,URL 中的路径是正常的路径,例如 http://example.com/user/1

History 模式的优点是 URL 美观,且路径会被发送到服务器。缺点是需要服务器配置支持,否则在刷新页面时会出现 404 错误。

const router = new VueRouter({mode: 'history',routes
});

10.3 服务器配置

在使用 History 模式时,我们需要确保服务器能够正确处理所有的路由请求。通常,我们需要在服务器配置中添加一个回退路由,将所有未匹配的请求重定向到 index.html

例如,在 Nginx 中,我们可以添加以下配置:

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

在 Apache 中,我们可以添加以下配置:

<IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index\.html$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . /index.html [L]
</IfModule>

11. 路由错误处理

在实际开发中,我们可能会遇到一些路由错误,例如用户访问了不存在的路由。为了提升用户体验,Vue Router 提供了路由错误处理的功能。

11.1 捕获路由错误

在 Vue Router 中,我们可以通过 router.onError 方法来捕获路由错误。例如,我们可以捕获路由加载失败的错误。

router.onError((error) => {console.error('Route error:', error);
});

在上面的代码中,我们通过 router.onError 方法捕获路由错误,并在控制台中输出错误信息。

11.2 定义 404 路由

为了处理用户访问不存在的路由的情况,我们可以定义一个 404 路由。通常,我们会将 404 路由放在路由配置的最后。

const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About},{path: '*',component: NotFound}
];

在上面的代码中,我们定义了一个 * 路由,用于匹配所有未定义的路由。当用户访问不存在的路由时,会渲染 NotFound 组件。

12. 路由与状态管理

在实际开发中,我们经常需要将路由与状态管理结合起来使用。例如,我们可能需要在路由切换时更新 Vuex 中的状态。

12.1 在路由守卫中更新状态

在路由守卫中,我们可以通过 store.commitstore.dispatch 来更新 Vuex 中的状态。例如,我们可以在全局守卫中更新用户的登录状态。

router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !store.state.isAuthenticated) {next('/login');} else {next();}
});

在上面的代码中,我们检查 to.meta.requiresAuth 是否为 true,并且用户是否已经登录。如果路由需要登录但用户未登录,则重定向到 /login 路由。

12.2 在组件中访问路由和状态

在组件中,我们可以通过 this.$routethis.$store 来访问路由和状态。例如,我们可以在组件中根据当前路由和状态来渲染不同的内容。

<template><div><h1>{{ pageTitle }}</h1></div>
</template><script>
export default {computed: {pageTitle() {return this.$route.meta.title || 'Default Title';},isAuthenticated() {return this.$store.state.isAuthenticated;}}
};
</script>

在上面的代码中,我们通过 this.$route.meta.title 获取当前路由的标题,并通过 this.$store.state.isAuthenticated 获取用户的登录状态。

13. 路由与权限控制

在实际开发中,我们经常需要根据用户的权限来控制路由的访问。Vue Router 提供了路由守卫的功能,允许我们在路由导航过程中进行权限验证。

13.1 权限验证

在路由守卫中,我们可以根据用户的权限来决定是否允许访问某个路由。例如,我们可以在全局守卫中检查用户是否具有访问某个路由的权限。

router.beforeEach((to, from, next) => {if (to.meta.requiresAdmin && !store.state.isAdmin) {next('/forbidden');} else {next();}
});

在上面的代码中,我们检查 to.meta.requiresAdmin 是否为 true,并且用户是否具有管理员权限。如果路由需要管理员权限但用户没有权限,则重定向到 /forbidden 路由。

13.2 动态路由

在某些情况下,我们可能需要根据用户的权限动态生成路由。例如,我们可以在用户登录后根据用户的权限动态添加路由。

const adminRoutes = [{path: '/admin',component: Admin,meta: {requiresAdmin: true}}
];router.addRoutes(adminRoutes);

在上面的代码中,我们定义了一个 adminRoutes 数组,并在用户登录后通过 router.addRoutes 方法动态添加这些路由。

14. 路由与 SEO

在单页面应用中,由于页面的内容是通过 JavaScript 动态生成的,搜索引擎可能无法正确抓取页面的内容。为了提升 SEO(搜索引擎优化),我们可以使用服务器端渲染(SSR)或预渲染(Prerendering)技术。

14.1 服务器端渲染

服务器端渲染(SSR)是指在服务器端生成 HTML 内容,并将其发送到客户端。Vue 提供了官方的 SSR 解决方案,即 Vue Server Renderer。

使用 SSR 可以确保搜索引擎能够正确抓取页面的内容,从而提升 SEO。然而,SSR 的实现比较复杂,需要对服务器和客户端代码进行特殊处理。

14.2 预渲染

预渲染(Prerendering)是指在构建时生成静态 HTML 文件,并将其作为静态资源提供给客户端。预渲染可以提升 SEO,并且实现相对简单。

在 Vue 项目中,我们可以使用 prerender-spa-plugin 插件来实现预渲染。

// vue.config.js
const PrerenderSPAPlugin = require('prerender-spa-plugin');
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
const path = require('path');module.exports = {configureWebpack: {plugins: [new PrerenderSPAPlugin({staticDir: path.join(__dirname, 'dist'),routes: ['/', '/about', '/user/1'],renderer: new Renderer({renderAfterDocumentEvent: 'render-event'})})]}
};

在上面的代码中,我们使用 prerender-spa-plugin 插件为 //about/user/1 路由生成静态 HTML 文件。

15. 路由与性能优化

在实际开发中,我们可能需要对路由进行性能优化,以提升应用的加载速度和运行效率。

15.1 路由懒加载

如前所述,路由懒加载可以有效地减少初始加载时间。我们可以将路由对应的组件按需加载,从而减少初始加载的 JavaScript 文件大小。

const routes = [{path: '/',name: 'Home',component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')},{path: '/about',name: 'About',component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')}
];

15.2 路由预取

在某些情况下,我们可能希望在用户访问某个路由之前预取该路由对应的组件。Vue Router 提供了路由预取的功能,允许我们在用户导航到某个路由之前预取该路由的组件。

router.beforeEach((to, from, next) => {if (to.meta.prefetch) {to.matched[0].components.default().then(() => {next();});} else {next();}
});

在上面的代码中,我们检查 to.meta.prefetch 是否为 true,并在导航之前预取该路由的组件。

15.3 路由缓存

在某些情况下,我们可能希望缓存某些路由的组件,以避免重复渲染。Vue 提供了 <keep-alive> 组件,允许我们缓存路由组件。

<template><div id="app"><keep-alive><router-view></router-view></keep-alive></div>
</template>

在上面的代码中,我们使用 <keep-alive> 组件缓存 <router-view> 中的组件。这样,当用户再次访问该路由时,组件不会被重新渲染。

16. 路由与国际化

在实际开发中,我们可能需要为应用添加国际化支持。Vue Router 可以与 Vue I18n 结合使用,以实现路由的国际化。

16.1 定义国际化路由

在路由配置中,我们可以为每个路由定义多个语言版本。例如,我们可以为 /about 路由定义英文和中文版本。

const routes = [{path: '/about',component: About,meta: {title: {en: 'About',zh: '关于'}}}
];

在上面的代码中,我们为 /about 路由定义了英文和中文的标题。

16.2 动态切换语言

在应用中,我们可以通过 vue-i18n 插件动态切换语言。例如,我们可以在用户切换语言时更新路由的标题。

<template><div><h1>{{ $t($route.meta.title) }}</h1></div>
</template><script>
export default {watch: {'$i18n.locale'(newLocale) {document.title = this.$t(this.$route.meta.title);}}
};
</script>

在上面的代码中,我们通过 watch 监听 $i18n.locale 的变化,并在语言切换时更新页面的标题。

17. 路由与动画

在实际开发中,我们可能希望为路由切换添加动画效果。Vue Router 可以与 Vue 的过渡系统结合使用,以实现路由切换的动画效果。

17.1 使用 <transition> 组件

如前所述,我们可以使用 <transition> 组件为路由切换添加过渡效果。例如,我们可以为路由切换添加淡入淡出的效果。

<template><div id="app"><transition name="fade" mode="out-in"><router-view></router-view></transition></div>
</template><style>
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}
</style>

在上面的代码中,我们使用 <transition> 组件为 <router-view> 添加了淡入淡出的过渡效果。

17.2 自定义路由动画

除了使用 Vue 提供的过渡效果外,我们还可以自定义路由动画。例如,我们可以为不同的路由定义不同的动画效果。

<template><div id="app"><transition :name="transitionName" mode="out-in"><router-view></router-view></transition></div>
</template><script>
export default {data() {return {transitionName: 'fade'};},watch: {'$route'(to, from) {if (to.meta.transitionName) {this.transitionName = to.meta.transitionName;} else {this.transitionName = 'fade';}}}
};
</script><style>
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}.slide-enter-active, .slide-leave-active {transition: transform 0.5s;
}
.slide-enter, .slide-leave-to {transform: translateX(100%);
}
</style>

在上面的代码中,我们通过 watch 监听 $route 的变化,并根据路由的 meta.transitionName 属性动态设置过渡效果。例如,如果路由的 meta.transitionNameslide,则使用滑动过渡效果。

18. 路由与测试

在实际开发中,我们可能需要对路由进行单元测试和端到端测试。Vue Router 提供了测试工具,允许我们轻松地测试路由。

18.1 单元测试

在单元测试中,我们可以使用 vue-test-utils 来测试路由。例如,我们可以测试某个路由是否正确地渲染了对应的组件。

import { shallowMount, createLocalVue } from '@vue/test-utils';
import VueRouter from 'vue-router';
import Home from '@/views/Home.vue';const localVue = createLocalVue();
localVue.use(VueRouter);const router = new VueRouter({routes: [{path: '/',component: Home}]
});describe('Home.vue', () => {it('renders the home component', () => {const wrapper = shallowMount(Home, {localVue,router});expect(wrapper.text()).toMatch('Home');});
});

在上面的代码中,我们使用 vue-test-utils 测试 Home 组件是否正确地渲染了 Home 文本。

18.2 端到端测试

在端到端测试中,我们可以使用 CypressNightwatch 来测试路由。例如,我们可以测试用户导航到某个路由时是否正确地渲染了对应的组件。

// Cypress test
describe('Navigation', () => {it('navigates to the about page', () => {cy.visit('/');cy.get('a[href="/about"]').click();cy.url().should('include', '/about');cy.contains('h1', 'About');});
});

在上面的代码中,我们使用 Cypress 测试用户导航到 /about 路由时是否正确地渲染了 About 组件。

19. 路由与调试

在实际开发中,我们可能需要对路由进行调试。Vue Router 提供了调试工具,允许我们轻松地调试路由。

19.1 使用 Vue Devtools

Vue Devtools 是一个浏览器扩展,允许我们调试 Vue 应用。我们可以使用 Vue Devtools 来查看当前的路由状态、路由历史等信息。

19.2 使用 router.beforeEach 调试

在路由守卫中,我们可以通过 console.log 来输出调试信息。例如,我们可以在全局守卫中输出当前的路由信息。

router.beforeEach((to, from, next) => {console.log('Navigating from', from.path, 'to', to.path);next();
});

在上面的代码中,我们在全局守卫中输出当前的路由信息,以便调试路由导航过程。

20. 路由与插件

在实际开发中,我们可能需要为 Vue Router 添加一些插件,以扩展其功能。Vue Router 提供了插件系统,允许我们轻松地添加插件。

20.1 使用 VueRouter.prototype

我们可以通过 VueRouter.prototype 来扩展 Vue Router 的功能。例如,我们可以为 Vue Router 添加一个 back 方法,用于返回上一个路由。

VueRouter.prototype.back = function() {this.go(-1);
};const router = new VueRouter({mode: 'history',routes
});export default router;

在上面的代码中,我们为 Vue Router 添加了一个 back 方法,用于返回上一个路由。

20.2 使用插件

我们可以将扩展功能封装成插件,并在 Vue Router 中使用。例如,我们可以创建一个 router-plugin.js 文件,并在其中定义插件。

// src/plugins/router-plugin.js
export default {install(Vue, router) {router.back = function() {this.go(-1);};}
};// src/main.js
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import routerPlugin from './plugins/router-plugin';Vue.config.productionTip = false;Vue.use(routerPlugin, router);new Vue({router,render: h => h(App)
}).$mount('#app');

在上面的代码中,我们创建了一个 router-plugin.js 文件,并在其中定义了一个插件。然后,我们在 main.js 中使用该插件。

21. 路由与 TypeScript

在实际开发中,我们可能需要在 TypeScript 项目中使用 Vue Router。Vue Router 提供了 TypeScript 支持,允许我们轻松地在 TypeScript 项目中使用路由。

21.1 定义路由类型

在 TypeScript 项目中,我们可以为路由定义类型。例如,我们可以为路由配置定义类型。

import Vue from 'vue';
import VueRouter, { RouteConfig } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';Vue.use(VueRouter);const routes: RouteConfig[] = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];const router = new VueRouter({mode: 'history',routes
});export default router;

在上面的代码中,我们为 routes 数组定义了 RouteConfig[] 类型。

21.2 使用路由类型

在组件中,我们可以使用 RouteRouteConfig 类型来定义路由相关的属性和方法。例如,我们可以在组件中定义 $route$router 的类型。

import { Component, Vue } from 'vue-property-decorator';
import { Route } from 'vue-router';@Component
export default class Home extends Vue {get route(): Route {return this.$route;}navigateToAbout() {this.$router.push('/about');}
}

在上面的代码中,我们使用 Route 类型定义了 route 属性,并在 navigateToAbout 方法中使用 $router 导航到 /about 路由。

22. 路由与性能监控

在实际开发中,我们可能需要对路由的性能进行监控。Vue Router 提供了性能监控的功能,允许我们轻松地监控路由的性能。

22.1 使用 router.onReady

我们可以使用 router.onReady 方法来监控路由的加载性能。例如,我们可以在路由加载完成后输出加载时间。

router.onReady(() => {console.log('Router ready');
});

在上面的代码中,我们在路由加载完成后输出 Router ready

22.2 使用 router.afterEach

我们可以使用 router.afterEach 方法来监控路由导航的性能。例如,我们可以在路由导航完成后输出导航时间。

router.afterEach((to, from) => {console.log('Navigated from', from.path, 'to', to.path);
});

在上面的代码中,我们在路由导航完成后输出导航信息。

23. 路由与错误监控

在实际开发中,我们可能需要对路由的错误进行监控。Vue Router 提供了错误监控的功能,允许我们轻松地监控路由的错误。

23.1 使用 router.onError

我们可以使用 router.onError 方法来监控路由的错误。例如,我们可以在路由加载失败时输出错误信息。

router.onError((error) => {console.error('Route error:', error);
});

在上面的代码中,我们在路由加载失败时输出错误信息。

23.2 使用 router.beforeEach

我们可以使用 router.beforeEach 方法来监控路由导航的错误。例如,我们可以在路由导航失败时输出错误信息。

router.beforeEach((to, from, next) => {try {next();} catch (error) {console.error('Navigation error:', error);next(false);}
});

在上面的代码中,我们在路由导航失败时输出错误信息,并阻止导航。

24. 路由与日志

在实际开发中,我们可能需要对路由的导航过程进行日志记录。Vue Router 提供了日志记录的功能,允许我们轻松地记录路由的导航过程。

24.1 使用 router.beforeEach

我们可以使用 router.beforeEach 方法来记录路由导航的日志。例如,我们可以在路由导航开始时输出日志信息。

router.beforeEach((to, from, next) => {console.log('Navigating from', from.path, 'to', to.path);next();
});

在上面的代码中,我们在路由导航开始时输出日志信息。

24.2 使用 router.afterEach

我们可以使用 router.afterEach 方法来记录路由导航的日志。例如,我们可以在路由导航完成后输出日志信息。

router.afterEach((to, from) => {console.log('Navigated from', from.path, 'to', to.path);
});

在上面的代码中,我们在路由导航完成后输出日志信息。

25. 路由与安全

在实际开发中,我们可能需要对路由的安全性进行考虑。Vue Router 提供了安全相关的功能,允许我们轻松地保护路由。

25.1 使用路由守卫

我们可以使用路由守卫来保护路由。例如,我们可以在全局守卫中检查用户是否具有访问某个路由的权限。

router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !store.state.isAuthenticated) {next('/login');} else {next();}
});

在上面的代码中,我们检查 to.meta.requiresAuth 是否为 true,并且用户是否已经登录。如果路由需要登录但用户未登录,则重定向到 /login 路由。

25.2 使用 HTTPS

我们可以使用 HTTPS 来保护路由的通信安全。例如,我们可以在服务器配置中启用 HTTPS。

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/certificate.crt;ssl_certificate_key /path/to/private.key;location / {proxy_pass http://localhost:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}

在上面的代码中,我们在 Nginx 配置中启用了 HTTPS,并将请求代理到本地的 Vue 应用。

26. 路由与缓存

在实际开发中,我们可能需要对路由的组件进行缓存,以提升应用的性能。Vue 提供了 <keep-alive> 组件,允许我们缓存路由组件。

26.1 使用 <keep-alive>

我们可以使用 <keep-alive> 组件来缓存路由组件。例如,我们可以在 App.vue 中使用 <keep-alive> 组件缓存 <router-view> 中的组件。

<template><div id="app"><keep-alive><router-view></router-view></keep-alive></div>
</template>

在上面的代码中,我们使用 <keep-alive> 组件缓存 <router-view> 中的组件。这样,当用户再次访问该路由时,组件不会被重新渲染。

26.2 动态缓存

在某些情况下,我们可能希望动态地缓存某些路由的组件。例如,我们可以在路由配置中定义 meta.keepAlive 属性,并根据该属性动态缓存组件。

const routes = [{path: '/',name: 'Home',component: Home,meta: {keepAlive: true}},{path: '/about',name: 'About',component: About,meta: {keepAlive: false}}
];

在上面的代码中,我们为 / 路由定义了 meta.keepAlivetrue,表示该路由的组件需要缓存;为 /about 路由定义了 meta.keepAlivefalse,表示该路由的组件不需要缓存。

<template><div id="app"><keep-alive><router-view v-if="$route.meta.keepAlive"></router-view></keep-alive><router-view v-if="!$route.meta.keepAlive"></router-view></div>
</template>

在上面的代码中,我们根据 $route.meta.keepAlive 属性动态缓存组件。

27. 路由与懒加载

在实际开发中,我们可能需要对路由的组件进行懒加载,以提升应用的初始加载速度。Vue Router 提供了懒加载的功能,允许我们按需加载路由组件。

27.1 使用动态导入

我们可以使用动态导入(import())来实现路由组件的懒加载。例如,我们可以在路由配置中使用动态导入来懒加载组件。

const routes = [{path: '/',name: 'Home',component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')},{path: '/about',name: 'About',component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')}
];

在上面的代码中,我们使用动态导入来懒加载 HomeAbout 组件。这样,只有在用户访问 //about 时,才会加载对应的组件。

27.2 使用 Webpack 的魔法注释

在使用动态导入时,我们可以使用 Webpack 的魔法注释来为生成的 chunk 命名。这样,我们可以更好地管理和调试生成的代码。

const routes = [{path: '/',name: 'Home',component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')},{path: '/about',name: 'About',component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')}
];

在上面的代码中,我们使用 webpackChunkName 魔法注释为 HomeAbout 组件生成的 chunk 命名。这样,生成的 chunk 文件会被命名为 home.jsabout.js

28. 路由与预加载

在实际开发中,我们可能需要对路由的组件进行预加载,以提升应用的性能。Vue Router 提供了预加载的功能,允许我们在用户导航到某个路由之前预取该路由的组件。

28.1 使用 router.beforeEach

我们可以使用 router.beforeEach 方法来预取路由的组件。例如,我们可以在全局守卫中预取某个路由的组件。

router.beforeEach((to, from, next) => {if (to.meta.prefetch) {to.matched[0].components.default().then(() => {next();});} else {next();}
});

在上面的代码中,我们检查 to.meta.prefetch 是否为 true,并在导航之前预取该路由的组件。

28.2 使用 router.onReady

我们可以使用 router.onReady 方法来预取路由的组件。例如,我们可以在路由加载完成后预取某个路由的组件。

router.onReady(() => {router.getMatchedComponents().forEach(component => {if (component.preload) {component.preload();}});
});

在上面的代码中,我们在路由加载完成后预取所有匹配的组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot+微信小程序调用文心一言大模型实现AI聊天

一、文章前言 此文主要实现基于Springboot微信小程序调用文心一言大模型实现AI聊天对话功能&#xff0c;使用Java作为后端语言进行支持&#xff0c;界面友好&#xff0c;开发简单。 二、开发流程及工具准备 2.1、登录百度智能云平台&#xff0c;获取 API Key 和 Secret Key两个…

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…

PHP支付宝--转账到支付宝账户

官方参考文档&#xff1a; ​https://opendocs.alipay.com/open/62987723_alipay.fund.trans.uni.transfer?sceneca56bca529e64125a2786703c6192d41&pathHash66064890​ 可以使用默认应用&#xff0c;也可以自建新应用&#xff0c;此处以默认应用来讲解【默认应用默认支持…

对称加密算法——IDEA加密算法

Java IDEA算法详解 1. 理论背景 IDEA&#xff08;International Data Encryption Algorithm&#xff09;是一种对称密钥加密算法&#xff0c;由Xuejia Lai和James Massey于1991年提出。它被设计用于替代DES&#xff08;Data Encryption Standard&#xff09;算法&#xff0c;…

rustdesk远程桌面自建服务器

首先&#xff0c;我这里用到的是阿里云服务器 centos7版本&#xff0c;win版客户端。 准备工作 centos7 服务器端文件&#xff1a; https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-linux-amd64.zip win版客户端安装包&#xff1…

【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏

目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成&#xff08;Soft Targets&#xff09; 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模…

嵌入式学习第十六天--stdio(二)

文件打开 open函数 #include <fcntl.h> int open(const char *pathname&#xff0c;int flags); int open(const char *pathname&#xff0c;int flags&#xff0c;mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 flags //操作…

对话智面创始人陶然:一是初心和心态,二是坚持和心力

随着经济全球化的加深和市场竞争的日益激烈&#xff0c;企业迅速发展成为了每一个企业家的梦想。然而&#xff0c;要实现企业的快速发展并保持竞争力&#xff0c;企业战略的人力资源管理起着至关重要的作用。 企业的核心竞争力是“人才”的竞争&#xff0c;无论是研发、销售、…

mybatis使用typeHandler实现类型转换

使用mybatis作为操作数据库的orm框架&#xff0c;操作基本数据类型时可以通过内置的类型处理器完成java数据类型和数据库类型的转换&#xff0c;但是对于扩展的数据类型要实现与数据库类型的转换就需要自定义类型转换器完成&#xff0c;比如某个实体类型存储到数据库&#xff0…

Qt开发①Qt的概念+发展+优点+应用+使用

目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史&#xff1a; 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点&#xff1a; 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…

王炸 用AI+飞书 分解 一键生成 项目计划表模版

效果图&#xff1a; 各字段设置&#xff1a; 以下是一个使用 AI&#xff08;DeepSeeker&#xff09; 飞书多维表格分解项目待办模板的示例&#xff0c;你可以根据实际情况进行调整和优化&#xff1a; 列表中需要选择对象&#xff0c;且选择输出结果&#xff08;记得控制字符长度…

从月牙定理看古希腊数学的奇妙突破

文章目录 每日一句正能量前言古希腊人的 “化圆为方” 之梦&#xff08;一&#xff09;几何作图的基本规则&#xff08;二&#xff09;化圆为方问题的起源与发展&#xff08;三&#xff09;化圆为方的意义 月牙面积定理的诞生&#xff08;一&#xff09;希波克拉底的生平与成就…

实战:vLLM多机多卡部署大模型

两台服务器 1. Docker容器中使用GPU 必须确保已安装并配置 NVIDIA Docker。你可以安装 nvidia-docker 来确保 GPU 驱动能够被 Docker 使用 #安装 nvidia-docker&#xff1a; sudo apt-get install nvidia-docker2#然后重启 Docker&#xff1a; sudo systemctl restart docke…

Win10环境使用零讯ZeroNews内网穿透实现Deepseek对外服务

Win10环境使用零讯ZeroNews内网穿透实现Deepseek对外服务 前言 之前笔者已经在Win10环境搭建好了Ollama、DeepSeek、Open WebUI、Dify等组件&#xff0c;成功实现了私有化部署及内网访问&#xff1a; https://lizhiyong.blog.csdn.net/article/details/145505686 https://l…

halcon 条形码、二维码识别、opencv识别

一、条形码 函数介绍 create_bar_code_model * 1.创建条码读取器的模板 * 参数一&#xff1a;通用参数的名称&#xff0c;针对条形码模型进行调整。默认值为空 * 参数二&#xff1a;针对条形码模型进行调整 * 参数三&#xff1a;条形码模型的句柄。 create_bar_code_model (…

【学习资源】时间序列数据分析方法(2)-mWDN和AutoEncoder

接着上次的【学习资源】时间序列数据分析方法&#xff08;1&#xff09;-CSDN博客&#xff0c;本次介绍mWDN和AutoEncoder 解决时序数据分类的方法。介绍模型原理、应用场景和参考代码。也从模型性能、训练效率、模型复杂度、计算复杂度、可解释性、适应性和泛化能力、健壮性、…

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收

【TI C2000】F28002x的系统延时、GPIO配置及SCI&#xff08;UART&#xff09;串口发送、接收 文章目录 系统延时GPIO配置GPIO输出SCI配置SCI发送、接收测试附录&#xff1a;F28002x开发板上手、环境配置、烧录及TMS320F280025C模板工程建立F28002x叙述烧录SDK库文件说明工程建…

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作&#xff08;Ollama 工具介绍与下载&#xff09;2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…

Python 面向对象的三大特征

前言&#xff1a;本篇讲解面向对象的三大特征&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff0c;还有比较细致的&#xff08;类属性类方法&#xff0c;静态方法&#xff09;&#xff0c;分步骤讲解&#xff0c;比较适合理清楚三大特征的思路 面向对象的…

Jmeter如何计算TPS

1.在jmeter中计算出接口请求的个数 1175 1172 1172 174 200 416 384 1174 5867 2.计算接口平均响应时间 计算每个接口的请求次数乘以平均响应时间&#xff0c;所有接口相加&#xff0c;然后除以所有接口的数量总和&#xff0c;得到接口的平均响应时间 (1175*18191172*…