我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

好久没更新了,对不起关注我的朋友!本文灵感来源于做一个公司网站的项目。

我在做官网的时候只知道Nuxt是Vue的SSR框架,也知道Vue项目需要做SEO优化,需要用到SSR技术,所以就自己开发了。在叙述之前先列一个提纲,方便大家选择性阅读。

SSR原理应用 SEO优化处理 SSR原理应用

SSR(side)服务端渲染对于前端开发者来说已经很熟悉了,但是很多人对于具体的概念以及整个配置如何实现还是比较困惑的,本文讲解了以下几点

为什么要用SSR,它和浏览器渲染有什么不同,起什么作用?SSR概念

将 Vue 组件在服务器上渲染成 HTML 字符串并发送给浏览器,最终将这些静态标签“激活”成可交互的应用程序的过程称为服务端渲染。

传统的asp、jsp等网页渲染技术都是客户端向服务器发送请求,服务器通过查找数据库等操作拼出HTML,返回给客户端,在浏览器中进行渲染。

在如今的SPA框架中,比如Vue框架,当客户端发出请求时,服务端只返回一个HTML结构:

只有执行完Vue.js之后,配置的数据才会被渲染出来,执行过程中有些代码会进行Axois异步请求,向服务器发送请求,服务器返回相应数据才能继续渲染。

所以对于SPA项目来说,1.首屏渲染速度慢 2.对SEO不友好

screenshot-20220302-182937.png

SSR 是传统 Web 渲染技术与 SPA 之间的一种折衷:

image.png

如何建立一个可以实现 SSR 的项目

1.创建vue ssr项目

vue create ssr

安装依赖项

渲染器:vue--

Node.js 服务器:

npm i vue-server-renderer express -D

2.在创建的项目中添加文件夹,并创建index.js文件

image.png

const express = require('express');
const Vue = require('vue');
const app = express();
const renderer = require('vue-server-renderer').createRenderer();
const port = 3000;
const page = new Vue({
    data(){
        return{
            title:'技术直男星辰'
        }
    },
    template:`

{{title}}

hello, vue ssr!
`
}); app.get('/',async (req,res)=>{ try { const html = await renderer.renderToString(page) res.send(html) } catch(err){ res.status(500).send('服务器内部错误'); } }); app.linsten(port,()=>{ console.log(`渲染服务器在${port}端口成功运行`) })

在目录下执行一个简单的ssr,就设置好了

node ./index.js

开发中肯定会用到路由,所以需要创建一个文件夹。注意,这和我们以前创建路由的方式不一样,不是直接实例化一个路由进行配置,而是需要写一个工厂函数返回实例化的路由,因为每次用户请求都要创建新的路由,如果不重新创建的话就会产生混乱,这也是服务器负载增加的原因。

image.png

    import Router from 'vue-router'
    
    import Index form '@/components/Index';
    import Detail form '@/components/Detial';
    
    export default createRouter()=> {
        return new Router({
            mode:'history',
            routes:[
                {path:'/',component:Index},
                {path:'/detail',component:Detail},
            ]
        })
    }

但是这样还不够,我们可以看到SSR的构建过程需要两个入口和一个公共入口,可以理解为项目中的main.js。

image.png

在src下创建app.js entry-serve.js entry-.js

应用程序.js

app 是通用入口,由于是在服务端,所以不需要在 Vue 实例后面加 $mount 进行挂载

image.png

入口-.js

服务端入口从app.js引入,通过处理异步问题,可以在用户输入URL时返回执行成功的Vue实例。

image.png

入口-.js

客户端入口,只需要将成功的实例挂载到#app即可

image.png

配置vue..js需要安装一些依赖项

vue--/-服务端渲染插件生成服务端包

vue--/-客户端渲染插件生成客户端包

用于跨平台设置和使用环境变量的 脚本

const VueSSRServerPlugin = require("vue-server-renderer/server-plugin");
const VueSSRClientPlugin = require("vue-server-renderer/client-plugin");
const TARGET_NODE = process.env.WEBPACK_TAGET === 'node';
const target = TARGET_NODE ? 'server' :'client';
module.exports = {
    outputDir: './dist/' + target,
    configureWebpack: ()=>({
        entry: `./src/entry-${target}.js`,
        devtool: 'source-map',
        target: TARGET_NODE ?'node' :'web',
        node: TARGET_NODE ?undefined : false,
        output: {
            libraryTarget: TARGET_NODE ? 'commonjs2' :undefined
        },
        plugins: [TARGET_NODE ?new VueSSRServerPlugin() : new VueSSRClientPlugin()]
    })
}

配置打包命令.json

"scripts":{
    "build:client":"vue-cli-service build",
    "build:server":"cross-env WEBPACH_TARGET=node vue-cli-service build --mode server",
    "build":"npm run build:client && npm run build:server"
}

改造前文件夹中的Index.js

const fs = require('fs')
//创建渲染器
const {createBundleRenderer} = require('vue-server-renderer');
const serverBundle = require('../dist/server/vue-ssr-server-bundle.json');
const clientManifest = require('../dist/client/vue-ssr-client-manifest.json');
const renderer = createBundleRenderer(serverBundle,{
    runInNewContext:false,
    template:fs.readFileSync('../public/index.temp.html','utf-8'), 
    clientManifest,
})
// 中间件处理静态文件请求
app.use(express,static('../dist/client'),index:false))
app.get('*',async (req,res)=>{
    try {
        const context = {
            url:req.url,
            title:'技术直男星辰'
        }
        const html = await renderer.renderToString(context)
        res.send(html)
    } catch(err){
        res.status(500).send('服务器内部错误');
    }
});
app.linsten(port,()=>{
    console.log(`渲染服务器在${port}端口成功运行`)
})

刚刚在文件中引入了..//index.temp.html 需要创建一个主机模板文件,在文件夹中创建index.temp.html

html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <title>Vue ssrtitle>
    head>
    <body>
        <--vue-ssr-outlet-->  服务端渲染的口
    body>
html>

至此所有项目都构建成功。

综上所述:

SSR 需要 node 服务中间层进行数据请求,然后编译模板输出 HTML 文件。需要两个入口文件 entry-entry-,针对不同的环境做不同的操作。当用户请求 node 服务时,返回的是刚刚实例化的 Vue,而不是普通的 SPA 只实例化一次。一些配置和宿主模板有约定好的写法规则,需要像 for if map 一样牢记。

让我们讨论下一个话题

SEO优化处理

由于我并不是专业的SEO优化人员,所以只能简单分享一些我在项目中遇到的经验:

在服务器根目录下创建txt文件,所有界面数据必须在源码中首次渲染时显示出来。优化路径问题,所有跳转路径使用标签跳转,不要使用事件跳转(如.push)。在TDK中添加更多页面描述,使用301重定向txt文件

百度百科上有很详细的介绍,这里就简单介绍一下,当爬虫要爬取一个网站的时候,会先在服务器根目录下寻找.txt文件,该文件规定了哪些爬虫可以访问这个网站,哪些域名允许爬虫访问进行数据采集,当然也规定了哪些爬虫不能访问,哪些网站不允许爬虫访问。它可以屏蔽掉一些网站上的一些比较大的的文件,比如图片,音乐,视频等,节省服务器带宽;它可以屏蔽掉网站上的一些死链接,方便搜索引擎抓取网站内容;设置网站地图连接,方便蜘蛛抓取页面。

写作字段含义:

User-agent:代表搜索引擎的类型,全选的时候就用*就可以了,比如搜狗网页版。

:禁止爬虫爬取的地址:/禁止爬取所有地址;:/admin/禁止爬取admin目录下的目录;:/?/禁止访问网站上所有含有问号(?)的URL;:/live/*.html禁止访问/cgi-bin/目录下所有以“.htm”为后缀的URL;:/.jpg$禁止爬取网页上所有.jpg格式的图片。

Allow:允许爬取资源 Allow:.htm$ 只允许访问以“.htm”为后缀的URL; :/cgi-bin/ 这里定义允许爬取cgi-bin目录下的目录; Allow:/tmp 这里定义允许爬取整个tmp目录

: 告诉爬虫程序该页面是站点地图

好奇的话可以百度一下,说一下一些使用误区:

1:如果网站上所有内容都需要被爬虫抓取,就没必要添加文件了,反正这个文件也不存在,爬虫默认就可以爬取所有页面。

当爬虫爬取到不存在的URL时,服务器会记录404,这与用户正常访问是一致的,所以为了避免记录大量的日志,需要添加爬虫规则。

第二:设置.txt文件里的所有文件都被搜索蜘蛛抓取,这样可以增加网站的收录率,即使网站里的js、css被爬虫收录了,也不会增加网站的收录率,还会浪费服务器性能。

所有界面数据必须在第一次渲染时在源代码中显示出来。

上面提到了,由于spa返回的页面是网页结构,需要等到框架脚本执行完才会出现内容。SSR技术其实就是为了解决内容输出的问题,通过SSR,接口返回的内容会在源码中体现出来,这样爬虫就可以直接爬取网页内容,收集到更多的关键词,从而提高网站排名。

优化路径问题

1.路径中不要带参数,比如查询参数。路径问题对SEO的影响也很大。路径一般分为三种:

1).动态路径:我们经常会用到查询参数,以?开头,用&=分隔传递不用的参数。爬虫遇到这种情况会递归往下读,当超过三个时,爬取会造成数据丢失。而且参数不宜过长。

2).静态路径:一般是指层次比较清晰,目录结构明确,不包含参数。这是爬虫最节省资源的方式。当然动态路径和静态路径爬取是一样的,但是既然是做SEO,就要遵守SEO规则。

3).伪静态路径:和路由的参数传递类似,是利用技术把动态路径转化为静态路径的一种形式,但本质上还是静态路径,比如/index/112.html

另外网站只允许设置一种路径,即全部动态路径或者静态路径,不允许同时使用两种路径,如果有第二个连接,必须屏蔽,也可以用.txt屏蔽。2.将路径名改为小写

3. 不能使用中文作为域名

爬虫根本无法识别这种路径格式,基本不会被抓取到,你可以用拼音或者英文。

4. 路径名和层级尽量短,如果之前包含的链接不再使用,可以用301重定向到新域名,这样会把这个网站的权重转移到另一个网站上。

所有跳转路径使用标签跳转,不使用事件跳转(如.push)

当爬虫爬取到一个网站后,会沿着a标签继续向下访问,如果写点击事件,使用路由跳转,爬虫就没法读取脚本,采集更多相关网站了。

TDK 中页面的更多描述

网站首页的标题是最重要的,直接影响整个网站的排名

技术型直男明星

就是对我们整个网站的核心关键词或者服务领域的浓缩和提炼,在设置首页标题T的时候尽量使用分词技术,百度会对标题进行合并分解,使用英文-_进行拆分,首页标题总字数不要超过30个汉字,否则可能会出现标题显示不全的情况。

首页标题怎么写:一般为‘网站名称-主要关键词或者包含关键词的描述’,一般将主要关键词放在最前面,因为搜索引擎给予标题中第一个字的排名高于后面的字。 专栏页标题怎么写:一般有‘专栏名称-网站名称’和‘专栏名称专栏关键词-网站名称’两种。比如企业招聘专栏,最好使用企业招聘,不要使用生僻的或者没有辨识度的名字,比如企业招聘、企业参观等,虽然个性化,但是对优化并不友好。 列表页标题怎么写:‘列表页名称-专栏名称-网站名称’。 文章详情页标题怎么写:标题有‘文章标题-网站名称’、‘内容标题-专栏名称’、‘内容标题-专栏名称-网站名称’三种,最后一种是最规范的,可以给用户很好的提示。

D 描述是网站关键词的集合

字数一般控制在150字以内,如果太长,则无法正常显示。百度移动搜索网站优化白皮书中关于网站优化的内容提到:百度并未承诺严格按照标题和摘要的内容展示标题和摘要,尤其是摘要。它会根据用户搜索的关键词,自动匹配并展示合适的摘要内容,让用户了解网页主要内容,影响用户的行为决策。(本段来自百度搜索资源平台)

K关键字设置\

首页怎么写:一般将首页的标题、关键词、一些特殊栏目内容整合到其中,写一个简单的介绍。 专栏页怎么写:一般将栏目标题、关键词、分类列表名整合到介绍中。 列表页怎么写:一般将列表标题和关键词整合到介绍中。 文章详情页怎么写:一般将文章标题和文章内容整合到介绍中。

主要作用是告诉搜索引擎这个页面的内容是围绕哪些词展开的。所以每个词在内容中都要能找到对应的匹配,方便排名。一般关键词不超过3个,每个关键词不宜过长,单词之间用英文“,”隔开。但各大搜索引擎对关键词堆砌已经打击很大,目前百度等搜索引擎已经不再查收录关键词,而主要是为了利用第三方工具查收录关键词的排名情况。比如我们用站长工具查询的时候,就需要加上。首页写法:一般为‘网站名称,主要栏目名称,主要关键词’。栏目页写法:一般为‘栏目名称,栏目关键词,栏目分类列表’。列表页写法:‘栏目主要关键词’。文章详情页写法:抽取一些文章关键词或者重复次数比较多的词,使用

:是HTML的属性值,它会存在于a标签和meta标签中,告诉爬虫不要跟踪这个页面上的链接或者不要跟踪这个链接,比如一些重要性不高或者一些不需要排名的链接。利用它可以使得爬虫增加重要链接的权重,便于集中网站权重,减少权重分散。


<meta name="robots" content="nofollow" />

<a href="www.XXX.com" rel="nofollow">a>

:是HTML中规范URL的属性值,比如有多个URL可以同时访问一个网页,那么我们用它来告诉爬虫这个网页的首选URL是哪个,这个指定的URL就是最有价值、最规范的网页。

<link href="canonical" href="http://www.XXX.com/newWebsite">

301 重定向

301是浏览器发送http请求时,服务器响应的一个状态码,代表页面已经永久移动了,又叫重定向,一般需要进行新旧网站的替换,比如将.php改成.html。这种情况下如果不做重定向,用户收藏夹或者搜索引擎数据库中的旧地址只会让来访的客户得到404页面错误信息,访问流量就白白流失了。使用301重定向,不仅可以让页面自动跳转,还可以告诉用户你换了新的网址,同时也告诉搜索引擎这是真实的网址,搜索引擎在重定向之后只会收录新的网址,同时会把旧地址的权重转移到新地址,这样网站的排名就不会因为网址变动而受到影响。

同时,当网站注册了多个域名,且内容重复时,就需要使用 301 让用户跳转到其中一个主域名,避免搜索引擎惩罚。当然 301 是服务端语言 IIS 实现的,纯前端技术无法实现,但是 Nuxt 将其作为中间层,在 Nuxt 执行环节的开始,也就是服务端,同样可以实现 301 跳转。

如果本文对您有帮助或启发,我将非常高兴。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/2233.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线