预渲染vue.js应用程序(使用node或laravel)

2023-05-16

服务器端渲染现在非常流行。但它也并非没有缺点。预渲染是一种替代方法,在某些情况下甚至可能更好。下面我们来看一下如何预渲染vue.js应用程序。

在本文中,我们将探讨预渲染如何与vue.js一起工作,并看两个示例:一个是node.js项目,一个是laravel项目。

一、服务端渲染

基于javascript的应用程序的一个缺点是,浏览器从服务器接收到的页面基本上是空的。在下载并运行Javascript之前,无法构建DOM。

这意味着用户必须等待更长的时间才能看到任何东西。如果爬虫程序不能快速查看页面内容,它也会对SEO产生影响。

服务器端呈现(SSR)通过在服务器上呈现应用程序来克服这个问题,以便客户端在加载页面时(甚至在Javascript运行之前)接收完整的DOM内容。

而不是浏览器从服务器接收这个:

<head> ... </head>
<body>
<div id="app">
  <!--This is empty, Javascript will populate it later-->
</app>
</body>

使用SSR,它接收一个完整的内容页面:

<head> ... </head>
<body>
<div id="app">
  <div class="container">
    <h1>Your Server-Side Rendered App</h1>
    <div class="component-1">
      <p>Hello World</p>
      <!--etc etc. This was all rendered on the server-->
</app>
</body>

服务器端渲染缺点

  • 你的应用程序需要在服务器上可执行,所以你需要设计你的代码是“通用的”,也就是说,它可以在浏览器和节点服务器上工作。

  • 您的应用程序将运行在每一个请求到服务器,添加一个传统的负载和缓慢的响应。缓存可以部分缓解这种情况。

  • 你只能用Node.js做SSR。如果您的主后端是Laravel、Django等,那么您必须在主后端运行一个节点服务器来处理SSR。

二、预渲染

还有另一种方法可以解决空页问题:预渲染。使用这种方法,您可以在部署应用程序之前运行应用程序,捕获页面输出并用捕获的输出替换HTML文件。

它与SSR的概念基本相同,只是它是在开发环境中预先部署的,而不是在活动服务器中。

预渲染通常使用PhantomJS这样的无头浏览器来执行,并且可以与Webpack、Gulp等一起集成到构建流中。

预渲染的优点

  • 没有额外的服务器负载,因此比SSR更快更便宜

  • 更简单的生产设置和更简单的应用程序代码,因此更不容易出错

  • 不需要Node.js生产服务器

预渲染的缺点

  • 对于显示不断变化的数据的页面(例如表),不能很好地工作。

  • 不适用于具有特定用户内容的页面,例如包含用户个人信息的帐户页面。然而,无论如何,这些类型的页面对于预呈现都不那么重要;这是我们主要的,经常使用的页面,我们想要提供快速。

  • 你需要在应用程序中单独预渲染每条路线。

对照表

 仅客户端渲染服务端渲染预渲染
生产服务器Any/noneNode.js onlyAny/none
额外的服务器负载NoYesNo
个性化用户数据?N/AYesNo

三、Vue.js预渲染示例

让我们做一个简单的例子来预渲染一个vue.js应用程序,一次在node.js环境中,一次在laravel环境中。

在这些示例中,我们将使用webpack和pre render spa插件来执行预渲染。

1、Vue和Node

第1步:项目安装

我们将使用vue-cli和webpack-simple模板。

$ vue init webpack-simple vue-node-pr-test
$ cd vue-node-pr-test
$ npm install

我们还需要另外三个模块,后面还有解释。

$ npm install --save-dev http-server html-webpack-plugin prerender-spa-plugin

第2步:在Webpack构建中包含index.html

Webpack -simple模板在Webpack构建输出中不包含index.html文件。然而,当我们预渲染应用程序时,我们需要覆盖我们的索引。因此,让我们将它添加到输出中,以免破坏原始的。

在我们的Webpack .config.js文件中使用html-webpack-plugin将文件包含在Webpack构建中:

var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports.plugins.push(
  new HtmlWebpackPlugin({
    template: './index.html',
    inject: false
  }),
);

现在我们改变了我们的Webpack公共路径,因为index.html现在和其他静态资产在同一个文件夹中:

output: {
  path: path.resolve(__dirname, './dist'),
  filename: 'build.js',
  publicPath: '/', // was originally 'dist'
},

由于路径的变化,我们还需要将index.html中的<script src="/dist/build.js"></script>更改为<script src=“/build.js”></script>。

第3步:测试Webpack生成版本

现在我们建造:

$ npm run build

我们的dist文件夹应该是这样的:

- dist
-- build.js
-- index.html
-- logo.png

如果我们检查dist/index.html,它会是这样的:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>vue-node-pr-test</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/javascript" src="/build.js"></script>
  </body>
</html>

现在我们可以使用http-server并从dist文件夹中提供应用程序。默认情况下,它将运行在localhost:8080:

$ ./node_modules/.bin/http-server ./dist

第4步:预渲染应用程序

现在我们的index.html文件在Webpack构建中,我们可以使用预呈现的HTML更新它。

首先,我们需要在webpack配置中添加prerender-spa-plugin。确保它在html-webpack-plugin之后。

var PrerenderSpaPlugin = require('prerender-spa-plugin');

module.exports.plugins.push(
  new PrerenderSpaPlugin(
    path.join(__dirname, './dist'),
    [ '/' ]
  )
);

PrerenderSpaPlugin的第一个参数是index.html文件的位置,第二个参数是应用程序中的路由列表。在这个例子中,我们只有一条路径。

现在我们再次建造:

$ npm run build

我们的构建将比以前花费更长的时间,因为预渲染插件正在做的事情:

  1. 它创建一个Phantom JS实例并运行应用程序

  2. 获取DOM的快照

  3. 将快照输出到生成文件夹中的HTML文件

它会对每条路径重复这个过程,所以如果你有很多页面,构建应用程序可能需要相当长的时间。

在建立后,我们的dist/index.html现在应该包括所有预渲染的HTML:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>prerender-test</title>
  <style type="text/css">#app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    margin-top: 60px
  }

  h1, h2 {
    font-weight: 400
  }

  ul {
    list-style-type: none;
    padding: 0
  }

  li {
    display: inline-block;
    margin: 0 10px
  }

  a {
    color: #42b983
  }</style>
</head>
<body>
<div id="app"><img src="/logo.png?82b9c7a5a3f405032b1db71a25f67021">
  <h1></h1>
  <h2>Essential Links</h2>
  <ul>
    <li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
    <li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
    <li><a href="https://gitter.im/vuejs/vue" target="_blank">Gitter Chat</a></li>
    <li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
  </ul>
  <h2>Ecosystem</h2>
  <ul>
    <li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
    <li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
    <li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
    <li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
  </ul>
</div>
<script type="text/javascript" src="/build.js"></script>

</body>
</html>

2、Vue 和 Laravel

如果您跳过了Vue和Node示例,我建议您先回去阅读它,因为它包含了对任何常见步骤的更全面的解释。

第1步:项目安装

首先,我们将设置一个新的Laravel项目。

$ laravel new vue-laravel-pr-test
$ cd vue-laravel-pr-test
$ npm install

我们还将增加两个我们需要的NPM模块:

$ npm install --save-dev html-webpack-plugin prerender-spa-plugin

第2步:提供一个普通的HTML文件

默认情况下,Laravel在根URL处提供Blade模板文件。 为了使示例简单,我们将使用我们将在resources / views / index.html创建的以下纯HTML文件替换它

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Laravel</title>
    <link rel="stylesheet" href="/css/app.css">
<body>
<div id="app">
  <example></example>
</div>
<script type="text/javascript" src="/js/app.js"></script>
</body>
</html>

现在,我们需要在根路径上提供该文件,而不是刀片服务器模板。将route /web.php更改为:

Route::get('/', function () {
  return File::get(public_path() . '/index.html');
});

这实际上指向我们的build文件夹,我们很快就会生成它。

第3步:将HTML文件添加到构建中

像在节点示例中一样,我们希望在Webpack构建中包含index.html,以便稍后使用预呈现的HTML覆盖它。

我们需要做一些Webpack配置。在本例中,我使用的是Laravel 5.4,它使用的是Laravel Mix。Mix没有提供本地webpack配置文件,因为它使用自己的默认文件,所以让我们从laravel-mix模块复制一个配置文件:

$ cp ./node_modules/laravel-mix/setup/webpack.config.js .

我们还需要让我们的NPM生产脚本指向这个配置文件,因此编辑包。json,并将生产脚本更改为:

cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js 
--progress --hide-modules --config=webpack.config.js

现在我们将html-webpack-plugin添加到webpack.config.js文件中。把这个添加到文件的底部上面的混合定型部分:

var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports.plugins.push(
  new HtmlWebpackPlugin({
    template: Mix.Paths.root('resources/views/index.html'),
    inject: false
  });
);

第4步:测试Weback生成版本

现在让我们为生产和服务:

$ npm run production
$ php artisan serve

不过,在运行应用程序时,浏览器中可能会出现错误,因为我们从未为window.Laravel.csrfToken设置值。对于这个简单的例子,注释掉会更快,所以像这样修改resources/assets/js/bootsta .js:

window.axios.defaults.headers.common = {
  'X-Requested-With': 'XMLHttpRequest'
  // 'X-CSRF-TOKEN': window.Laravel.csrfToken;
};

第5步:预渲染应用程序

我们现在需要在webpack配置中使用prerender spa插件来执行预渲染。确保它在HTML网页包插件之后。

var PrerenderSpaPlugin = require('prerender-spa-plugin');

module.exports.plugins.push(
  new PrerenderSpaPlugin(
    Mix.output().path,
    [ '/' ]
  )
);

现在我们可以做一个生产构建:

$ npm run production

如果您选中build文件夹,dist/index.html现在应该如下所示,并使用预渲染HTML完成:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Laravel</title>
    <link rel="stylesheet" href="/css/app.css">
</head>
<body>
<div id="app">
    <div>
        <div>
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div>Example Component</div>
                    <div>
                        I'm an example component!
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="/js/app.js"></script>
</body>
</html>

英文原文地址:https://vuejsdevelopers.com/2017/04/01/vue-js-prerendering-node-laravel/

更多相关知识,请查阅 web前端学习 !!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预渲染vue.js应用程序(使用node或laravel) 的相关文章

  • mavlink协议从入门到放弃(一)

    mavlink协议从入门到放弃 xff08 一 xff09 什么是MAVLINK协议网站和参考资料MAVLINK简介 MAVLINK协议包结构协议结构mavlink协议解析 最近比较忙 xff0c 搞了个项目用到了mavlink协议 xff
  • VSCode如何上传代码到git

    VSCode新建分支方式 先看一下结构 这里是一个改动后上传git时的目录 xff1a 修改代码放入暂更改区 结果如下图 此时 xff1a 更改 下面修改的内容已经移到了 暂存的更改 下面 代码Commit 代码推送到远程分支 注意 xff
  • C++中运算符重载需要遵循的规则

    一 C 43 43 中运算符重载需要遵循的规则 1 并不是所有的运算符都可以重载 能够重载的运算符包括 xff1a 43 amp 61 lt gt 43 61 61 61 61 61 61 amp 61 61 lt lt gt gt lt
  • novnc+vncserver访问docker容器桌面

    https blog csdn net u012829611 article details 72576493 utm medium 61 distribute pc relevant t0 none task blog BlogComme
  • Apache阶段二-

    一 Apache 主要配置文件注释 Apache的主配置文件 xff1a etc httpd conf httpd conf 默认站点主目录 xff1a var www html Apache服务器的配置信息全部存储在主配置文件 etc h
  • FreeRTOS基本教程零:STM32 FReeRTOS 移植流程

    一 资料准备 FreeRTOS源码下载地址 xff1a https github com FreeRTOS FreeRTOS https github com FreeRTOS FreeRTOS 我移植的是FreeRTOSv9 0 0 st
  • ROS自学实践(4):使用GAZEBO进行物理仿真

    rviz中的仿真只是视觉上的仿真 xff0c 不能称得上物理仿真 xff0c gazebo是真正意义上的三维物理仿真平台 xff0c 可以在里面创建环境等相关信息 xff0c 方便以后的建模和导航 1 向xacro模型文件中添加惯性矩阵和碰
  • ROS自学实践(5):GAZEBO建模及添加相机和激光雷达传感器并进行仿真

    在搭建完机器人小车的模型之后 xff0c 需要向其添加传感器 xff0c 以便提取传感器的数据 xff0c 进行后续的工作 一 相机 1 添加camera gazebo xacro文件 同添加机器人模型一样 xff0c 添加一个相机也需要进
  • 使用CSS禁用链接

    想要使用CSS禁用链接 xff0c 可以使用pointer events属性 xff0c 该属性设置在单击元素时页面中的元素是否必须响应 下面本篇文章就来给大家介绍一下pointer events属性 xff0c 希望对大家有所帮助 CSS
  • 使用CSS将文字显示在水平线中间

    如何使用CSS将文字显示在水平线中间 xff1f 下面本篇文章就来给大家介绍使用CSS实现文字显示在水平线中间效果的方法 xff0c 希望对大家有所帮助 CSS提供了在网页中间制作包含文字或图像的水平线以使其具有吸引力的功能 xff0c 这
  • 使用CSS使文本输入不可编辑

    在HTML中可以使用readonly属性创建不可编辑的文本输入 而在CSS的情况下 xff0c 可以使用pointer events属性使文本输入不可编辑 下面本篇文章就来给大家介绍一下 xff0c 希望对大家有所帮助 CSS pointe
  • 将数组转换为JSON数据

    如何将数组转换为JSON数据 xff1f 下面本篇就来给大家介绍一下将数组转换为JSON对象的方法 xff0c 希望对大家有所帮助 方法一 xff1a 使用Object assign Object assign 方法将枚举的所有属性的值从源
  • CSS设置链接的样式

    链接是从一个网页到另一个网页的连接 xff0c CSS可通过不同属性以各种不同方式来设置链接的样式 下面本篇文章就来给大家介绍一下CSS设置链接的样式的方法 xff0c 希望对大家有所帮助 在讨论CSS属性之前 xff0c 先了解链接的状态
  • 任务切换

    任务切换的方法 第一个方法就是借助中断来进行任务切换 xff0c 这是现代抢占式多任务的基础 在实模式下 xff0c 内存最低端1KB是中断向量表 xff0c 保存着256个中断处理过程的段地址和偏移地址 在保护模式下 xff0c 处理器不
  • 操作无法完成,因为该文件已在system中打开

    一 操作无法完成 xff0c 因为该文件已在system中打开 1 同时按下键盘上的Ctrl 43 Shift 43 ESC组合键 xff0c 打开 任务管理器 xff0c 2 切换到 性能 选项卡下 xff0c 并点击 资源管理器 xff
  • Ai智能时代即将到来,替代程序员还是相辅相成,我们拭目以待

    AI是否会替代前端程序员 xff1f 这是一个让很多人感到担忧的问题 随着AI技术的发展 xff0c 越来越多的工作被自动化 前端开发是否也会面临被取代的危机呢 xff1f 前端开发是指使用HTML CSS JavaScript等技术 xf
  • HTML使用onmouseover属性更改背景颜色

    HTML如何使用onmouseover属性更改背景颜色 xff1f 下面本篇文章就来给大家介绍一下在HTML中使用onmouseover属性更改背景颜色的方法 xff0c 希望对大家有所帮助 HTML的onmouseover属性在鼠标指针移
  • 使用CSS更改PNG图像的颜色

    给定一个图像 xff0c 如何使用CSS更改PNG图像的颜色 xff1f 下面本篇文章就来给大家使用CSS更改PNG图像颜色的方法 xff0c 希望对大家有所帮助 在CSS中使用Filter属性 xff0c 利用滤镜功能来更改png图像颜色
  • 使用CSS更改hr标签的厚度

    下面本篇文章就来给大家介绍一下使用CSS更改hr标签的厚度的方法 xff0c 希望对大家有所帮助 HTML lt hr gt 标签在 HTML 页面中创建一条水平线 xff1b 水平分隔线 xff08 horizontal rule xff
  • 使用CSS设置文本或图像的透明度

    如何使用CSS设置文本或图像的透明度 xff1f 下面本篇文章就来给大家介绍一下使用CSS设置文本或图像的透明度的方法 xff0c 希望对大家有所帮助 想要使用CSS设置文本或图像的透明度 xff0c 可以使用opacity属性来设置 op

随机推荐

  • 使用CSS垂直居中文本

    CSS的常见任务是垂直居中文本或图像 xff1b 虽然CSS2不支持垂直对齐 xff0c 但我们可以通过组合一些属性来垂直居中块 下面本篇文章就来给大家介绍一下使用CSS垂直居中文本的方法 xff0c 希望对大家有所帮助 方法一 xff1a
  • CSS删除内联块元素之间空格的方法

    如何删除内联块元素之间的空格 xff1f 下面本篇文章就来给大家介绍一下使用CSS删除内联块元素之间的空格 xff0c 希望对大家有所帮助 要想删除内联块元素之间的空格 xff0c 可以使用margin right属性 xff1b 此属性用
  • 使用CSS在元素后面添加空格

    在CSS中 xff0c 可以使用 after选择器在元素后面添加空格 xff08 34 34 xff09 after选择器用于在其他元素的内容之后多次添加相同的内容 xff1b 它在每个选定元素的内容后面插入一些内容 下面本篇文章就来给大家
  • CSS在页面加载时创建淡入效果

    下面本篇文章就来给大家介绍一下使用CSS在页面加载时创建淡入效果的方法 xff0c 希望对大家有所帮助 想要使用CSS在页面加载上创建淡入效果 xff0c 可以使用css的animation属性或transition属性在页面加载时创建淡入
  • CSS设置文本和边框(图像)阴影

    在CSS中可以使用阴影效果属性在HTML文档中添加文本和边框 xff08 图像 xff09 阴影 下面本篇文章就来给大家介绍一下CSS的阴影效果属性 xff0c CSS添加阴影效果的方法 xff0c 希望对大家有所帮助 1 添加文本阴影 在
  • 使用JavaScript清除div的内容

    JavaScript提供清除div内容的功能 xff0c 想要执行此功能有两种方法 xff1a 一种是使用innerHTML属性 xff0c 另一种是使用firstChild属性和removeChild 方法 下面本篇文章就来给大家介绍一下
  • 大话pixhawk运行Ardu:Copter启动过程

    1 xff1a 了解启动过程有什么帮助 xff1f 2 xff1a 硬件连接 3 xff1a 启动过程 amp 分析 rgbled on I2C bus 2 at 0x55 bus 100 KHz max 100 KHz init look
  • JavaScript将Set(集合)转换为Array数组

    在JavaScript中 xff0c 想要将Set xff08 集合 xff09 转换为Array数组 xff0c 可以通过以下方式实现 方法1 xff1a 使用Array from 方法 Array from 方法从对象或可迭代对象 xf
  • 使用CSS将图像进行模糊处理

    给定一个图像 xff0c 如何使用CSS将图像进行模糊处理 xff0c 转换为模糊图像 xff1f 下面本篇文章就来给大家介绍一下使用CSS模糊处理图像的方法 xff0c 希望对大家有所帮助 在CSS中 xff0c 可以使用filter属性
  • CSS设置占位符文本的对齐方式

    HTML的placeholder属性指定一个简短提示 xff0c 用于描述input字段或文本区域 xff08 textarea xff09 的预期值 xff0c 即占位符文本 短提示在用户输入值之前显示在字段中 在大多数浏览器中 xff0
  • 谈谈HTML的短语标签及其作用

    在HTML中 xff0c 短语标签是专用标签 xff0c 用于指示文本块具有结构意义 xff0c 执行与文本格式标签类似的特定操作 例如 xff0c abbr标签表示该短语包含缩写词 短语标签的一些例子有 xff1a abbr strong
  • 常见的类名id名命名参考规范

    web前端命名规范 下面是常见的命名参考规范 xff1a 主体 头部 xff1a header 内容 xff1a content container 尾部 xff1a footer 导航 xff1a nav 侧栏 xff1a sidebar
  • Vue.js开发的4个基本ES2015特性

    ES2015 又名ES6 是当前JavaScript语言的规范 如果您是JavaScript新手或者最近没有更新JavaScript知识 xff0c 那么在ES2015中有许多新特性可以使开发变得更好 更有趣 如果您是Vue开发人员 xff
  • VueJS项目的5个很棒的样板/模板

    你要开始一个重要的Vue项目吗 为了确保您从一个坚实的基础开始 xff0c 您可以使用一个模板 也称为样板 骨架 启动器或脚手架 xff0c 而不是从npm init或vue init开始 许多经验丰富的开发人员都以开源模板的形式收集了关于
  • 如何构建出色的Vue组件

    很少有人最初编写Vue组件时打算将其开源 我们大多数人开始为自己编写组件的原因 xff1a 我们有一个问题 xff0c 然后决定通过构建一个组件来解决它 有时我们发现自己想要在代码库的新位置解决相同的问题 xff0c 所以我们提取组件并对其
  • 在Vue.js中定义组件模板的7种方法

    Vue js 使用了基于 HTML 的模板语法 xff0c 允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据 所有 Vue js 的模板都是合法的 HTML xff0c 所以能被遵循规范的浏览器和 HTML 解析器解析 在Vue
  • 深入CSS,让网页开发少点“坑”

    通常我们在学习CSS的时候 xff0c 感觉语法很容易掌握 xff0c 实际应用中却碰到各式各样难以填补的 坑 xff0c 为避免大家受到同样的困惑与不解 xff0c 本文详细讲解了CSS中优先级和Stacking Context等高级特性
  • Pixhawk参数调整

    Pixhawk copter固件的默认参数是为3DR QUAD COPTER设计的 如果你想获得一个最佳的飞行表现的话 你需要对一些参数做一些调整 调整的参数主要是Extended Tuning下面的Roll和Pitch的PID xff0c
  • 用于Vue.js应用程序的4个AJAX模式

    Vue没有提供实现AJAX的正式方法 xff0c 而且有许多不同的设计模式可以有效地使用 每种方法都有其优缺点 xff0c 应该根据需求进行判断 您甚至可以同时使用多个 在本文中 xff0c 我将向您展示在Vue应用程序中实现AJAX的四个
  • 预渲染vue.js应用程序(使用node或laravel)

    服务器端渲染现在非常流行 但它也并非没有缺点 预渲染是一种替代方法 xff0c 在某些情况下甚至可能更好 下面我们来看一下如何预渲染vue js应用程序 在本文中 xff0c 我们将探讨预渲染如何与vue js一起工作 xff0c 并看两个