如何使用 Webpack 搭建前端服务端渲染 SSR

什么是前端服务端渲染 SSR

前端服务端渲染(Server-Side Rendering,SSR)指的是将前端组件在服务端进行渲染,生成 HTML 内容,然后再将其发送给浏览器端,浏览器端只需要渲染服务端返回的内容即可。相对于传统的前端渲染(Client-Side Rendering,CSR),SSR 的最大优势在于它可以减少浏览器端的内存和 CPU 占用,提升初次加载的速度,降低浏览器的网络延迟,提供更好的用户体验。

Webpack 搭建 SSR 的优势

Webpack 是一款非常强大的前端打包工具,它除了可以帮我们打包前端的 JavaScript、CSS、图片等资源之外,还可以帮助我们打包服务端端代码,实现对于前后端分离项目的整合。搭建 SSR 最大的优势在于我们可以共用前端的组件库,避免了前后端大量的代码冗余。

基础准备

在开始搭建 SSR 之前,有几个基础的要求需要完成:

  • 确保安装了 Node.js 环境。
  • 确保安装了 Webpack 和相关的依赖模块。

创建 SSR 项目目录结构

SSR 的项目结构需要和传统的前端项目有所区分,我们需要将服务端代码和前端代码分别存放在不同的目录中。下面是一个标准的 SSR 项目结构示例:

---------
  -- -------
    -- ---------
    -- ---------
  -- -------
    -- --------
    -- -------
    -- ---------
  -- ------------
  -- -----------------

其中,server/ 目录是服务端代码存放的位置,client/ 目录是前端代码(即客户端代码)存放的位置。

完成 Webpack 配置文件

首先我们需要新建一个 webpack.config.js 文件,来存放我们的 Webpack 配置。

----- ---- - ----------------

-------------- - -
  ----- -------------
  ------- -------
  ------ -
    ---- ---------------------
  --
  ------- -
    ----- -------------------- ---------------
    --------- ------------
  --
  ------- -
    ------ -
      -
        ----- --------
        ------- ---------------
        -------- ---------------
      --
      -
        ----- ---------
        ------- -------------
      --
      -
        ----- -------------------------
        ------- -------------
        -------- -
          ------ ------
          ----- ------------------------- -------------------------
        --
      --
      -
        ----- ---------------------------------
        ------- -------------
        -------- -
          ------ ------
          ----- ------------------------- -------------------------
        --
      --
    --
  --
--

在 Webpack 的配置中,我们需要指定 modeproduction,并且指定 targetnode,因为服务端运行的环境是 Node.js。entry 用于指定入口文件,这里是 server.jsoutput 用于指定打包后的文件存放位置和文件名。

module.rules 中,我们需要指定项目中使用到的 babel-loadervue-loaderurl-loader 等模块的相关配置。需要注意的是,Vue.js 项目需要借助 vue-loader 来将 vue 文件转为 JavaScript 代码。

编写服务端代码

服务端代码入口文件 server.js 主要完成以下任务:

  • 通过 express 搭建服务端的 HTTP 环境。
  • 使用 vue-server-renderer 库来渲染前端组件并返回给浏览器端。

首先需要在 server.js 文件中完成以下依赖模块的引入。

----- ------- - -------------------
----- ----------------- - -------------------------------
----- -- - --------------
----- ---- - ----------------
----- - -------------------- - - -------------------------------

接着创建一个 express 实例,并指定监听的端口号。

----- --- - ----------
----- ---- - ---------------- -- -----

然后获取打包好的 bundle 文件。

----- -------------- - ------------------------------------------------------
----- ------------ - --------------------------------

接下来,我们还需要完成一个比较常见的操作 —— 托管服务端的静态文件。这一步非常重要,因为 SSR 在服务端进行渲染,所以我们需要在服务端获取相关的资源,一般情况下就是 Vue 打包出来的 JavaScript 和 CSS 文件。

------------------ ----------------------------------- --------------------------

接下来,我们需要使用 createBundleRenderer 函数创建一个 renderer 对象,这个对象包含了渲染 Vue 多页面应用所需要的所有信息,也就是说我们可以通过这个对象来实现服务端渲染。

----- -------- - ---------------------------------- -
  ---------------- ------
  --------- ------------------------------------ ------------------------- ---------
  ---------------
---

createBundleRenderer 函数中,我们需要指定打包好的 serverBundleclientManifest 文件的位置,这样我们才能相关文件的信息。runInNewContext 用于指定是否使用新的 V8 编译器,因为使用新的 V8 编译器会导致我们无法使用 server bundle 中的 module。

最后,我们需要将所有的请求都路由到服务端渲染函数中去处理。

------------ ----- ---- -- -
  ----- ------- - - ---- ------- --
  -------------------------------- ----- ----- -- -
    -- ----- -
      -------------------
      ----------------------------- ------ --------
      -------
    -
    --------------
  ---
---

编写模板文件

模板文件 index.tamplate.html 主要是用来描述 SSR 生成的 HTML 结构,让浏览器端能够正常识别和渲染。

--------- -----
----- ----------
------
  ----- ----------------
  ---------- ------------
  ----- ---------------- ---------------------------
-------
------
  ---- ---------
    --- ------------- ---
  ------
  ------- --------------------------------------
  ------- ------------------------------------
  ------- ---------------------------------
-------
-------

在模板文件中,我们需要手动引入所有的 JavaScript 和 CSS 文件,这样浏览器端才能顺利地请求到需要的资源。

启动服务

在所有的配置文件和代码编写好之后,我们可以使用 npm run server 来启动服务端进行服务端渲染。如果一切正常的话,我们就可以看到通过服务端渲染的页面了。

这里是启动服务的命令:

---------- -
  --------- ----- -----------------
--

总结

通过 Webpack 的帮助,我们可以非常方便地将前端组件库和服务端的代码整合在一起,实现前端服务端渲染。这不仅可以提升网站的性能和用户体验,还可以大幅减少代码量,避免出现大量代码冗余。希望本篇文章对大家有所帮助,也希望大家能够在实践中更深入地理解 Webpack 和前端服务端渲染的相关知识。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6489202e48841e989476ca44


猜你喜欢

  • CSS Flexbox 实现伸缩盒子的动画效果

    CSS Flexbox 是前端开发中常用的布局方式之一,它可以一次性解决多个布局问题,例如垂直居中、自适应宽度、等高布局等。除了以上常见的应用场景,Flexbox 还可以实现伸缩盒子的动画效果,为页面...

    1 年前
  • 在 Node.js 中使用 NodeMailer 发送邮件

    随着互联网的普及,电子邮件成为了人们生活和工作中必不可少的沟通工具之一。在现代化的 Web 开发中,很多应用都需要发送邮件,例如:注册确认邮件、忘记密码邮件、活动邀请邮件等等。

    1 年前
  • React+Express 打造全栈 Web 应用

    在前端开发中,React 和 Express 是两个非常热门的技术。React 是一个前端框架,专注于构建用户界面,而 Express 是 Node.js 中的一个 Web 框架,可以用于构建后端 A...

    1 年前
  • Mongoose 中的模型方法和静态方法使用详解

    在使用 Mongoose 进行 MongoDB 数据库操作时,我们经常需要使用模型方法和静态方法。这两种方法在功能上有所不同,需要我们根据实际需求进行使用。本文将详细介绍 Mongoose 中的模型方...

    1 年前
  • Custom Elements:如何使用 Ajax 或 Fetch 请求数据并渲染内容

    什么是 Custom Elements? Custom Elements 是浏览器内置的 Web Components API 的一部分。它允许您定义自己的 HTML 元素,从而更好地组织和封装您的 ...

    1 年前
  • 使用 ES2020 的动态 import 改善应用程序的性能并减少加载时间

    使用 ES2020 的动态 import 改善应用程序的性能并减少加载时间 引言 Web 应用程序往往需要加载大量 JavaScript 模块。通常情况下,这些模块会在应用程序加载时一次性下载,导致应...

    1 年前
  • Redis 的发布订阅模式及应用场景

    概述 Redis 是一个基于内存的键值数据库,支持多种数据结构操作,且性能优异。Redis 的发布订阅模式是 Redis 中一种十分有用的特性,它能够使开发者创建一个发布者和多个订阅者之间的通信渠道,...

    1 年前
  • 初学者指南:使用 Web Components 构建 App

    Web Components 是一种新的 Web 技术,它可以让开发人员更容易地创建可重用的组件。这些组件可以轻松地跨应用程序重用,并且具有强大的自定义性和可扩展性。

    1 年前
  • 使用 Fastify 和 Elasticsearch 构建搜索引擎

    使用 Fastify 和 Elasticsearch 构建搜索引擎 搜索引擎是当今互联网最重要的技术之一,它能够帮助用户快速准确地找到自己需要的信息。因此,一款高效的搜索引擎是每个网站必须要有的。

    1 年前
  • MongoDB 如何实现文档中数组的遍历?

    MongoDB 是一款非关系型数据库,以文档(Document)为单位存储数据。而文档中经常会包含数组(Array)类型的数据。那么在进行文档查询时,如何遍历这些数组呢?本文将介绍 MongoDB 中...

    1 年前
  • 如何使用 Webpack 优化 SPA 的首屏渲染速度

    当我们开发单页应用(SPA)时,一个主要的性能问题是首屏渲染速度。Webpack 作为现代前端开发里最流行的构建工具之一,可以帮助我们优化 SPA 的首屏渲染速度。

    1 年前
  • Angular 中如何使用 ViewChild 获取 DOM 元素

    当我们在编写 Angular 应用程序时,经常需要获取 DOM 元素,以便我们可以对其进行操作。 在 Angular 中,可以使用 ViewChild 来获取 DOM 元素的引用。

    1 年前
  • Express.js 如何实现文件下载功能

    在前端开发中,我们经常需要实现文件下载功能,例如下载用户上传的图片、用户生成的文件等。使用 Express.js 可以非常方便地实现文件下载功能。 本文将介绍如何使用 Express.js 实现文件下...

    1 年前
  • Vue 高阶组件 —— 混合

    Vue 是一款流行的 JavaScript 前端框架,它提供了许多重要的概念和工具,使得前端开发变得更加简单和灵活。其中一个关键的概念是组件化编程,它使得我们可以将整个前端应用分成独立的组件,这些组件...

    1 年前
  • React SPA 应用中 WebSocket 实时通讯的实现

    前言 在现代应用程序中,实时通讯已经成为了一种必不可少的功能。无论是在线聊天、多人协作编辑还是消息推送,都需要实时通讯来保证用户体验的流畅性和实时性。而其中 WebSocket 协议是实时通讯的一种重...

    1 年前
  • 使用 Serverless 框架部署 RocketChat

    简介 随着即时通讯的发展,越来越多的企业开始将即时通讯功能集成到自己的商业产品中。RocketChat 是一款优秀的开源聊天系统,不但拥有多种强大的功能,而且还能够自由定制。

    1 年前
  • Android APP 的 Material Design 之手势操作

    随着 Material Design 的兴起,越来越多的 Android APP 开发者开始注重用户体验的提升。而手势操作无疑是其中一个重要的方面。在本文中,我们将探讨如何在 Android APP ...

    1 年前
  • Server-Sent Events 实现 HTML 文件上传进度条

    在前端开发中,文件上传是个非常常见的需求,但是上传过程通常是一个比较漫长而又无趣的等待过程。为了提供更好的用户体验,我们可以使用 Server-Sent Events 实现一个实时的上传进度条,在上传...

    1 年前
  • 防御 Jest 引用——防止生产代码引用 Jest

    Jest 是一个 JavaScript 的测试框架,它提供了丰富的 API,以及方便的测试和测试覆盖结果。但是,在生产代码中不应该使用 Jest,因为 Jest 中使用了许多只适用于测试的功能和方法。

    1 年前
  • PM2 如何实现 Node.js 应用的自动扩展

    在现代 Web 应用开发中,Node.js 已经成为前端开发工作不可或缺的技能。然而,随着应用规模不断扩大和用户量不断增加,单个 Node.js 应用所能处理的并发量和并行任务数量也会面临挑战。

    1 年前

相关推荐

    暂无文章