진행률 표시줄을 사용하여 Vue 지연 로딩 구현
다음 Vue.js 칼럼에서는 Vue의 지연 로딩에 진행률 표시줄을 추가하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
소개
일반적으로 Vue.js로 단일 페이지 애플리케이션(SPA)을 작성할 때 페이지가 로드되면 필요한 모든 리소스(예: JavaScript 및 CSS 파일)가 함께 로드됩니다. 이로 인해 대용량 파일 작업 시 사용자 경험이 저하될 수 있습니다.
Webpack을 사용하면 import()
키워드 대신 import()
함수를 사용하여 Vue.js에서 요청 시 페이지를 로드할 수 있습니다. import()
函数而不是 import
关键字在 Vue.js 中按需加载页面。
为什么要按需加载?
Vue.js 中 SPA 的典型工作方式是将所有功能和资源打包一并交付,这样可以使用户无需刷新页面即可使用你的应用。如果你没有为了按需加载页面针对自己的应用进行明确的设计,那么所有的页面会被立即加载,或者提前使用大量内存进行不必要的预加载。
这对有许多页面的大型 SPA 非常不利,会导致使用低端手机和低网速的用户体验会很差。如果通过按需加载,用户将不需要下载他们当前不需要的资源。
Vue.js 没有为动态模块提供任何加载指示器相关的控件。即使进行了预取和预加载,也没有对应的空间让用户知道加载的过程,所以还需要通过添加进度条来改善用户体验。
准备项目
首先需要一种让进度条与 Vue Router 通信的方法。事件总线模式比较合适。
事件总线是一个 Vue 实例的单例。由于所有 Vue 实例都有一个使用 $on
和 $emit
的事件系统,因此可以用它在应用中的任何地方传递事件。
首先在 components
目录中创建一个新文件 eventHub.js
:
import Vue from 'vue' export default new Vue()
然后把 Webpack 配置为禁用预取和预加载,这样就可以针对每个函数单独执行此类操作,当然你也可以全局禁用它。在根文件夹中创建一个 vue.config.js
文件并添加禁用预取和预加载的相关配置:
module.exports = { chainWebpack: (config) => { // 禁用预取和预加载 config.plugins.delete('prefetch') config.plugins.delete('preload') }, }
添加路由和页面
用 npx
安装 Vue router 并使用:
$ npx vue add router
编辑位于 router/index.js
下的 router 文件并更新路由,以便可以用 import()
函数代替 import
语句:
以下默认配置:
import About from '../views/About.vue' { path: '/about', name: 'About', component: About },
将其改为:
{ path: '/about', name: 'About', component: () => import('../views/About.vue') },
如果希望可以选择按需加载某些页面,而不是全局禁用预取和预加载,可以用特殊的 Webpack 注释,不要在 vue.config.js
中配置 Webpack:
import( /* webpackPrefetch: true */ /* webpackPreload: true */ '../views/About.vue' )
import()
和 import
之间的主要区别是在运行时加载由 import()
加载的 ES 模块,在编译时加载由 import
加载的 ES 模块。这就意味着可以用 import()
延迟模块的加载,并仅在必要时加载。
实现进度条
由于无法准确估算页面的加载时间(或完全加载),因此我们无法真正的去创建进度条。也没有办法检查页面已经加载了多少。不过可以创建一个进度条,并使它在页面加载时完成。
由于不能真正反映进度,所以描绘的进度只是进行了随机跳跃。
先安装 lodash.random
,因为在生成进度条的过程中将会用这个包产生一些随机数:
$ npm i lodash.random
然后,创建一个 Vue 组件 components/ProgressBar.vue
:
<template> <p> </p> <p> </p> <p></p> <p></p> </template>
接下来向该组件添加脚本。在脚本中先导入 random
和 $eventHub
,后面会用到:
<script> import random from 'lodash.random' import $eventHub from '../components/eventHub' </script>
导入之后,在脚本中定义一些后面要用到的变量:
// 假设加载将在此时间内完成。 const defaultDuration = 8000 // 更新频率 const defaultInterval = 1000 // 取值范围 0 - 1. 每个时间间隔进度增长多少 const variation = 0.5 // 0 - 100. 进度条应该从多少开始。 const startingPoint = 0 // 限制进度条到达加载完成之前的距离 const endingPoint = 90
然后编码实现异步加载组件的逻辑:
export default { name: 'ProgressBar', data: () => ({ isLoading: true, // 加载完成后,开始逐渐消失 isVisible: false, // 完成动画后,设置 display: none progress: startingPoint, timeoutId: undefined, }), mounted() { $eventHub.$on('asyncComponentLoading', this.start) $eventHub.$on('asyncComponentLoaded', this.stop) }, methods: { start() { this.isLoading = true this.isVisible = true this.progress = startingPoint this.loop() }, loop() { if (this.timeoutId) { clearTimeout(this.timeoutId) } if (this.progress >= endingPoint) { return } const size = (endingPoint - startingPoint) / (defaultDuration / defaultInterval) const p = Math.round(this.progress + random(size * (1 - variation), size * (1 + variation))) this.progress = Math.min(p, endingPoint) this.timeoutId = setTimeout( this.loop, random(defaultInterval * (1 - variation), defaultInterval * (1 + variation)) ) }, stop() { this.isLoading = false this.progress = 100 clearTimeout(this.timeoutId) const self = this setTimeout(() => { if (!self.isLoading) { self.isVisible = false } }, 200) }, }, }
在 mounted()
函数中,用事件总线来侦听异步组件的加载。一旦路由告诉我们已经导航到尚未加载的页面,它将会开始加载动画。
最后其添加一些样式:
<style> .loading-container { font-size: 0; position: fixed; top: 0; left: 0; height: 5px; width: 100%; opacity: 0; display: none; z-index: 100; transition: opacity 200; } .loading-container.visible { display: block; } .loading-container.loading { opacity: 1; } .loader { background: #23d6d6; display: inline-block; height: 100%; width: 50%; overflow: hidden; border-radius: 0 0 5px 0; transition: 200 width ease-out; } .loader > .light { float: right; height: 100%; width: 20%; background-image: linear-gradient(to right, #23d6d6, #29ffff, #23d6d6); animation: loading-animation 2s ease-in infinite; } .glow { display: inline-block; height: 100%; width: 30px; margin-left: -30px; border-radius: 0 0 5px 0; box-shadow: 0 0 10px #23d6d6; } @keyframes loading-animation { 0% { margin-right: 100%; } 50% { margin-right: 100%; } 100% { margin-right: -10%; } } </style>
最后将 ProgressBar
添加到 App.vue
或布局组件中,只要它与路由视图位于同一组件中即可,它在应用的整个生命周期中都可用:
<template> <p> <progress-bar></progress-bar> <router-view></router-view> <!--- 你的其它组件 --> </p> </template> <script> import ProgressBar from './components/ProgressBar.vue' export default { components: { ProgressBar }, } </script>
然后你就可以在页面顶端看到一个流畅的进度条:
为延迟加载触发进度条
现在 ProgressBar
$on
및 $emit
를 사용하는 이벤트 시스템이 있으므로 이를 사용하여 애플리케이션 어디에서나 이벤트를 전달할 수 있습니다. 🎜🎜먼저 comComponents
디렉터리에 새 파일 eventHub.js
를 만듭니다. 🎜import $eventHub from '../components/eventHub' router.beforeEach((to, from, next) => { if (typeof to.matched[0]?.components.default === 'function') { $eventHub.$emit('asyncComponentLoading', to) // 启动进度条 } next() }) router.beforeResolve((to, from, next) => { $eventHub.$emit('asyncComponentLoaded') // 停止进度条 next() })
vue.config.js
파일을 생성하고 관련 구성을 추가하여 프리패치 및 프리로드를 비활성화합니다. 🎜rrreee🎜경로 및 페이지 추가🎜🎜npx
사용 Vue 설치 router 및 사용: 🎜rrreee🎜router/index.js
에 있는 라우터 파일을 편집하고 import()
함수를 대신 사용할 수 있도록 경로를 업데이트하세요. >import
문: 🎜🎜다음 기본 구성: 🎜rrreee🎜다음으로 변경: 🎜rrreee🎜프리페치를 비활성화하고 전역적으로 미리 로드하는 대신 요청 시 특정 페이지를 로드하는 옵션을 사용하려면 다음을 사용할 수 있습니다. 특수 Webpack 주석, vue.config.js
에서 Webpack을 구성하지 마세요: 🎜rrreee🎜 import()
와 import
의 주요 차이점은 다음과 같습니다. 런타임 import()
에 의해 로드된 ES 모듈을 로드하고 컴파일 타임에 import
에 의해 로드된 ES 모듈을 로드합니다. 이는 import()
를 사용하여 모듈 로드를 지연하고 필요한 경우에만 로드할 수 있음을 의미합니다. 🎜🎜진행률 표시줄 구현🎜🎜페이지의 로딩 시간(또는 전체 로딩)을 정확하게 예측하는 것이 불가능하기 때문에 실제로 진행률 표시줄을 만들 수 없습니다. 페이지가 얼마나 로드되었는지 확인할 방법도 없습니다. 그러나 진행률 표시줄을 만들고 페이지가 로드될 때 완료되도록 할 수 있습니다. 🎜🎜실제로 진행 상황을 반영할 수 없기 때문에 표시된 진행 상황은 단지 무작위 점프일 뿐입니다. 🎜🎜lodash.random
을 먼저 설치하세요. 이 패키지는 진행률 표시줄을 생성하는 과정에서 임의의 숫자를 생성하는 데 사용되기 때문입니다. 🎜rrreee🎜그런 다음 Vue 구성 요소 comComponents/ProgressBar를 만듭니다. .vue
: 🎜rrreee🎜 다음으로 구성 요소에 스크립트를 추가합니다. 먼저 나중에 사용할 스크립트에서 random
및 $eventHub
를 가져옵니다. 🎜rrreee🎜가져온 후 나중에 사용할 스크립트에서 일부 변수를 정의합니다. 🎜rrreee 🎜 그런 다음 구성 요소의 비동기 로드 논리를 구현하는 코드: 🎜rrreee🎜 mounted()
함수에서 이벤트 버스를 사용하여 비동기 구성 요소의 로드를 수신합니다. 경로가 아직 로드되지 않은 페이지로 이동했음을 알려주면 로드 애니메이션이 시작됩니다. 🎜🎜마지막으로 몇 가지 스타일 추가: 🎜rrreee🎜마지막으로 App.vue
또는 레이아웃 구성 요소에 ProgressBar
를 추가합니다. 단, 경로 보기와 동일한 구성 요소에 있어야 합니다. 앱 수명 주기 내내 사용할 수 있습니다: 🎜rrreee🎜 그러면 페이지 상단에 부드러운 진행률 표시줄이 표시됩니다: 🎜🎜ProgressBar
가 이벤트 버스에서 수신 대기 중입니다. 비동기 구성요소 로딩 이벤트를 수신합니다. 특정 리소스가 이런 방식으로 로드되면 애니메이션이 트리거되어야 합니다. 이제 다음 이벤트를 수신하려면 경로에 경로 데몬을 추가하세요. 🎜import $eventHub from '../components/eventHub' router.beforeEach((to, from, next) => { if (typeof to.matched[0]?.components.default === 'function') { $eventHub.$emit('asyncComponentLoading', to) // 启动进度条 } next() }) router.beforeResolve((to, from, next) => { $eventHub.$emit('asyncComponentLoaded') // 停止进度条 next() })
为了检测页面是否被延迟加载了,需要检查组件是不是被定义为动态导入的,也就是应该为 component:() => import('...')
而不是component:MyComponent
。
这是通过 typeof to.matched[0]?.components.default === 'function'
完成的。带有 import
语句的组件不会被归为函数。
总结
在本文中,我们禁用了在 Vue 应用中的预取和预加载功能,并创建了一个进度条组件,该组件可显示以模拟加载页面时的实际进度。
原文:https://stackabuse.com/lazy-loading-routes-with-vue-router/
作者:Stack Abuse
相关推荐:
更多编程相关知识,请访问:编程入门!!
위 내용은 진행률 표시줄을 사용하여 Vue 지연 로딩 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP와 Vue: 프론트엔드 개발 도구의 완벽한 조합 오늘날 인터넷이 빠르게 발전하는 시대에 프론트엔드 개발은 점점 더 중요해지고 있습니다. 사용자가 웹 사이트 및 애플리케이션 경험에 대한 요구 사항이 점점 더 높아짐에 따라 프런트 엔드 개발자는 보다 효율적이고 유연한 도구를 사용하여 반응형 및 대화형 인터페이스를 만들어야 합니다. 프론트엔드 개발 분야의 두 가지 중요한 기술인 PHP와 Vue.js는 함께 사용하면 완벽한 도구라고 볼 수 있습니다. 이 기사에서는 독자가 이 두 가지를 더 잘 이해하고 적용할 수 있도록 PHP와 Vue의 조합과 자세한 코드 예제를 살펴보겠습니다.

프론트엔드 개발 인터뷰에서 일반적인 질문은 HTML/CSS 기초, JavaScript 기초, 프레임워크 및 라이브러리, 프로젝트 경험, 알고리즘 및 데이터 구조, 성능 최적화, 크로스 도메인 요청, 프론트엔드 엔지니어링, 디자인 패턴, 새로운 기술 및 트렌드. 면접관 질문은 후보자의 기술적 능력, 프로젝트 경험, 업계 동향에 대한 이해를 평가하기 위해 고안되었습니다. 따라서 지원자는 자신의 능력과 전문성을 입증할 수 있도록 해당 분야에 대한 충분한 준비를 갖추어야 합니다.

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

Django는 빠른 개발과 깔끔한 방법을 강조하는 Python으로 작성된 웹 애플리케이션 프레임워크입니다. Django는 웹 프레임워크이지만 Django가 프런트엔드인지 백엔드인지에 대한 질문에 답하려면 프런트엔드와 백엔드의 개념에 대한 깊은 이해가 필요합니다. 프론트엔드는 사용자가 직접 상호작용하는 인터페이스를 의미하고, 백엔드는 HTTP 프로토콜을 통해 데이터와 상호작용하는 서버측 프로그램을 의미합니다. 프론트엔드와 백엔드가 분리되면 프론트엔드와 백엔드 프로그램을 독립적으로 개발하여 각각 비즈니스 로직과 인터랙티브 효과, 데이터 교환을 구현할 수 있습니다.

빠르고 효율적인 프로그래밍 언어인 Go 언어는 백엔드 개발 분야에서 널리 사용됩니다. 그러나 Go 언어를 프런트엔드 개발과 연관시키는 사람은 거의 없습니다. 실제로 프런트엔드 개발에 Go 언어를 사용하면 효율성이 향상될 뿐만 아니라 개발자에게 새로운 지평을 열어줄 수도 있습니다. 이 기사에서는 프런트엔드 개발에 Go 언어를 사용할 수 있는 가능성을 살펴보고 독자가 이 영역을 더 잘 이해할 수 있도록 구체적인 코드 예제를 제공합니다. 전통적인 프런트엔드 개발에서는 사용자 인터페이스를 구축하기 위해 JavaScript, HTML, CSS를 사용하는 경우가 많습니다.

Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보려면 구체적인 코드 예제가 필요합니다. 인터넷과 모바일 애플리케이션의 급속한 발전으로 인해 프런트엔드 기술이 점점 더 중요해지고 있습니다. 이 분야에서는 강력한 백엔드 프로그래밍 언어인 Golang도 중요한 역할을 할 수 있습니다. 이 기사에서는 Golang이 프런트엔드 기술과 어떻게 결합되는지 살펴보고 특정 코드 예제를 통해 프런트엔드 분야에서의 잠재력을 보여줍니다. 프론트엔드 분야에서 Golang의 역할은 효율적이고 간결하며 배우기 쉬운 것입니다.

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

Django: 프론트엔드와 백엔드 개발을 모두 처리할 수 있는 마법의 프레임워크! Django는 효율적이고 확장 가능한 웹 애플리케이션 프레임워크입니다. MVC, MTV를 포함한 다양한 웹 개발 모델을 지원할 수 있으며 고품질 웹 애플리케이션을 쉽게 개발할 수 있습니다. Django는 백엔드 개발을 지원할 뿐만 아니라 프런트엔드 인터페이스를 빠르게 구축하고 템플릿 언어를 통해 유연한 뷰 표시를 구현할 수 있습니다. Django는 프론트엔드 개발과 백엔드 개발을 완벽한 통합으로 결합하므로 개발자가 전문적으로 학습할 필요가 없습니다.
