목차
场景一:IE9(兼容性问题)
시나리오 1: IE9(호환성 문제)
场景三: 缓存的原因(2019.4.15)
웹 프론트엔드 View.js Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)

Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)

Aug 24, 2021 am 10:54 AM
vue.js

이전 글 "Vue에서 complie 데이터의 양방향 바인딩 원리에 대한 간략한 분석(상세 코드 설명)"에서 Vue에서 complie 데이터의 양방향 바인딩 원리에 대해 배웠습니다. 다음 글은 Vue에서 라우팅할 때 흰색 화면이 나타나는 문제를 이해하는 데 도움이 될 것입니다.

Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)

vue에서 라우팅 전환 시 흰색 화면이 나오는 경우는 사실 개발 과정에서 한번도 접한 적이 없습니다. vue路由切换的白屏,事实上在开发的过程中,我一直没有遇到过。

我有个哥们遇到这个问题,问我怎么解决的,我晕了,我没遇到这样的问题啊,我怎么解决啊啊啊啊。。

事实上是遇到过一回的。 

以下内容于 2019-07-25 修改。

服务器部署配置问题

这个问题造成的白屏体现在:

首页可以正常浏览,但是------通过$router.push('/home')跳转页面 正常,然后刷新就是白屏或 404

本不想在文章加入这个问题和解决方案,因为官网已经提供了正确的部署姿势,(Vue 的路由模式自行查看文档),主要是针对HTML5 History模式:

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})
로그인 후 복사

devbuild都没有问题,这个是肯定的,所以问题就出在服务器配置上,以nginx为例,正确的配置如下:

location / {
  ....
  try_files $uri $uri/ /index.html; #重点
}
로그인 후 복사

Apache,原生 Node.jsIISCaddyFirebase 主机

请查看vur-router后端配置例子

地址:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90

以上内容于 2019-07-25 修改。

以下内容于 2019-04-23 修改。

如果你是使用脚手架初始化环境,可以跳过这部分。如果自己配置webpack,可以接着看确定做了如下配置

devServer: {
  ...
  contentBase: false, //必须
  historyApiFallback: true, //必须
  ...
},
entry: {
    app: ['./src/main.js'],
    vendors: ['vue', 'vue-router'] //注意这里
},
plugins: [
  ....
  new HtmlWebpackPlugin({
    ...
    chunks: ['vendors', 'app'], //注意这里,这里的chunks 要包含入口的 entry
  })
]
로그인 후 복사

以上内容于2019-04-23修改。

场景一:IE9(兼容性问题)

严格来说不是白屏的问题,应该说是兼容性问题,直接就是不支持,报错了,渲染无法执行造成的。解决方式就是

npm i babel-polyfill -D
로그인 후 복사

然后在入口mian.js引入就完事了,就着么简单

import "babel-polyfill";
로그인 후 복사

或者

//webpack
entry: {
      app: ['babel-polyfill','./src/main.js'],
      vendors: ['vue', 'vue-router']
},
로그인 후 복사

以下内容于2019-04-23修改。

假如真的是js兼容性问题,那么真的只是引入babel-polyfill或者在webpack入口加入babel-polyfill问题就能解决吗,其实不一定的,这个要看项目的使用情况。babel-polyfill不是万能的。那么如何排查兼容性问题呢(假如真的是兼容性问题)。因为我们在手机上直接调试,有些错误不会那么容易显而易见。我是这么调试的。(仅供参考!)

<template>
  <div>
    <!-- 错误直接显示在这里. 不用 alert() ,console.log()  -->
    {{error}} ...
    <!-- other element -->
  </div>
</template>
<script>
  export default{
    data{
      return {
        error:&#39;&#39;
      }
    },
    moundted:{
      try{
        //一些请求数据的方法
      }catch(e){
        //这里抛出异常
        this.error = e
      }
    }
  }
</script>
로그인 후 복사

这里要说的是有些兼容性问题是bable-polyfill搞不定的。比如URLSearchParams

let data = new URLSearchParams();
for (var key in params) {
  data.append(key, params[key]);
}
로그인 후 복사

那么肯定会报URLSearchParams is not undefined,然后,错误只在一些低端的机型,一些偶然的场合出错.加大了错误的排查。

以下可以解决URLSearchParams is not undefined

//# console
npm i url-search-params-polyfill

//# mian.js
import &#39;url-search-params-polyfill&#39;;
로그인 후 복사

以上内容于2019-04-23修改。

场景二 :如下图

有人说是在iphone 5s或者6s上会出现这种问题,肯定不是手机的bug。于是我重现了场景,真的和设备无关

Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)

所以这个跟设备真的没有关系。知道问题所在,当然解决办法也有许多

方案一:暴力愚蠢型

//路由跳转前滚动条清零
document.body.scrollTop = document.documentElement.scrollTop = 0;
this.$router.push({ path: "/a/b/c" });
로그인 후 복사

方案二:可行但不可选型

//给router 加一个监听,一旦改变,执行清零,然后再跳转
let routers = new Router({.....})
routers.beforeEach(function (to, from, next) {
    ......
    document.body.scrollTop = document.documentElement.scrollTop = 0
    next()
})
로그인 후 복사

虽然可行,但是感觉着么干有点愚蠢。因为还有更好的写法,这个写法更佳优雅

方案三:最佳型

其实官方已经提供了当路由切换时,控制滚动位置的方式。scrollBehavior

使用方式如下:

const router = new VueRouter({
  routes: [...],
  scrollBehavior (to, from, savedPosition) {
    // return 期望滚动到哪个的位置 { x: number, y: number } |  { selector: string } |
  }
})
로그인 후 복사

scrollBehavior方法接收tofrom路由对象。第三个参数savedPosition当且仅当popstate导航(通过浏览器的前进/后退按钮触发) 时才可用。

所以假如要解决白屏的问题,可以着么干

const router = new VueRouter({
  routes: [...],
  scrollBehavior (to, from, savedPosition) {
    return savedPosition || { x: 0, y: 0 }
  }
})
로그인 후 복사

也就是说,当用户点击返回、前进的时候,页面会滚动到之前位置,(微信朋友圈的文章就是这样的,读一半返回,再进来接着刚才的位置阅读)

如果是新的pagemounted进来的时候,就重置为 0

친구가 이 문제를 겪고 어떻게 해결하는지 물었습니다. 저는 그런 문제를 겪어본 적이 없습니다. . 🎜🎜실제로 한 번 접한 적이 있습니다. 🎜🎜🎜2019-07-25에 다음 내용이 수정되었습니다. 🎜🎜🎜서버 배포 구성 문제🎜🎜이 문제로 인해 발생하는 흰색 화면은 다음과 같습니다. 🎜🎜홈페이지는 정상적으로 탐색할 수 있지만 ------$router를 통해. push('/ home')페이지가 정상적으로 점프한 다음 새로 고쳐져 흰색 화면이나 404가 나타납니다🎜🎜이 문제와 해결 방법을 기사에 포함하고 싶지 않았습니다. 공식 웹사이트에서 올바른 배포 상태(Vue 라우팅 모드에 대한 문서를 직접 확인하세요), 주로 HTML5 기록 모드에 대해: 🎜
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-control" content="no-cache" />
<meta http-equiv="Cache" content="no-cache" />
로그인 후 복사
로그인 후 복사
🎜 dev에는 문제가 없습니다. build는 확실하므로 문제는 서버 구성에 있습니다. nginx를 예로 들면 올바른 구성은 다음과 같습니다. 🎜rrreee 🎜Apache, 기본 Node.js, IIS, Caddy, Firebase 호스트🎜 🎜🎜vur-router 백엔드 구성 예시를 확인하세요🎜🎜 주소: https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90% 8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4 %BE%8B%E5%AD%90🎜🎜🎜🎜위 내용은 2019-07-25에 수정되었습니다. 🎜🎜🎜🎜2019-04-23에 다음 내용이 수정되었습니다. 🎜🎜🎜스캐폴딩 초기화 환경을 사용하는 경우 이 부분을 건너뛰어도 됩니다. webpack을 직접 구성하시면 아래와 같은 구성이 되었는지 확인하실 수 있습니다🎜rrreee🎜🎜위 내용은 2019-04-23에 수정되었습니다. 🎜🎜

시나리오 1: IE9(호환성 문제)

🎜엄밀히 말하면 흰색 화면 문제는 아니고 단순히 호환성 문제라고 해야 할까요. 렌더링을 실행할 수 없습니다. 해결책은 🎜rrreee🎜 다음 입구에서 main.js로 가져오는 것입니다. 🎜rrreee🎜 또는
🎜rrreee🎜🎜다음 내용은 2019-04-23에 수정되었습니다. 🎜🎜🎜정말 js 호환성 문제라면 babel-polyfill을 도입하거나 babel을 <code>webpack</에 추가하면 됩니다. code> 항목 -polyfill을 사용하면 문제를 해결할 수 있습니까? 실제로는 프로젝트 사용법에 따라 해결되지 않을 수도 있습니다. babel-polyfill은 만병통치약이 아닙니다. 따라서 호환성 문제를 해결하는 방법(실제로 호환성 문제인 경우) 우리는 전화로 직접 디버깅하고 있기 때문에 일부 오류는 쉽게 눈에 띄지 않습니다. 이것이 내가 디버깅한 방법입니다. (참고용!) 🎜rrreee🎜여기서 제가 말씀드리고 싶은 것은 bable-polyfill이 해결할 수 없는 호환성 문제가 있다는 것입니다. 예를 들어, URLSearchParams🎜rrreee🎜는 확실히 URLSearchParams가 정의되지 않았습니다라고 보고합니다. 그러면 오류는 일부 저가형 모델에서만 발생하며 가끔 오류가 발생합니다. 조사가 늘어날 예정이다. 🎜🎜다음 방법으로 URLSearchParams가 정의되지 않음 문제를 해결할 수 있습니다.🎜rrreee🎜🎜위 내용은 2019-04-23에 수정되었습니다. 🎜🎜🎜시나리오 2: 아래와 같습니다🎜🎜어떤 사람들은 이 문제가 iPhone 5s 또는 6s에서 발생한다고 말합니다. 이것은 확실히 휴대폰의 버그가 아닙니다. 그래서 그 장면을 재현해보았는데, 기기와는 전혀 관련이 없습니다🎜🎜WeChat 스크린샷_20210824104023.jpg🎜🎜이건 기기와는 전혀 관련이 없습니다. 문제를 알면 당연히 해결 방법은 많습니다 🎜🎜옵션 1: 폭력적이고 멍청한 유형🎜rrreee🎜옵션 2: 가능하지만 선택 사항은 아님🎜rrreee🎜가능하지만 , 당신이 하고 있는 일이 좀 멍청한 것 같아요. 더 나은 글쓰기 방식이 있기 때문에 이 글쓰기 방식이 더 우아합니다🎜🎜옵션 3: 최적의 유형🎜🎜사실 공식에서는 경로가 다음과 같을 때 스크롤 위치를 제어하는 ​​방법을 제공했습니다. 전환되었습니다. scrollBehavior🎜🎜사용 방법은 다음과 같습니다. 🎜rrreee🎜 scrollBehavior 메서드는 tofrom 라우팅 객체를 수신합니다. 세 번째 매개변수 savedPositionpopstate 탐색(브라우저의 앞으로/뒤로 버튼에 의해 트리거됨)인 경우에만 사용할 수 있습니다. 🎜🎜흰색 화면 문제를 해결하고 싶다면 어떻게 해야 할까요🎜rrreee🎜즉, 사용자가 뒤로 또는 앞으로를 클릭하면 페이지가 이전 위치로 스크롤됩니다. (이것은 WeChat의 기사입니다. 순간, 반 읽기 뒤로 갔다가 들어와 이전 위치부터 계속 읽기) 🎜🎜새 페이지마운트되어 들어오면 로 재설정됩니다. >0. 🎜

完美的解决了这个问题。

但是这也是个问题,框架为什么不默认呢,假如自定义的时候可以overwirte

场景三: 缓存的原因(2019.4.15)

我们根据版本号(或者hash)去控制缓存问题,当我们发布新版本,会发现html里面引用的版本号却是旧的版本号 ,这种情况是入口index.html文件被缓存了,很多时候我们设置禁止html文件被缓存,但依然会出现被缓存的情况。比如在头部加

<meta http-equiv="Expires" content="0" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-control" content="no-cache" />
<meta http-equiv="Cache" content="no-cache" />
로그인 후 복사
로그인 후 복사

仍然解决不了问题,关于web的缓存策略,推荐这篇文章:Http缓存机制

一旦index.html被缓存了,之后我们使用了全量更新,也就是每次发版本之前会干掉之前的jscss文件,那么被缓存的index.html会无法加载之前旧的js,css还有一些其他的静态资源文件,而新的jscss则不会被加载,那么白屏就诞生了。

这个时候我们就要配合服务端来解决index.html的缓存问题

解决缓存的问题请转到这里:Vue index.html入口缓存问题

[完]

推荐学习:vue.js教程

위 내용은 Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

vite가 .env 파일을 구문 분석하는 방법에 대한 심층 토론 vite가 .env 파일을 구문 분석하는 방법에 대한 심층 토론 Jan 24, 2023 am 05:30 AM

Vue 프레임워크를 사용하여 프런트엔드 프로젝트를 개발할 때 배포 시 여러 환경을 배포하게 되는데, 개발 환경, 테스트 환경, 온라인 환경에서 호출되는 인터페이스 도메인 이름이 다른 경우가 많습니다. 어떻게 구별할 수 있나요? 그것은 환경 변수와 패턴을 사용하는 것입니다.

vue에서 구성 요소화와 모듈화의 차이점은 무엇입니까 vue에서 구성 요소화와 모듈화의 차이점은 무엇입니까 Dec 15, 2022 pm 12:54 PM

구성요소화와 모듈화의 차이점: 모듈화는 코드 논리의 관점에서 구분되며, 코드 계층 개발을 용이하게 하고 각 기능 모듈의 기능이 일관되게 유지되도록 합니다. 컴포넌트화는 UI 인터페이스 관점에서 계획하는 것으로 프런트엔드의 컴포넌트화는 UI 컴포넌트의 재사용을 용이하게 합니다.

실용적인 전투: vue 파일을 지원하여 정의로 이동하는 플러그인을 vscode에서 개발합니다. 실용적인 전투: vue 파일을 지원하여 정의로 이동하는 플러그인을 vscode에서 개발합니다. Nov 16, 2022 pm 08:43 PM

vscode 자체는 Vue 파일 구성 요소를 지원하여 정의로 이동하지만 지원은 매우 약합니다. vue-cli 구성에 따라 다양한 유연한 사용법을 작성할 수 있어 생산 효율성을 향상시킬 수 있습니다. 그러나 vscode 자체에서 제공하는 기능이 파일 정의로 점프하는 것을 지원하지 못하게 하는 것은 이러한 유연한 쓰기 방법입니다. 이러한 유연한 작성 방법과 호환되고 작업 효율성을 높이기 위해 Vue 파일을 지원하는 vscode 플러그인을 작성하여 정의로 이동했습니다.

Vue 프로젝트에 Ace 코드 편집기를 통합하는 방법에 대한 자세한 그래픽 설명 Vue 프로젝트에 Ace 코드 편집기를 통합하는 방법에 대한 자세한 그래픽 설명 Apr 24, 2023 am 10:52 AM

Ace는 JavaScript로 작성된 내장형 코드 편집기입니다. Sublime, Vim 및 TextMate와 같은 기본 편집기의 기능 및 성능과 일치합니다. 모든 웹페이지와 JavaScript 애플리케이션에 쉽게 삽입할 수 있습니다. Ace는 Cloud9 IDE의 메인 편집자로 유지되며 Mozilla Skywriter(Bespin) 프로젝트의 후속 버전입니다.

vue3의 반응성()에 대해 자세히 이야기해 봅시다. vue3의 반응성()에 대해 자세히 이야기해 봅시다. Jan 06, 2023 pm 09:21 PM

서문: vue3 개발에서 반응형은 반응형 데이터를 구현하는 방법을 제공합니다. 일상적인 개발에서 자주 사용되는 API입니다. 이 기사에서 저자는 내부 작동 메커니즘을 탐구합니다.

Vue3에서 단위 테스트를 작성하는 방법 살펴보기 Vue3에서 단위 테스트를 작성하는 방법 살펴보기 Apr 25, 2023 pm 07:41 PM

Vue.js는 오늘날 프런트엔드 개발에서 매우 인기 있는 프레임워크가 되었습니다. Vue.js가 계속 발전함에 따라 단위 테스트는 점점 더 중요해지고 있습니다. 오늘은 Vue.js 3에서 단위 테스트를 작성하는 방법을 살펴보고 몇 가지 모범 사례와 일반적인 문제 및 솔루션을 제공하겠습니다.

Vue의 JSX 구문과 템플릿 구문의 간단한 비교(장단점 분석) Vue의 JSX 구문과 템플릿 구문의 간단한 비교(장단점 분석) Mar 23, 2023 pm 07:53 PM

Vue.js에서 개발자는 JSX 구문과 템플릿 구문이라는 두 가지 다른 구문을 사용하여 사용자 인터페이스를 만들 수 있습니다. 두 구문 모두 장점과 단점이 있습니다. 차이점, 장점 및 단점을 논의해 보겠습니다.

Vue3 동적 구성 요소에서 예외를 처리하는 방법에 대한 간략한 분석 Vue3 동적 구성 요소에서 예외를 처리하는 방법에 대한 간략한 분석 Dec 02, 2022 pm 09:11 PM

Vue3 동적 구성 요소에서 예외를 처리하는 방법은 무엇입니까? 다음 기사에서는 Vue3 동적 구성 요소 예외 처리 방법에 대해 설명합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

See all articles