vue预渲染

news/2024/7/10 2:43:43 标签: vue

vue_0">vue预渲染

vue是一个单页面应用(spa),只有一个 html 文件(内容只有一个#app根节点),通过加载js脚本来填充页面要渲染的内容,然而这种方式无法被爬虫和百度搜索到。如果想对某些页面进行SEO(搜索引擎优化)优化,可以通过预渲染实现,无需使用web服务器实时动态编译html,只需要在构建的时候简单的生成针对特定路由的 静态html文件。优点是设置预渲染更简单,并可以将你得前端作为一个完全静态的站点。

1 安装预渲染插件

npm install prerender-spa-plugin -D  #安装或者编译出错,npm换成cnpm

vueconfigjs_10">2 配置vue.config.js

const path = require('path')
// 预渲染插件
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
module.exports = {
    configureWebpack: {
        plugins: [
            new PrerenderSPAPlugin({
                // 生成文件的路径,与webpack打包一致即可
                staticDir: path.join(__dirname, 'dist'),
                // 需要预渲染的路由
                routes: ['/', '/about'],
                renderer: new Renderer({
                    inject: {
                        foo: 'bar'
                    },
                    headless: false,
                    // 这个选项很重要,在程序入口执行:document.dispatchEvent(new Event('render-event'))
                    renderAfterDocumentEvent: 'render-event',
                })
            })
        ]
    }
}

3 修改main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
    router,
    mounted() {
        document.dispatchEvent(new Event('render-event'))
    },
    render: h => h(App)
}).$mount('#app')

4 修改router.js

const router = new VueRouter({
   // 修改路由模式为history
   mode: 'history',
   routes
})

5 构建项目

npm run build

构建成功后,dist目录下可以看到,根路径和about路径下都生成了index.html文件,当浏览器访问这两个路径(路由)时,服务器返回的就是对应html文件的内容。

在这里插入图片描述

6 修改页面的meta信息

  • 安装vue-meta-info插件
npm install vue-meta-info -S  #安装时最好和prerender-spa-plugin一起安装
  • 修改main.js
import MetaInfo from 'vue-meta-info'
Vue.use(MetaInfo)
  • 修改vue文件
<template>
    <div class="home">
        home page...
    </div>
</template>
<script>
export default {
// npm install vue-meta-info --save 
// main.js 导入并Vue.use(xxx)
// 配置title和meta数据,实现seo优化配合预渲染使用
  metaInfo: {
    title: '我是一个title',
    meta: [
      {
        name: 'keywords',
        content: '关键字1,关键字2,关键字3'
      },
      {
        name: 'description',
        content: '这是一段网页的描述'
      }
    ]
  },
}
</script>
  • 打包后生成的文件内容
<!DOCTYPE html>
<html lang="">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="icon" href="/favicon.ico">
    <title>我是一个title</title>
    <link href="/js/about.9f1a3f34.js" rel="prefetch">
    <link href="/js/app.bebcb2a7.js" rel="preload" as="script">
    <link href="/js/chunk-vendors.6dae171a.js" rel="preload" as="script">
    <meta data-vue-meta-info="true" name="keywords" content="关键字1,关键字2,关键字3">
    <meta data-vue-meta-info="true" name="description" content="这是一段网页的描述">
</head>

<body>
	<noscript>
		<strong>We're sorry but my-prj2 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
	</noscript>
    <div id="app"><a href="/" aria-current="page" class="router-link-exact-active router-link-active">首页</a> | <a href="/about" class="">关于</a>
        <div class="home"> home page... </div>
    </div>
    <script src="/js/chunk-vendors.6dae171a.js"></script>
    <script src="/js/app.bebcb2a7.js"></script>
</body>

</html>

http://www.niftyadmin.cn/n/620618.html

相关文章

http静态服务

http静态服务 1 回调方式 // 浏览器请求服务器的内容&#xff0c;进行回显 const http require(http); const url require(url); const path require(path); const fs require(fs); // mime处理内容类型 const mime require(mime); const server http.createServer((re…

Node操作Mysql简单实现

Node操作Mysql简单实现 通过express创建服务器; 通过浏览器请求服务器&#xff0c;服务器收到浏览器请求后&#xff0c;根据不同的请求去操作Mysql数据库实现数据的增删改查 1 配置开发环境 npm init -ynpm install mysql express --save2 连接数据库 const mysql require(m…

vue插件开发

vue插件开发 1 插件概念 1.1 什么是插件 随着项目编写的进行&#xff0c;代码量越来越多&#xff0c;重复的内容随之增加&#xff0c;比如每个页面可能都会有提示框&#xff0c;同个项目中这些提示的样式都是统一的&#xff0c;那么我们没必要每个页面每个交互动作都写一个提…

css实现多行文本展开与收起

1 效果展示 2 方法介绍 控制多行文本溢出省略&#xff1a;display: -webkit-box;-webkit-line-clamp: 3;overflow: hidden; -webkit-box-orient: vertical;按钮右下角文字环绕布局&#xff1a;float: right;设置按钮局右&#xff0c;加一个before伪元素设置按钮局下展开/收起状…

input type=file选择图片按钮样式修改与图片预览

1 背景 通过上图我们可以看到input typefile按钮的默认样式&#xff0c;非常不美观&#xff0c;如果要自定义该按钮的样式&#xff0c;要如何实现呢&#xff1f; 2 方式1样式 input覆盖整个按钮区域&#xff0c;并且设置完全透明 <!DOCTYPE html> <html lang"en…

mysql 建立索引在on 从句中_mysql中sql_mode的修改

很多时候修改sql_mode是因为插入或者修改空日期失败只要sql_mode中的两个属性删除就可以了NO_ZERO_DATE(设置该值&#xff0c;mysql数据库不允许插入零日期&#xff0c;插入零日期会抛出错误而不是警告)NO_ZERO_IN_DATE(在严格模式下&#xff0c;不允许日期和月份为零)1. 查询s…

vue2与vue3响应式数据原理的区别

1 vue2响应式数据原理 vue2&#xff1a;通过es5的Object.defineProperty实现数据响应式 // 数组响应式处理&#xff1a;覆盖原有数组原型方法&#xff0c;增加通知变更 var originProto Array.prototype // 创建一个含有原型的对象 var arrayProto Object.create(originProto…

promise源码实现

class Promise {// 三状态&#xff1a;等待态、成功态、失败态static PENDING pendingstatic RESOLVED resolvedstatic REJECTED rejectedconstructor(excutor) {// promise实例初始化this.state Promise.PENDING // 默认为等待态this.value undefined // then方法成功回调…