关于ssr:解决基于-Webpack-构建的-Vue-服务端渲染项目首屏渲染样式闪烁的问题
前言当咱们应用 Webpack 搭建一个基于 Vue 的服务端渲染我的项目时,通常会遇到一个很麻烦的问题,即咱们无奈提前获取到以后页面所需的资源,从而不能提前加载以后页面所需的 CSS,导致客户端在获取到服务端渲染的 HTML 时,失去的只有 HTML 文本而没有 CSS 款式,之后须要期待一会儿能力将 CSS 加载进去,也就是会遇到『款式闪动』这样的问题。 问题剖析这是因为 webpack 利用的代码加载机制导致的。 在大型利用中,webpack 不可能将我的项目只打包为独自的一个 js、css 文件,而是会利用 webpack 的 代码宰割 机制,将宏大的代码依照肯定的规定(比方超过肯定的大小、或者被屡次援用)进行拆分,这样代码的产出就会成为如下的样子: 注:xxx 指的是每次打包生成的文件哈希,用于更新浏览器的本地缓存,更多详情参考 官网文档// 入口文件main.xxx.jsmain.xxx.css// runtime 文件,后续重点介绍runtimechunk~main.xxx.js// 应用了异步加载形式引入而被拆分的包,如 vue-router 的路由懒加载layout.xxx.jslayout.xxx.csshome-page.xxx.jshome-page.xxx.cssuser-page.xxx.jsuser-page.xxx.css// 被拆分的子包(如果被拆分的子包中没有 css 文件的引入,那么就不会生成 css 子包)73e8df2.xxx.js73e8df2.xxx.css980e123.xxx.js如上,如果没有进行非凡的 webpack 分包配置,个别就会生成如上四种类型的包,并且如果应用了 css-minimizer-webpack-plugin 的话(PS:这个包是必须的),还会为每个援用了 css 的子包再独自生成一个对应的 css 文件。这四种类型的包在整体上还能够被具体划分为两类: 具名子包(namedChunk)随机命名子包main.xxx.js 这种入口文件,以及 home-page.xxx.js 这样异步引入同时并应用 Comments 进行命名的包,被称为『具名子包』;而相似 73e8df2.xxx.js 这种文件名是由一串随机哈希组成的文件,咱们将其称为『随机命名子包』。 通常这两种包是存在依赖关系的,随机命名子包其实就是从命名子包中拆分进去的代码,或者是多个命名子包共用的某一部分代码,依赖关系示例如下: 当咱们打包好一个 Vue 利用之后,假如 chunk 之间的依赖关系如上图所示,打包好的 HTML 会按程序内联入如下几个 js 和 css: runtimechunk~main.js73e9df.js29fe22.jsmian.jsmain.cssmian.js 被内联入 HTML 的起因是因为其是以后 Vue 利用的入口文件,不管用户拜访哪个页面都会加载,因而必须被内联到 HTML 中;73e9df.js、29fe22.js 这两个文件被内联入 HTML 的起因是因为他们属于 main.js 的依赖 chunk,vue 相干的代码就很可能被打包到这两个子包中,main.js 如果想要失常运行就必须要先加载这两个包;main.css 被内联到 HTML 的起因是因为 main.js 中援用了一些 css,这些 css 也会被视作利用加载的必要加载项。 ...