Vue.js+Express 实战:如何构建服务端渲染的 SPA 应用?

前言

在前端开发中,SPA(Single Page Application)应用已经成为了主流。然而,SPA 应用也存在一些问题,比如 SEO 不友好、首屏加载慢等等。针对这些问题,服务端渲染(SSR)成为了一个不错的解决方案。本文将介绍如何使用 Vue.js 和 Express 框架构建服务端渲染的 SPA 应用。

准备工作

在开始之前,我们需要安装一些必要的工具和依赖。

安装 Node.js

首先,我们需要安装 Node.js。Node.js 可以在官网(https://nodejs.org)上下载安装包进行安装。安装完成后,我们可以在命令行中输入以下命令来检查是否安装成功:

---- --

如果输出了 Node.js 的版本号,则说明安装成功。

创建项目

接下来,我们需要创建一个项目。我们可以使用 Vue CLI 来创建一个基于 Vue.js 的项目。在命令行中输入以下命令来安装 Vue CLI:

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

安装完成后,我们可以输入以下命令来创建一个基于 webpack 模板的项目:

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

其中,myproject 是项目的名称,可以根据实际情况进行修改。

安装依赖

创建完项目后,我们需要安装一些依赖。在项目的根目录下,输入以下命令来安装依赖:

--- -------

配置服务端渲染

在项目中,我们需要配置服务端渲染。首先,我们需要安装一些依赖:

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

其中,vue-server-renderer 是 Vue.js 提供的服务端渲染模块,express 是一个 Node.js 的 Web 框架,compression 可以用来压缩 HTTP 响应。

接下来,我们需要在项目的根目录下创建一个 server.js 文件,用来配置服务端渲染。在 server.js 中,我们需要引入一些模块:

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

然后,我们需要创建一个 Express 应用程序:

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

接着,我们需要配置静态文件目录:

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

这里,我们将静态文件目录设置为 dist 目录,即打包后的文件所在目录。这样,我们就可以在浏览器中访问到打包后的文件。

接下来,我们需要添加一个路由处理器,用来处理所有的请求:

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

这里,我们使用了 * 通配符,表示匹配所有的请求。我们将请求的 URL 存储在 context 对象中,然后使用 vue-server-renderer 的 renderToString 方法将 Vue.js 组件渲染成 HTML 字符串。最后,我们将渲染出来的 HTML 字符串插入到 index.html 中,并将其返回给浏览器。

最后,我们需要启动 Express 应用程序:

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

这里,我们将应用程序监听在本地的 3000 端口上。

构建打包

在配置完服务端渲染后,我们需要进行打包。在命令行中输入以下命令来进行打包:

--- --- -----

打包完成后,我们可以在 dist 目录下找到打包后的文件。

集成服务端渲染

打包完成后,我们需要将服务端渲染集成到项目中。在 src 目录下,我们需要创建一个 entry-server.js 文件和一个 entry-client.js 文件。

在 entry-server.js 中,我们需要导出一个函数,用来创建一个 Vue.js 实例:

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

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

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

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

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

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

这里,我们使用了 createApp 函数创建了一个 Vue.js 实例。然后,我们使用 router.push 方法将 URL 推入路由器中,并使用 router.onReady 方法等待路由器准备就绪。最后,我们使用 Promise.all 方法来预加载所有匹配的组件的数据,并将数据保存在 context.state 中。

在 entry-client.js 中,我们需要使用 createApp 函数创建一个 Vue.js 实例:

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

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

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

这里,我们使用 createApp 函数创建了一个 Vue.js 实例。然后,我们使用 router.onReady 方法等待路由器准备就绪,并使用 app.$mount 方法将应用程序挂载到 DOM 中。

最后,我们需要修改 index.html 文件,将应用程序的根元素修改为一个空 div:

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

总结

通过本文的介绍,我们学习了如何使用 Vue.js 和 Express 框架构建服务端渲染的 SPA 应用。服务端渲染可以解决 SPA 应用的一些问题,比如 SEO 不友好、首屏加载慢等等。希望本文对你有所帮助。

示例代码

server.js:

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

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

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

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

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

entry-server.js:

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

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

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

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

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

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

entry-client.js:

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

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

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

index.html:

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

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65dd91001886fbafa4ae7ba4