ホームページ ウェブフロントエンド Vue.js ノードおよびlaravelプロジェクトの事前レンダリングされたvue.jsアプリケーション

ノードおよびlaravelプロジェクトの事前レンダリングされたvue.jsアプリケーション

Sep 27, 2020 pm 02:04 PM
laravel node vue.js

ノードおよびlaravelプロジェクトの事前レンダリングされたvue.jsアプリケーション

サーバーサイド レンダリングは現在非常に人気があります。しかし、欠点がないわけではありません。プリレンダリングは代替手段であり、場合によってはその方が良い場合もあります。 vue.js アプリケーションをプリレンダリングする方法を見てみましょう。

この記事では、vue.js でプリレンダリングがどのように機能するかを調査し、2 つの例を見ていきます。1 つは node.js プロジェクト、もう 1 つは laravel プロジェクトです。

推奨される関連チュートリアル: node js チュートリアルvue.js チュートリアルlaravel チュートリアル

##1. サーバー側レンダリング

JavaScript ベースのアプリケーションの欠点の 1 つは、ブラウザーがサーバーから受け取るページが基本的に空であることです。 DOM は、JavaScript がダウンロードされて実行されるまで構築できません。

これは、ユーザーが何も表示されるまでに長く待たなければならないことを意味します。また、クローラーがページのコンテンツをすぐに表示できない場合、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>
ログイン後にコピー

サーバー側レンダリングの欠点

  • アプリケーションはサーバー上で実行可能である必要があるため、コードを「ユニバーサル」になるように設計する必要があります。つまり、コードを参照できるようにする必要があります。サーバーとノードサーバー。


  • アプリケーションはサーバーへのすべてのリクエストで実行されるため、従来のような負荷がかかり、応答が遅くなります。キャッシュを使用すると、この状況を部分的に軽減できます。

  • SSR は Node.js でのみ実行できます。メイン バックエンドが Laravel、Django などの場合、SSR を処理するためにメイン バックエンドでノード サーバーを実行する必要があります。

2. プリレンダリング

もう 1 つあります。空のページの問題を解決する 1 つの方法は、プリレンダリングです。このアプローチを使用すると、アプリケーションをデプロイする前に実行し、ページ出力をキャプチャして、HTML ファイルをキャプチャされた出力で置き換えます。


これは基本的に SSR と同じ概念ですが、ライブサーバーではなく開発環境に事前にデプロイされる点が異なります。

プリレンダリングは通常、PhantomJS などのヘッドレス ブラウザを使用して実行され、Webpack、Gulp などを使用してビルド フローに統合できます。

プリレンダリングの利点

  • 追加のサーバー負荷がないため、 SSR よりも高速かつ安価です

  • 実稼働環境のセットアップとアプリケーション コードが単純であるため、エラーが発生しにくくなります

  • Node.js 運用サーバーは必要ありません

プリレンダリングの欠点

  • #データ (表など) の変化を表示するページには適していません。

  • #ユーザーの個人情報を含むアカウント ページなど、特定のユーザー コンテンツを含むページには適用されません。ただし、これらのタイプのページは、事前レンダリングがそれほど重要ではありません。これらは、メインで頻繁に使用されるページであり、迅速に提供したいと考えています。

  • #アプリケーションで各ルートを個別に事前レンダリングする必要があります。 #####################チャート######################クライアント側レンダリングのみサーバー側レンダリング本番サーバー追加サーバー負荷 ユーザー データをパーソナライズしますか?

    三、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(&#39;html-webpack-plugin&#39;);
    
    module.exports.plugins.push(
      new HtmlWebpackPlugin({
        template: &#39;./index.html&#39;,
        inject: false
      }),
    );
    ログイン後にコピー

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

    output: {
      path: path.resolve(__dirname, &#39;./dist&#39;),
      filename: &#39;build.js&#39;,
      publicPath: &#39;/&#39;, // was originally &#39;dist&#39;
    },
    ログイン後にコピー

    由于路径的变化,我们还需要将index.html中的更改为

    第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(&#39;prerender-spa-plugin&#39;);
    
    module.exports.plugins.push(
      new PrerenderSpaPlugin(
        path.join(__dirname, &#39;./dist&#39;),
        [ &#39;/&#39; ]
      )
    );
    ログイン後にコピー

    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(&#39;/&#39;, function () {
      return File::get(public_path() . &#39;/index.html&#39;);
    });
    ログイン後にコピー

    这实际上指向我们的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(&#39;html-webpack-plugin&#39;);
    
    module.exports.plugins.push(
      new HtmlWebpackPlugin({
        template: Mix.Paths.root(&#39;resources/views/index.html&#39;),
        inject: false
      });
    );
    ログイン後にコピー

    第4步:测试Weback生成版本

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

    $ npm run production
    $ php artisan serve
    ログイン後にコピー

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

    window.axios.defaults.headers.common = {
      &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;
      // &#39;X-CSRF-TOKEN&#39;: window.Laravel.csrfToken;
    };
    ログイン後にコピー

    第5步:预渲染应用程序

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

    var PrerenderSpaPlugin = require(&#39;prerender-spa-plugin&#39;);
    
    module.exports.plugins.push(
      new PrerenderSpaPlugin(
        Mix.output().path,
        [ &#39;/&#39; ]
      )
    );
    ログイン後にコピー

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

    $ 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&#39;m an example component!
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script src="/js/app.js"></script>
    </body>
    </html>
    ログイン後にコピー

    相关推荐:

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

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

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

    以上がノードおよびlaravelプロジェクトの事前レンダリングされたvue.jsアプリケーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? Mar 05, 2025 pm 05:57 PM

    ピン張りのノードの詳細な説明とインストールガイドこの記事では、ピネットワークのエコシステムを詳細に紹介します - PIノードは、ピン系生態系における重要な役割であり、設置と構成の完全な手順を提供します。 Pinetworkブロックチェーンテストネットワークの発売後、PIノードは多くの先駆者の重要な部分になり、テストに積極的に参加し、今後のメインネットワークリリースの準備をしています。まだピン張りのものがわからない場合は、ピコインとは何かを参照してください。リストの価格はいくらですか? PIの使用、マイニング、セキュリティ分析。パインワークとは何ですか?ピン競技プロジェクトは2019年に開始され、独占的な暗号通貨PIコインを所有しています。このプロジェクトは、誰もが参加できるものを作成することを目指しています

    Laravel と CodeIgniter の最新バージョンの比較 Laravel と CodeIgniter の最新バージョンの比較 Jun 05, 2024 pm 05:29 PM

    Laravel 9 と CodeIgniter 4 の最新バージョンでは、更新された機能と改善が提供されます。 Laravel9はMVCアーキテクチャを採用しており、データベース移行、認証、テンプレートエンジンなどの機能を提供します。 CodeIgniter4 は、HMVC アーキテクチャを使用してルーティング、ORM、およびキャッシュを提供します。パフォーマンスの面では、Laravel9 のサービスプロバイダーベースの設計パターンと CodeIgniter4 の軽量フレームワークにより、優れたパフォーマンスが得られます。実際のアプリケーションでは、Laravel9 は柔軟性と強力な機能を必要とする複雑なプロジェクトに適しており、CodeIgniter4 は迅速な開発や小規模なアプリケーションに適しています。

    Laravel と CodeIgniter ではどちらが初心者に優しいでしょうか? Laravel と CodeIgniter ではどちらが初心者に優しいでしょうか? Jun 05, 2024 pm 07:50 PM

    初心者にとって、CodeIgniter は学習曲線が緩やかで機能は少ないですが、基本的なニーズはカバーしています。 Laravel は幅広い機能セットを提供しますが、学習曲線はわずかに急になります。パフォーマンスの点では、Laravel と CodeIgniter はどちらも良好なパフォーマンスを示します。 Laravel にはより広範なドキュメントとアクティブなコミュニティ サポートがあり、CodeIgniter はよりシンプルで軽量で、強力なセキュリティ機能を備えています。ブログアプリケーションを構築する実際のケースでは、Laravel の EloquentORM を使用するとデータ操作が簡素化されますが、CodeIgniter ではより手動の構成が必要になります。

    Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 am 09:09 AM

    大規模プロジェクト用のフレームワークを選択する場合、Laravel と CodeIgniter にはそれぞれ独自の利点があります。 Laravel はエンタープライズレベルのアプリケーション向けに設計されており、モジュール設計、依存関係の注入、強力な機能セットを提供します。 CodeIgniter は、速度と使いやすさを重視した、小規模から中規模のプロジェクトに適した軽量フレームワークです。複雑な要件と多数のユーザーを伴う大規模なプロジェクトには、Laravel のパワーとスケーラビリティがより適しています。単純なプロジェクトやリソースが限られている状況では、CodeIgniter の軽量で迅速な開発機能がより理想的です。

    Laravel - アーティザンコマンド Laravel - アーティザンコマンド Aug 27, 2024 am 10:51 AM

    Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

    Laravel と CodeIgniter: 小規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 小規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 pm 05:29 PM

    小規模なプロジェクトの場合、Laravel は強力な機能とセキュリティを必要とする大規模なプロジェクトに適しています。 CodeIgniter は、軽量さと使いやすさを必要とする非常に小規模なプロジェクトに適しています。

    Laravel と CodeIgniter ではどちらのテンプレート エンジンが優れていますか? Laravel と CodeIgniter ではどちらのテンプレート エンジンが優れていますか? Jun 03, 2024 am 11:30 AM

    Laravel の Blade と CodeIgniter の Twig テンプレート エンジンを比較し、プロジェクトのニーズと個人的な好みに基づいて選択してください。Blade は MVC 構文に基づいており、適切なコード編成とテンプレートの継承を促進します。 Twig は、柔軟な構文、強力なフィルター、拡張サポート、セキュリティ サンドボックスを提供するサードパーティ ライブラリです。

    Laravel - アーティザン コンソール Laravel - アーティザン コンソール Aug 27, 2024 am 10:51 AM

    Laravel - Artisan Console - Laravel フレームワークは、コマンドラインを介した対話のための 3 つの主要なツール、つまり Artisan、Ticker、REPL を提供します。この章ではArtisanについて詳しく説明します。

    See all articles

    #プレレンダリング
    任意/なしNode.js のみ任意/なし
    NoYesNo
    N/Aはいいいえ