美文网首页
预渲染pre-render 和 页面白屏处理

预渲染pre-render 和 页面白屏处理

作者: wdp1005 | 来源:发表于2018-05-31 16:26 被阅读0次

页面白屏来源:

  1. 解析html。
  2. 客户端js渲染。
  3. 加载异步组件渲染。
  4. ajax获取数据渲染。

解析html

  1. 减小html大小。
  2. async/deferer脚本执行。
  3. 脚本放最后。

客户端js渲染

// 使用vue-cli构建后的index.html,内容由客户端js渲染
<body>
  <div id="app"></div>
  <!-- built files will be auto injected -->
  <script type="text/javascript" src="/static/js/manifest.6b0afe9dae29c384450a.js"></script>
  <script type="text/javascript" src="/static/js/vendor.426ef21560bb1458790e.js"></script>
  <script type="text/javascript" src="/static/js/app.7721a2d8031d1ad79913.js"></script>
</body>

可以在模板html中增加初始内容,客户端渲染出页面时会自动替换掉。

<body>
    <div id="app">
        // 在这里增加初始内容
    </div>
  <!-- built files will be auto injected -->
</body>

问题

  1. 当通过url直接访问应用/foo 和/bar,都会先显示// 在这里增加初始内容
  2. 如果组件是异步加载,则下载和渲染组件期间会白屏。


    image.png

加载异步组件渲染。

取消动态组件

// const Foo = () => import('@/components/Foo')
// const Bar = () => import('@/components/Bar')

import Foo from '@/components/Foo'
import Bar from '@/components/Bar'

ajax获取数据渲染

比如列表数据响应前ul为空,可以使用骨架屏占位。

    <ul v-if="users.length > 0">
      <li v-for="user in users"
        :key="user.name">{{ user.name }}</li>
    </ul>
    <div v-else>
      <!-- 使用svg,节省网络下载时间,但是动画会被js阻塞 -->
      <svg width="750" height="191" class="svgclz">
        <circle cx="95" cy="102" r="63" fill="#edeff0" mask="url(#shining)" />
        <rect width="160" height="35" x="190" y="45" fill="#edeff0" mask="url(#shining)" />
        <rect width="400" height="35" x="190" y="90" fill="#edeff0" mask="url(#shining)" />
        <line x1="0" y1="190" x2="750" y2="190" stroke="#edeff0"></line>
      </svg>
    </div>

预渲染 pre-render

预渲染有点像服务器端渲染和静态站点生成。

在构建应用时,使用预渲染器启动一个类浏览器环境用来加载指定路由,并将得到的html转存储到指定的文件目录,构建出来的 html 文件已有部分内容,减少白屏时间。

不适合渲染动态页面;渲染大量路由时,会延长构建时间。

参考:Prerender Vue.js Apps with prerender-spa-plugin v3

const PrerenderSPAPlugin = require('prerender-spa-plugin')
const PuppeteerRenderer = PrerenderSPAPlugin.PuppeteerRenderer;

...
new PrerenderSPAPlugin({
  staticDir: path.join(__dirname, '../dist'),
  routes: ['/', '/foo', '/bar'],
  renderer: new PuppeteerRenderer({
    // // eg, with `document.dispatchEvent(new Event('custom-render-trigger'))`
    // captureAfterDocumentEvent: 'custom-render-trigger',
    // // Optional - Wait to render until the specified element is detected using `document.querySelector`
    renderAfterElementExists: '#app',
  })
})
...
文件目录 index.html bar/index.html foo/index

相关文章

  • 预渲染pre-render 和 页面白屏处理

    页面白屏来源: 解析html。 客户端js渲染。 加载异步组件渲染。 ajax获取数据渲染。 解析html 减小h...

  • vue预渲染 prerender-spa-plugin 生成多页

    预渲染模式预渲染prerender-spa-plugin配置生成多页面,解决首屏白屏问题,提升用户体验。同时配合 ...

  • vue 预渲染 prerender-spa-plugin

    预渲染模式预渲染 prerender-spa-plugin 配置生成多页面,解决首屏白屏问题,提升用户体验。同时配...

  • 白屏&FOUC测试与CSS ,JS 放置顺序, 异步机制

    理解什么白屏&FOUC并理解其中的原理 不同的浏览器对资源加载页面渲染不同的处理方式导致的结果 白屏: HTML ...

  • 浏览器加载

    白屏和 FOUC FOUC指无样式内容闪烁,白屏指页面会出现白屏; 它们主要是由于不同浏览器处理,对于某些场景,处...

  • 常见网站性能指标

    FP 白屏(First Paint Time ): 从页面开始加载到浏览器中检测到渲染(任何渲染)时被触发(例如背...

  • VasSonic

    解决移动端打开web页面卡顿,白屏的问题等问题 优化: 静态直出。Vnues-腾讯自动构建发布系统 离线预推。页面...

  • Android 打开FlutterActivity页面白屏问题处

    不做任何处理,直接跳转Flutter页面的代码如下(会白屏) 导致白屏的原因是因为engine加载耗时,解决这个问...

  • 【工作笔记】如何处理react中的渲染异常

    我们知道,在使用 react 渲染页面的时候,如果某个子组件发生了错误,将会造成整个页面的白屏: 这样就会造成一个...

  • mui混合开发(四)

    简述:mui预加载完美解决混合应用弱网白屏问题,给用户更好的体验,一旦使用了预加载创建子页面传递参数就会失效,解决...

网友评论

      本文标题:预渲染pre-render 和 页面白屏处理

      本文链接:https://www.haomeiwen.com/subject/exuujftx.html