vue项目实现seo优化之使用预渲染,prerender-spa-plugin

为什么要做seo优化

相比于传统多页面项目,vue,react等之类的单页面应用(spa)对网络爬虫不友好

因为网络爬虫只能识别网页内容(html),并不能抓取js,而spa应用主要是靠js的跳转来实现的

vue项目的seo优化方式

1.SSR(服务端渲染),使用Nuxt.js,适用于从零开始搭建项目时使用

2.预渲染,使用prerender-spa-plugin,在已完成的项目的基础上,适用于某几个页面需要进行seo优化

3.prerender-node(不是很清楚)

本文介绍使用预渲染实现seo优化

1.安装prerender-spa-plugin

   npm i prerender-spa-plugin --save -D

2.在webpack中配置

如果项目是vue-cli2搭建的,找到 build/webpack.prod.conf.js

配置代码:

const path = require('path') 
const HtmlWebpackPlugin = require('html-webpack-plugin') 
const baseWebpackConfig = require('./webpack.base.conf') 
const PrerenderSPAPlugin = require('prerender-spa-plugin') 
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer 

const webpackConfig = merge(baseWebpackConfig, { 
    plugins: [
    // vue-cli生成的配置中就已有这个了,不要动 
        new HtmlWebpackPlugin({
            filename: config.build.index, 
            template: 'index.html',
            inject: true, 
            minify: { 
                removeComments: true, 
                collapseWhitespace: true,
                removeAttributeQuotes: true 
            },
            chunksSortMode: 'dependency' 
        }),   
        // 在vue-cli生成的文件的基础上,只有下面这个才是我们要配置的 
        new PrerenderSPAPlugin({ 
        // 生成文件的路径,也可以与webpakc打包的一致。 
        // 下面这句话非常重要!!! 
        // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。 
            staticDir: path.join(__dirname, '../dist'),   
            // 对应自己的路由文件,比如index有参数,就需要写成 /index/param1。 
            routes: ['/', '/index', '/home', '/category'],
            // 这个很重要,如果没有配置这段,也不会进行预编译 
            renderer: new Renderer({ 
                inject: {
                    foo: 'bar' 
                }, 
                headless: false,
            // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
                renderAfterDocumentEvent: 'render-event'
            })
        })
    ]
})

3.在 webpack.prod.conf.js 配置完成之后,然后再 main.js 里改成如下所示

new Vue({
    el: '#app', 
    router, 
    store, 
    render: h => h(App),
    
    /* 这句非常重要,否则预渲染将不会启动 */ 
    mounted () {
        document.dispatchEvent(new Event('render-event')) 
    }
})

4.打包一下,npm run build, 看下是否dist文件夹下有路由对应名称的文件夹,然后找个文件夹打开里面的index.html,在浏览器右键查看源代码中查看是否有HTML代码,有的话,就成功了