Vue seo(vue为什么不利于seo)

Vue seo



什么是SEO

搜索引擎优化(Search engine optimization,简称SEO),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从搜索引擎中获得更多的免费流量,以及更好的展现形象。

SEM(Search engine marketing,搜索引擎营销),则既包括了SEO,也包括了付费的商业推广优化。

本文主要介绍的是前端如何在代码上做SEO以及单页项目如何实现SEO。

搜索引擎工作原理

要了解SEO,首先得了解搜索引擎的工作原理,其原理是比较复杂,流程简化如下:

爬虫抓取网页内容

一般爬虫抓取页面内容是先从一个页面出发,从中提取出其他页面的链接,然后当作下一个请求的对象,一直重复这个过程。所以要有良好的SEO,需要你在各大网站上拥有外链,这样会提高你的网站被搜索引擎爬虫的几率。

分析网页内容

爬虫拿到HTML之后,就会对其内容进行分析。一般需要进行去杂、分词、简历索引数据库。什么是索引数据库呢?简单地说就是记录一个词在哪些文档中出现、出现次数、出现的位置等等。为什么要简历索引数据库呢?是为了快速查找。

搜索和排序

搜索会根据你输入的关键词,分别查询其对应的索引数据库,并对结果进行处理和排序。

前端编码的SEO

网站结构

网站结构要清晰。一般网站的结构是树形的,一般分为三个层次:首页 → 频道页(列表页) → 文章页(详情页)。

网站的结构要扁平。结构层数越少越好,一般不要超过三层,搜索引擎一般到了第三层就不想继续深入地爬取了。多数的网站,例如掘金、雪球等,他们的网站结构是两层,他们的首页和频道页是同一个页面。

导航

页面应该要有简明的导航。导航可以让搜索引擎知道网站的结构,也可以让搜索引擎知道当前页面在网站结构所在的层次。 建议:


每一个页面都包含导航。

对于内容较多的网站可以采用面包屑导航。

链接使用文字链接,如果是图片,则通过alt属性告知搜索引擎链接的指向。


规范的URL

规范、简单、易理解的URL能让搜索引擎更好地抓取内容。建议:


同一个页面,只对应一个url 。多个url可以采用301进行重定向。

url可以反应网页内容以及网站结构信息。例如 a.com/bloga.com/blog/123a.com/article

url尽量简短。

尽量减少动态url中包含的变量参数。


提交Sitemap

Sitemap 可通知搜索引擎他们网站上有哪些可供抓取的网页,以便搜索引擎可以更加智能地抓取网站。

robot.txt

搜索引擎爬行网站第一个访问的文件就是robots.txt。在这个文件中声明该网站中不想被蜘蛛访问的部分,这样,该网站的部分或全部内容就可以不被搜索引擎访问和收录了,或者可以通过robots.txt指定使搜索引擎只收录指定的内容。

合理的HTTP返回码

不同的返回码,搜索引擎的处理逻辑是不一样的。


如果站点临时关闭,当网页不能打开时,建议使用503状态。503可以告知百度spider该页面临时不可访问,请过段时间再重试。

如果百度spider对您的站点抓取压力过大,请尽量不要使用404,同样建议返回503。这样百度spider会过段时间再来尝试抓取这个链接,如果那个时间站点空闲,那它就会被成功抓取了。

有一些网站希望百度只收录部分内容,例如审核后的内容,累积一段时间的新用户页等等。在这种情况,建议新发内容暂时返回403,等审核或做好处理之后,再返回正常状态的返回码。

站点迁移,或域名更换时,请使用301返回。


合适的title

title是告诉搜索引擎网页的主要内容。


每个网页应该有一个独一无二的标题,切忌所有的页面都使用默认标题

标题要主题明确和精练,包含这个网页中最重要的内容,且不罗列与网页内容不相关的信息

用户浏览通常是从左到右的,重要的内容应该放到title的靠前的位置


百度建议描述:


首页:网站名称 或者 网站名称_服务介绍/产品介绍

频道页:频道名称_网站名称

文章页:文章标题_频道名称_网站名称


合适的description

description是对网页内容的精练概括。这个标签存在与否不影响网页权值,只会用做搜索结果摘要的一个选择目标。 百度推荐做法:


为每个网页创建不同的description,避免所有网页都使用同样的描述

网站首页、频道页、产品参数页等没有摘要的网页最适合使用description

准确的描述网页,不要堆砌关键词,长度合理


HTML语义化

HTML语义化是用标签和属性来描述内容。所以HTML语义化是SEO的基石。一般建议:


HTML结构要清晰和简洁

跳转使用

标签,不要使用js跳转

图片加alt说明

文章用

标签承载

...


Vue单页项目的SEO

目前,对于SEO支持比较好的项目方案是采用服务端渲染。所以如果项目有SEO需求,那么比较好的方案是服务端渲染。

如果你已经采用了前后分离的单页项目,而你的网站内容不需要AJAX去获取内容和展示内容,那么可以试试 prerender-spa-plugin 这个插件,这个插件是一个webpack插件,可以帮助你在打包过程中通过无头浏览器去渲染你的页面,并生成对应的HTML。当然这个方案适合你的路由是静态的,并且路由数量非海量。

如果你的内容是AJAX动态获取的,那么vue单页项目可以试试 prerender ,这个是一个预渲染服务,可以帮你通过无头浏览器渲染页面,并返回HTML。这个方案和prerender-spa-plugin很相似,都是通过无头浏览器去渲染页面,不同的是渲染的时机,prerender-spa-plugin是在打包过程中渲染,注定了其只能渲染静态路由,而prerender 是在请求时渲染,所以可以渲染动态的路由。下面我重点介绍一下prerender方案。

prerender 的使用

1、安装

$ npm install prerender 复制代码

2、启动服务 server.js

const prerender = require('prerender'); const server = prerender(); server.start(); 复制代码

3、测试

http://localhost:3000/render?url=https://www.example.com/ 复制代码

经过上面三个步骤,你就已经启动一个预渲染服务,并且会返回"http://www.example.com/"的内容,整个过程还是比较简单的。其github官网上面还介绍了它的许多中间件(Middleware),例如prerender-node (Express)、nginx.conf等,那么这个和 prerender 是什么关系呢?是否直接使用中间件就可以呢?下面介绍prerender是如何工作的吧。

prerender方案的原理

首先服务端接收到一个页面的请求,然后判断这个请求是否来自搜索引擎的爬虫,如果不是,则直接返回单页项目的HTML,按照普通单页项目的工作模式(客户端渲染),如果是,则把请求转发给prerender服务,prerender服务会通过无头浏览器进行预渲染,渲染完成把内容返回,这样爬虫就可以拿到有内容的HTML了。prerender中间件就是用来判断请求是否来自搜索引擎爬虫和转发请求的。

值得注意的是,prerender服务是不包含无头浏览器的,所以需要自行安装chrome浏览器。因此,整个方案运行需要三部分:


chrome浏览器

prerender服务

prerender中间件


那么prerender服务是怎么知道页面渲染已经完成的呢? Prerender服务通过计算未完成的请求数量,来确定页面何时完成加载。一旦未完成的请求数达到零,服务会等待一段时间(默认500ms),然后保存HTML。

prerender的最佳实践

经过实践,请求一个经过prerender渲染的页面是时间,快的时候约2s,慢的时候会长达8s。一般来说,请求时间在3s以内是最好的。所以我从以下几个方面入手,探索prerender的优化方法。

减少资源请求的时间

影响prerender渲染时间的资源主要有js请求资源和api请求资源,api请求时间一般由后端决定,所以我考虑的是如何减少js资源请求时间。一般prerender服务渲染的资源请求地址是由页面请求URL决定的,所以一般是线上的地址,如果我们把prerender服务部署在网站的服务器上,让prerender服务请求资源走本地,那么就可以缩短资源的请求时间了。

如果你的线上服务是开启了CDN的话,那么资源走本地还有一个好处,就是可以节省CDN流量。

优化prerender选项

prerender提供了一些自定义的选项

pageDoneCheckInterval:这个参数是prerender检查页面请求是否完成的定时器时间,默认是500ms,即每500ms检查未完成的请求数量是否为零,我将其修改为100ms,提高其检查的频率。

waitAfterLastRequest:这个参数是最后一个请求完成之后等待的时间,默认是500ms,主要是请求完成之后,页面更新渲染需要时间,立即返回的话,可能请求的数据来不及渲染,我将时间修改为200ms。

prerender插件

httpHeaders —— 返回合理的HTTP状态码

添加httpHeaders这个插件,可以更改返回的HTML的HTTP状态码,添加方式如下

var prerender = require('prerender'); var server = prerender() server.use(prerender.httpHeaders()); server.start(); 复制代码

prerender通过识别在

中的

标签来设置页面返回的HTTP状态码。


复制代码

如果你需要设置301重定向,可以这样做


复制代码

blockResources —— 无需等待图片资源

prerender是根据未完成的请求数来判断是否渲染结束的。但是我们给搜索引擎返回的HTML只需要渲染通过js动态增加的DOM,其实不需要渲染css或者渲染接口返回的图片的,我们来看下prerender在渲染中是否会请求这些资源。 prerender可以开启是否打印请求,开启方式如下:

var server = prerender({ logRequests: true }); 复制代码

开启之后就可以在控制台看到请求了,请求里面是包含css和图片资源的。

2019-07-17T04:34:03.180Z - 47 xxx.com/css/chunk-f4a02 2019-07-17T04:34:03.180Z { source: 'network', level: 'error', text: 'Failed to load resource: net::ERR_INVALID_ARGUMENT', timestamp: 1563338043130.37, url: ' xxx.com/wefid/css/chunk', networkRequestId: '1000039068.65' } 2019-07-17T04:34:03.924Z + 3 xxx.com/img/erweima_wx. 2019-07-17T04:34:03.924Z + 4 xxx.com/img/erweima_wb. 复制代码

为什么prerender要等待这些资源呢?因为prerender服务还有一个强大的功能,那就是 Prerender.com,其可以通过一个接口给你返回如下的东西:


网页的HTML文件

网页的屏幕截图(视口或全屏)

网页的PDF文件

网页的HAR文件

执行您自己的javascript并返回json和HTML


很明显,这些功能是需要加载你所需的CSS或图片资源的,不然网页显示有问题。这个时候,如果你只需要满足SEO需求而不需要 Prerender.com的功能的话,那么blockResources插件就可以派上用场了。插件添加方式如下:

var prerender = require('prerender'); var server = prerender() server.use(prerender.blockResources()); server.start(); 复制代码

使用blockResources插件之后,图片资源和字体资源会被abort(舍弃)。

自定义渲染结束时间

如果你想更细粒化地控制prerender的返回时机,提前结束或者延后结束,那么可以使用这个标志window.prerenderReady。

首先需要设置window.prerenderReady为false,prerender在检测到window.prerenderReady为false之后,会等待你设置为true再返回结果。


window.prerenderReady = false;

复制代码


当你渲染完成之后,一般在接口请求完成并渲染完成之后

window.prerenderReady = true; 复制代码

这样你就可以更加自由地控制渲染结束的时机。

开启缓存

缓存这里有两个方面,一方面是HTTP缓存(浏览器缓存),另一方面是渲染结果缓存。

首先HTTP缓存可以让prerender服务不用频繁地发起资源请求,节省传输时间。这个我就不展开将,我想讲的是渲染结果缓存。prerender中间件提供了两种缓存方式, redis 或者 memcached ,以redis为例:

$ npm install redis 复制代码 var redis = require("redis"), client = redis.createClient(); prerender.set('beforeRender', function(req, done) { client.get(req.url, done); }).set('afterRender', function(err, req, prerender_res) { client.set(req.url, prerender_res.body) }); 复制代码

你可以通过 beforeRender 和 afterRender 这两个钩子进行细粒化地控制,对于内容变化频繁的不缓存或缓存时间短,对于内容变化不频繁的设置长时间缓存。开启缓存不仅可以加速返回时间,还可以减轻服务器的压力。

统计和监控

统计和监控可以放在中间件的 afterRender 中进行。

prerender.set('afterRender', function(err, req, prerender_res) { if(err){ // 这里是错误监控代码 // ... // return } let {headers: req_headers, originalUrl} = req let {headers: res_headers, body} = prerender_res // 这里是统计代码,可以保存请求和返回的相关信息 }) 复制代码

小结

通过以上的优化方法(除了自定义渲染结束时间和开启缓存),我已经将HTML的请求时间稳定在2.5s左右。

总结

以上就是我想讲的关于前端编码SEO的全部内容,总而言之,就是


合适的HTML标签和属性

合理的HTTP状态码

Sitemap & robot.txt

合适的渲染方案


参考文章:

juejin.im/post/5d2d64f3

vue为什么不利于seo



作者|郑昊川

编辑|覃云

出处丨前端之巅

本文经作者授权转载,原文链接:

juejin.im/post/5b97b84e

这些优化方案适用于 Vue CLI 2 和 Vue CLI 3 , 文章主要基于 Vue CLI 2 进行介绍,关于如何在 Vue CLI 3 中进行相关的 webpack 调整,我已经放在了 vue-cli3-optimization 这个仓库下,并配有详细的注释,且额外添加方便 Sass 使用的 loader,使用 Sass 时无需再在每个需要引入变量和 mixin 的地方,每次都很麻烦的 @import。下面将详细介绍这些优化方案的实践方式和效果。

和很多小伙伴一样,我在开发 Vue 项目时也是基于官方 vue-cli@2 的 webpack 模版,但随着项目越做越大,依赖的第三方 npm 包越来越多,构建之后的文件也会越来越大,尤其是 vendor.js, 甚至会达到 2M 左右。再加上又是单页应用,这就会导致在网速较慢或者服务器带宽有限的情况出现长时间的白屏。为了解决这个问题,我做了一些探索,在几乎不需要改动业务代码的情况下,找到了三种有明显效果的优化方案 —— CDN + Gzip + Prerender。

我把这些方法整理了一下,放在了 Github 仓库 上 ( github.com/HaoChuan9421), 意图通过不同的分支来展示不同的优化方式,对 Vue 项目性能的影响。你可以直接克隆下来试一试,也得益于有 git 历史,你也可以很方便的查看具体的改动细节。下面我将通过一个简单的项目来展示这三种优化方案的效果。

一、首先准备一个简单的项目

通过 vue-cli@2 的 webpack 模版生成,只包含最基础的 Vue 三件套 ———— vue、vue-router、vuex 以及常用的 element-ui 和 axios。拆分两个路由——“首页”和“通讯录”,通过 axios 异步获取一个通讯录名单,并利用 element-ui 的表格展示。直接 build,不做任何优化处理,以作参照。

构建后文件说明

1.app.css: 压缩合并后的样式文件。

2.app.js:主要包含项目中的 App.vue、main.js、router、store 等业务代码。

3.vendor.js:主要包含项目依赖的诸如 vuex,axios 等第三方库的源码,这也是为什么这个文件如此之大的原因,下一步将探索如何优化这一块,毕竟随着项目的开发,依赖的库也能会越来越多。

4 . 数字.js:以 0、1、2、3 等数字开头的 js 文件,这些文件是各个路由切分出的代码块,因为我拆分了两个路由,并做了路由懒加载 ( router.vuejs.org/zh/gui), 所以出现了 0 和 1 两个 js 文件。

5.mainfest.js:mainfest 的英文有清单、名单的意思,该文件包含了加载和处理路由模块的逻辑。




禁用浏览器缓存,网速限定为 Fast 3G 下的 Network 图 (运行在本地的 nginx 服务器上)

可以看到未经优化的 base 版本在 Fast 3G 的网络下大概需要 7 秒多的时间才加载完毕。




二、CDN 优化

1. 将依赖的 vue、vue-router、vuex、element-ui 和 axios 这五个库,全部改为通过 CDN 链接获取。借助 HtmlWebpackPlugin, 可以方便的使用循环语法在 index.html 里插入 js 和 css 的 CDN 链接。这里的 CDN 大部分使用的 jsDelivr 提供的。


<% for (var i in htmlWebpackPlugin.options.css) { %>

<% for (var i in htmlWebpackPlugin.options.js) { %> <p> <p> </p><p>2. 在 build/webpack.base.conf.js 中添加如下代码,这使得在使用 CDN 引入外部文件的情况下,依然可以在项目中使用 import 的语法来引入这些第三方库,也就意味着你不需要改动项目的代码,这里的键名是 import 的 npm 包名,键值是该库暴露的全局变量。</p><p>webpack 文档参考链接: webpack.js.org/configur</p><p> externals: { 'vue': 'Vue', 'vue-router': 'VueRouter', 'vuex': 'Vuex', 'element-ui':'ELEMENT', 'axios':'axios' } </p><p>3. 卸载依赖的 npm 包,npm uninstall axios element-ui vue vue-router vuex;</p><p>4. 删除 main.js 里 element-ui 相关代码。</p><p>具体细节可以查看 git 的历史记录。</p><p> 比对添加 CDN 前后构建的文件</p><p>优化后:</p><p><img src=" p3-tt.byteimg.com/origi" img_width="1080" img_height="481" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>优化前:</p><p><img src=" p3-tt.byteimg.com/origi" img_width="1080" img_height="483" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>可以看出:</p><p>1.app.css: 因为不再通过 import 'element-ui/lib/theme-chalk/index.css', 而是直接通过 CDN 链接的方式引入 element-ui 样式,使得文件小到了 bytes 级别,因为它现在仅包含少量的项目的 css。</p><p>2.app.js:几乎无变化,因为这里面主要还是自己业务的代码。</p><p>3.vendor.js:将 5 个依赖的 js 全部转为 CDN 链接后,已经小到了不足 1KB,其实里面已经没有任何第三方库了。</p><p>4 . 数字.js 和 mainfest.js:这些文件本来就很小,变化几乎可以忽略。</p><p> 同样,禁用浏览器缓存,网速限定为 Fast 3G 下的 Network 图 (运行在本地的 nginx 服务器上)</p><p>可以看出相同的网络环境下,加载从原来的 7 秒多,提速到现在的 3 秒多,提升非常明显。</p><p>而且更重要的一点是原本的方式,所有的 js 和 css 等静态资源都是请求的我们自己的 nginx 服务器,而现在大部分的静态资源都请求的是第三方的 CDN 资源,这不仅可以带来速度上的提升,在高并发的时候,这无疑大大降低的自己服务器的带宽压力,想象一下原来首屏 900 多 KB 的文件现在仅剩 20KB 是请求自己服务器的!</p><p><img src=" p3-tt.byteimg.com/origi" img_width="1080" img_height="515" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>三、Gzip 优化</p><p>使用 Gzip 两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。</p><p> 如何开启 gzip 压缩</p><p>开启 gzip 的方式主要是通过修改服务器配置,以 nginx 服务器为例,下图是使用同一套代码,在仅改变服务器的 gzip 开关状态的情况下的 Network 对比图:</p><p>未开启 gzip 压缩:</p><p><img src=" p3-tt.byteimg.com/origi" img_width="1080" img_height="515" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>开启 gzip 压缩:</p><p><img src=" p1-tt.byteimg.com/origi" img_width="1080" img_height="515" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>开启 gzip 压缩后的响应头:</p><p><img src=" p3-tt.byteimg.com/origi" img_width="1080" img_height="515" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><p>从上图可以明显看出开启 gzip 前后,文件大小有三四倍的差距,加载速度也从原来的 7 秒多,提升到 3 秒多。</p><p>附上 nginx 的配置方式:</p><p>http { gzip on; gzip_static on; gzip_min_length 1024; gzip_buffers 4 16k; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml; gzip_vary off; gzip_disable "MSIE [1-6]\."; } </p><p> 前端能为 gzip 做点什么?</p><p>我们都知道config/index.js里有一个productionGzip的选项,那么它是做什么用的?我们尝试执行npm install --save-dev compression-webpack-plugin@1.x, 并把productionGzip设置为true,重新build,放在 nginx 服务器下,看看有什么区别:</p><br><p><img src=" p6-tt.byteimg.com/origi" img_width="1080" img_height="471" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p><img src=" p6-tt.byteimg.com/origi" img_width="1080" img_height="515" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>我们会发现构建之后的文件多了一些 js.gz 和 css.gz 的文件,而且 vendor.js 变得更小了,这其实是因为我们开启了 nginx 的 gzip_static on; 选项,如果 gzip_static 设置为 on, 那么就会使用同名的.gz 文件,不会占用服务器的 CPU 资源去压缩。</p><p> 前端快速搭建基于 node 的 gzip 服务</p><p>无法搭建 nginx 环境的前端小伙伴也可以按如下步骤快速启动一个带 gzip 的 express 服务器。</p><p>1. 执行 npm i express compression;</p><p>2. 在项目根目录下新建一个 serve.js, 并粘贴如下代码。</p><p> var express = require('express') var app = express() // 开启 gzip 压缩, 如果你想关闭 gzip, 注释掉下面两行代码,重新执行`node server.js` var compression = require('compression') app.use(compression()) app.use(express.static('dist')) app.listen(3000,function () { console.log('server is runing on http://localhost:3000') }) </p><p>3. 执行 node server.js。</p><p>下图是 express 开启 gzip 的响应头:</p><p><img src=" p6-tt.byteimg.com/origi" img_width="1080" img_height="632" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p>四、Prerender 预渲染</p><p>大家都是知道:常见的 Vue 单页应用构建之后的 index.html 只是一个包含根节点的空白页面,当所有需要的 js 加载完毕之后,才会开始解析并创建 vnode,然后再渲染出真实的 DOM。</p><p>当这些 js 文件过大而网速又很慢或者出现意料之外的报错时,就会出现所谓的白屏,相信做 Vue 开发的小伙伴们一定都遇到过这种情况。而且单页应用还有一个很大的弊端就是对 SEO 很不友好。</p><p>那么如何解决这些问题呢?</p><p>SSR 当然是很好的解决的方案,但这也意为着一定的学习成本和运维成本,而如果你已经有了一个现成的 vue 单页应用,转向 SSR 也并不是一个无缝的过程。那么预渲染就显得更加合适了。只需要安装一个 webpack 的插件 + 一些简单的 webpack 配置就可以解决上述的两个问题。</p><p> 如何将单页应用转为预渲染</p><p>1. 你需要将 router 设为 history 模式,并相应的调整服务器配置,这并不复杂( router.vuejs.org/zh/gui)。</p><p>2.npm i prerender-spa-plugin --save-dev。</p><p>注意!!!预渲染需要下载 Chromium ,而由于你懂的原因,谷歌的东西在国内无法下载,所以在根目录添加了.npmrc 文件,来使用淘宝镜像下载。参考链接: github.com/cnpm/cnpmjs.。如果你的终端可以翻到国外,直接忽略这一步, 你也许会喜欢小飞机: juejin.im/post/5b6852b1。</p><p>3 . 在build/webpack.prod.conf.js下添加如下配置 (没有路由懒加载的情况)。</p><p>const PrerenderSPAPlugin = require('prerender-spa-plugin') ... new PrerenderSPAPlugin({ staticDir: config.build.assetsRoot, routes: [ '/', '/Contacts' ], // 需要预渲染的路由(视你的项目而定) minify: { collapseBooleanAttributes: true, collapseWhitespace: true, decodeEntities: true, keepClosingSlash: true, sortAttributes: true } }) </p><p>4. 将config/index.js里build中的assetsPublicPath字段设置为'/',这是因为当你使用预渲染时, 路由组件会编译成相应文件夹下的index.html,它会依赖 static 目录下的文件,而如果使用相对路径则会导致依赖的路径错误,这也要求预渲染的项目最好是放在网站的根目录下(这个坑我已经在prerender-spa-plugin仓库提过ISSUE了,不过借助postProcess,自己再写一个正则表达式,也能实现,如果你有这方面的需求,可以参考下面 路由懒加载带来的坑)。</p><p>5. 调整main.js:</p><p> new Vue({ router, store, render: h => h(App) }).$mount('#app', true) // ssr.vuejs.org/zh/guide/ </p><p>执行npm run build,你会发现,dist 目录和以往不太一样,不仅多了与指定路由同名的文件夹而且index.html早已渲染好了静态页面。</p><p><img src=" p1-tt.byteimg.com/origi" img_width="1080" img_height="625" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p> 效果如何?</p><p>和之前一样,我们依然禁用缓存,将网速限定为 Fast 3G(运行在本地的 nginx 服务器上)。可以看到,在vendor.js还没有加载完毕的时候(大概有 700 多 kB,此时只加载了 200 多 kB),页面已经完整的呈现出来了。事实上,只需要index.html和app.css加载完毕,页面的静态内容就可以很好的呈现了。预渲染对于这些有大量静态内容的页面,无疑是很好的选择。</p><p><img src=" p6-tt.byteimg.com/origi" img_width="1080" img_height="539" alt="Vue CLI 2&3 下的项目优化实践:CDN + Gzip + Prerender" inline="0"></p><br><p> 路由懒加载带来的坑</p><p>如果你的项目没有做路由懒加载,那么你大可放心的按上面所说的去实践了。但如果你的项目里用了,你应该会看到webpackJsonp is not defined的报错。这个因为prerender-spa-plugin渲染静态页面时,也会将类似于<p><p>这样的异步 script 标签注入到生成的 html 的 head 标签内。这会导致它先于 app.js,vendor.js,manifest.js(位于 body 底部)执行。(async 只是不会阻塞后面的 DOM 解析,这并不意味这它最后执行)。</p><p>而且当这些 js 加载完毕后,又会在 head 标签重复创建这个异步的 script 标签。虽然这个报错不会对程序造成影响,但是最好的方式,还是不要把这些异步组件直接渲染到最终的 html 中。好在prerender-spa-plugin提供了postProcess选项,可以在真正生成 html 文件之前做一次处理,这里我使用一个简单的正则表达式,将这些异步的 script 标签剔除。本分支已经使用了路由懒加载,你可以直接查看 git 历史,比对文件和 base 分支的变化来对你的项目进行相应调整。</p><p> postProcess (renderedRoute) { renderedRoute.html = renderedRoute.html.replace(/<script.*src=".*[0-9]+\.[0-9a-z]*\.js"><\/script>/,'') return renderedRoute } </p><p>除了这种解决方案,还有两种不推荐的解决方案:</p><p>1 . 索性不使用路由懒加载。</p><p>2. 将HtmlWebpackPlugin 的 inject字段设置为'head',这样app.js,vendor.js,manifest.js就会插入到 head 里,并在异步的 script 标签上面。但由于普通的 script 是同步的,在他们全部加载完毕之前,页面是无法渲染的,也就违背了 prerender 的初衷,而且你还需要对 main.js 作如下修改,以确保 Vue 在实例化的时候可以找到<p><p>,并正确挂载。</p><p>const app = new Vue({ // ... }) document.addEventListener('DOMContentLoaded', function () { app.$mount('#app') }) </p><p> 总 结 </p><p>虽然官方的脚手架已经提供很多开箱即用的优化,比如 css 压缩合并,js 压缩与模块化,小图片转 base64 等等,但我们能做的还很多。我没有提及代码级别的优化细节,也是希望给大家提供一些可实践的方案。</p><p>上述三种方案或多或少都会给你项目带来一些收益。优化也是一门玄学,可研究的东西很多。也希望其他小伙伴可以在评论区提供宝贵意见,或者直接向我的这个项目 vue-optimization 的 base 分支提交 PR,好的方案我会采纳并整理。</p><p>目前三种方案整合的最终结果我已经放在 master 分支下 ( github.com/HaoChuan9421), 你可以克隆下来并在此基础上开发你的项目。</p>

哆哆女性网南昌恒茂英伦国际给的陈姓的女宝宝起名seo手机流量软件a5网站优化卜卦起名字家居装饰店起名姓肖的取名起名大全情感句子伤感蛋糕店起名字什么名字?医疗seo招聘一个人的一往情深配送公司起名大全的姓祝请帮忙起个名字去哪网特价机票查询给姓焦的女孩起名免费seo优化运营品牌衡阳的网站建设女性养生养颜经姓石起名男孩邵伟华的周易预测学扶摇电视剧在线观看免费版日上防盗门qq好友中心个性签名超拽霸气七匹狼运动qq八字算命中锐空气能网站seo招商生活需要阳光河南周易淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化