node和laravel项目中预渲染vue.js应用程序

青灯夜游

青灯夜游

2020-09-27

3271人浏览

转载

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

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

相关教程推荐:node js教程 、vue.js教程 、laravel教程

一、服务端渲染

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

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

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

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

 ... 

<div>
  <!--This is empty, Javascript will populate it later-->

<p>使用SSR,它接收一个完整的内容页面:</p>
<pre class="brush:js;toolbar:false"> ... 

<div>
  <div>
    <h1>Your Server-Side Rendered App</h1>
    <div>
      <p>Hello World</p>
      <!--etc etc. This was all rendered on the server-->

<p><span style="font-size: 14px;"><strong>服务器端渲染缺点</strong></span></p>
<ul style="list-style-type: disc;">
<li><p>你的应用程序需要在服务器上可执行,所以你需要设计你的代码是“通用的”,也就是说,它可以在浏览器和节点服务器上工作。<span style="font-size: 16px;"></span><br></p></li>
<li><p>您的应用程序将运行在每一个请求到服务器,添加一个传统的负载和缓慢的响应。缓存可以部分缓解这种情况。</p></li>
<li><p>你只能用Node.js做SSR。如果您的主后端是Laravel、Django等,那么您必须在主后端运行一个节点服务器来处理SSR。</p></li>
</ul>
<p><span style="font-size: 18px;"><strong>二、预渲染</strong></span></p>
<p><span style="font-size: 16px;"></span></p>
<p>还有另一种方法可以解决空页问题:预渲染。使用这种方法,您可以在部署应用程序之前运行应用程序,捕获页面输出并用捕获的输出替换HTML文件。<span style="font-size: 16px;"></span><br></p>
<p>它与SSR的概念基本相同,只是它是在开发环境中预先部署的,而不是在活动服务器中。</p>
<p>预渲染通常使用PhantomJS这样的无头浏览器来执行,并且可以与Webpack、Gulp等一起集成到构建流中。</p>
<p><span style="font-size: 14px;"><strong>预渲染的优点</strong></span><br></p>
<ul style="list-style-type: disc;">
<li><p><span style="font-size: 16px;"><span style="font-size: 14px;">没有额外的服务器负载,因此比SSR更快更便宜</span><strong><br></strong></span></p></li>
<li><p><span style="font-size: 14px;">更简单的生产设置和更简单的应用程序代码,因此更不容易出错</span></p></li>
<li><p><span style="font-size: 14px;">不需要Node.js生产服务器</span></p></li>
</ul>
<p><span style="font-size: 14px;"><strong>预渲染的缺点</strong></span><span style="font-size: 16px;"><br></span></p>
<ul style="list-style-type: disc;">
<li><p><span style="font-size: 14px;">对于显示不断变化的数据的页面(例如表),不能很好地工作。</span></p></li>
<li><p><span style="font-size: 14px;">不适用于具有特定用户内容的页面,例如包含用户个人信息的帐户页面。然而,无论如何,这些类型的页面对于预呈现都不那么重要;这是我们主要的,经常使用的页面,我们想要提供快速。</span></p></li>
<li><p><span style="font-size: 14px;">你需要在应用程序中单独预渲染每条路线。</span></p></li>
</ul>
<p><strong><span style="font-size: 14px;">对照表</span></strong></p>
<p><span style="font-size: 14px;"></span></p>
<table width="828" style="width: 808px;"><tbody>
<tr class="firstRow">
<th style="border-color: rgb(221, 221, 221);" width="255"><br></th>
<th style="border-color: rgb(221, 221, 221);" width="202">仅客户端渲染</th>
<th style="border-color: rgb(221, 221, 221);" width="202">服务端渲染</th>
<th style="border-color: rgb(221, 221, 221);" width="168">预渲染</th>
</tr>
<tr>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="255">生产服务器</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="202">Any/none</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="202">Node.js only</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="168">Any/none</td>
</tr>
<tr>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="255">额外的服务器负载</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="202">No</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="202">Yes</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="168">No</td>
</tr>
<tr>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="255">个性化用户数据?</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="202">N/A</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="202">Yes</td>
<td valign="top" style="border-color: rgb(221, 221, 221);" width="168">No</td>
</tr>
</tbody></table>
<p><span style="font-size: 14px;"></span><span style="font-size: 18px;"><strong>三、Vue.js预渲染示例</strong></span></p>
<p><span style="font-size: 16px;"></span></p>
<p>让我们做一个简单的例子来预渲染一个vue.js应用程序,一次在node.js环境中,一次在laravel环境中。</p>
<p>在这些示例中,我们将使用webpack和pre render spa插件来执行预渲染。</p>
<p data-v-835b6d5c=""><span style="font-size: 16px;"><strong>1、Vue和Node</strong></span></p>
<p data-v-835b6d5c="">第1步:项目安装</p>
<p>我们将使用vue-cli和webpack-simple模板。</p>
<pre class="brush:js;toolbar:false">$ 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现在和其他静态资产在同一个文件夹中:

X-Node企业快速建站1.0.6.0801
X-Node企业快速建站1.0.6.0801

特色介绍: 1、ASP+XML+XSLT开发,代码、界面、样式全分离,可快速开发 2、支持语言包,支持多模板,ASP文件中无任何HTML or 中文 3、无限级分类,无限级菜单,自由排序 4、自定义版头(用于不规则页面) 5、自动查找无用的上传文件与空目录,并有回收站,可删除、还原、永久删除 6、增强的Cache管理,可单独管理单个Cache 7、以内存和XML做为Cache,兼顾性能与消耗 8、

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

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

第3步:测试Webpack生成版本

现在我们建造:

$ npm run build

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

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

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

nbsp;html>

  
    <meta>
    <title>vue-node-pr-test</title>
  
  
    <div></div>
    <script></script>
  

现在我们可以使用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:

nbsp;html>


  <meta>
  <title>prerender-test</title>
  <style>#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><div>@@##@@
  <h1></h1>
  <h2>Essential Links</h2>
  <ul>
    <li><a>Core Docs</a></li>
    <li><a>Forum</a></li>
    <li><a>Gitter Chat</a></li>
    <li><a>Twitter</a></li>
  </ul>
  <h2>Ecosystem</h2>
  <ul>
    <li><a>vue-router</a></li>
    <li><a>vuex</a></li>
    <li><a>vue-loader</a></li>
    <li><a>awesome-vue</a></li>
  </ul>
</div>
<script></script>

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文件替换它

nbsp;html>


    <meta>
    <title>Laravel</title>
    <link><div>
  <example></example>
</div>
<script></script>

现在,我们需要在根路径上提供该文件,而不是刀片服务器模板。将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完成:

nbsp;html>


    <meta>
    <title>Laravel</title>
    <link><div>
    <div>
        <div>
            <div>
                <div>
                    <div>Example Component</div>
                    <div>
                        I'm an example component!
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script></script>

相关推荐:

2020年前端vue面试题大汇总(附答案)

vue教程推荐:2020最新的5个vue.js视频教程精选

更多编程相关知识,请访问:编程入门!!

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

node laravel vue.js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

作者最新文章

热门AI工具

更多

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

672

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

649

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

1113

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

1589

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

1941

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

1265

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

2764

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1087

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

91

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 9.6万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 25.8万人学习

最新文章

更多