这是一篇教程,从创建项目到改造项目

vue-cli创建一个项目

在放你做demo的地方,创建一个项目

vue create vue-ssr

// 如果你安装了vue-cli4,选择vue2的版本,以下的改进过程是按vue2来做的

经过漫长的等待,下载好文件开始我们的改造之路

文件目录

进入vue-ssr文件夹,使用命令

vue ui

把vue-router装上

先安装几个依赖插件

// 安不上用cnpm,yarn,npx

npm i vue-server-renderer express -D

npm install webpack-node-externals lodash.merge -D

npm i cross-env -D

修改package.json文件

"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint"

}

改成

"scripts": { "build:client": "vue-cli-service build", "build:server": "cross-env WEBPACK_TARGET=node vue-cli-service build --mode server", "build": "npm run build:server && npm run build:client"

}

根目录下创建vue.config.js

// 服务器渲染的两个插件,控制server和client

const VueSSRServerPlugin = require("vue-server-renderer/server-plugin"); // 生成服务端包

const VueSSRClientPlugin = require("vue-server-renderer/client-plugin"); // 生成客户端包

const nodeExternals = require("webpack-node-externals");

const merge = require("lodash.merge");

// 环境变量:决定入口是客户端还是服务端,WEBPACK_TARGET在启动项中设置的,见package.json文件

const TARGET_NODE = process.env.WEBPACK_TARGET === "node";

const target = TARGET_NODE ? "server" : "client";

module.exports = {

css: { extract: false

},

outputDir: "./dist/" + target,

configureWebpack: () => ({ // 将 entry 指向应用程序的 server / client 文件 entry: `./src/entry-${target}.js`, // 对 bundle renderer 提供 source map 支持 devtool: "source-map", // 这允许 webpack 以 Node 适用方式处理动态导入(dynamic import), // 并且还会在编译 Vue 组件时告知 `vue-loader` 输送面向服务器代码(server-oriented code)。 target: TARGET_NODE ? "node" : "web", node: TARGET_NODE ? undefined : false, output: { // 此处配置服务器端使用node的风格构建 libraryTarget: TARGET_NODE ? "commonjs2" : undefined }, // 外置化应用程序依赖模块。可以使服务器构建速度更快,并生成较小的 bundle 文件。 externals: TARGET_NODE ? nodeExternals({ // 不要外置化 webpack 需要处理的依赖模块。 // 可以在这里添加更多的文件类型。例如,未处理 *.vue 原始文件, // 你还应该将修改 `global`(例如 polyfill)的依赖模块列入白名单(以前叫whitelist,为了避免美国的人种歧视,改成了allowlist) allowlist: [/\.css$/] }) : undefined, optimization: { splitChunks: TARGET_NODE ? false : undefined }, // 这是将服务器的整个输出构建为单个 JSON 文件的插件。 // 服务端默认文件名为 `vue-ssr-server-bundle.json` // 客户端默认文件名为 `vue-ssr-client-manifest.json` plugins: [TARGET_NODE ? new VueSSRServerPlugin() : new VueSSRClientPlugin()]

}),

chainWebpack: config => { config.module .rule("vue") .use("vue-loader") .tap(options => { merge(options, { optimizeSSR: false }); });

}

};

修改路由文件

import Vue from 'vue';

import Router from 'vue-router';

import Home from '../views/Home.vue';

import About from '../views/About.vue';

Vue.use(Router);

// 这里为什么不导出一个router实例?

// 每次用户请求都需要创建新router实例,如果用户请求多次都用一个实例会造成数据污染

export function createRouter(){ return new Router({ // 一定要history模式,因为,hash模式更改路径不会刷新,具体原因自行查询 mode: 'history', routes: [ {path: '/', name: 'Home',component: Home}, {path: '/about', name: 'About', component: About}, ] })

}

修改main.js文件

import Vue from "vue";

import App from "./App.vue";

import { createRouter } from "./router";

import store from "./store";

Vue.config.productionTip = false;

const router = createRouter();

// 这里的挂载($mount("#app"))放到entry-client.js文件里面,后面会说到

export function createApp(){ const app = new Vue({ router, store, render: (h) => h(App), }); return { app, router };

}

在src下添加entry-client.js和entry-server.js文件

entry-client.js

import {createApp} from './main.js';

const {app, router} = createApp();

router.onReady(()=>{ app.$mount("#app");

})

entry-server.js

import {createApp} from "./main.js";

// context实际上就是server/index.js里面传参,后面会说到server/index.js

export default context => { return new Promise((resolve, reject) => { const {app, router} = createApp(); router.push(context.url) router.onReady(()=>{ // 是否匹配到我们要用的组件 const matchs = router.getMatchedComponents(); if(!matchs) { return reject({code: 404}) } resolve(app); }, reject); })

}

在src下创建server/index.js

// nodejs服务器

const express = require("express");

const fs = require("fs");

// 创建express实例和vue实例

const app = express();

// 创建渲染器

const { createBundleRenderer } = require("vue-server-renderer");

const serverBundle = require("../../dist/server/vue-ssr-server-bundle.json");

const clientManifest = require("../../dist/client/vue-ssr-client-manifest.json");

// 这儿引入的文件是不同于index.html的问题,具体文件下面会讲到

const template = fs.readFileSync("../../public/index.ssr.html", "utf-8"); // 宿主模板文件

const renderer = createBundleRenderer(serverBundle, { runInNewContext: false, template, clientManifest,

});

// 中间件处理静态文件请求

app.use(express.static("../../dist/client", { index: false })); // 为false是不让它渲染成dist/client/index.html

// app.use(express.static('../dist/client'))

// 前端请求什么我都不关心,所有的路由处理交给vue

app.get("*", async (req, res) => { try { const context = { url: req.url, title: "ssr test", }; // nodejs流数据,文件太大,用renderToString会卡 const stream = renderer.renderToStream(context); let buffer = []; stream.on("data", (chunk) => { buffer.push(chunk); }); stream.on("end", () => { res.end(Buffer.concat(buffer)); }); } catch (error) { console.log(error); res.status(500).send("服务器内部错误"); }

});

app.listen(3000, () => { console.log("渲染服务器启动成功");

});

在public下面创建index.ssr.html文件

html>

Documenttitle>

head>

body>

html>

然后所有的改造完成,运行命令

// 先构建两个json文件

npm run build

再到server文件夹下运行

node index.js

// 如果显示: `渲染服务器启动成功`, 在浏览器打开 `localhost:3000` 端口,就能看到我们的页面

整完这,你再去玩儿nuxt,你感觉好多了,因为nuxt不用配路由,自己生成,连路由传参都设定好了

文章来源: segmentfault.com,作者:万年打野易大师,版权归原作者所有,如需转载,请联系作者。

原文链接:segmentfault.com/a/1190000038428675

vue项目转换服务器端渲染,vue-server-renderer实现vue项目改造服务端渲染相关推荐

  1. vue2-ssr从vue-cli搭建项目改造服务端渲染+打包上线部署

    为了完成vue+ssr,本人呕心沥血翻阅很多博主的文档,并在b站看了很多视频之后,经过个人实践,终于整理出一套完整版,无缺失,不报错的改造流程(亲测!!) 从创建=>打包=>上线部署,详细 ...

  2. Node项目部署到阿里云服务器(ECS),以Nuxt.js服务端渲染项目为例

    1.前言 最近打算业余时间搭个网站,选择的技术栈为node+mongodb+Nuxt.js(基于vue,用于创建服务端渲染 (SSR) 应用),以下不会教科书式讲解,只是提供整体思路.参考资料以及关键 ...

  3. vue服务端渲染之nuxtjs

    前言 本篇主要针对nuxtjs中的一些重要概念整理和代码实现! 在学习vue服务端渲染之前,先搞清楚几个概念: 什么是客户端渲染(CSR) 什么是服务端渲染(SSR) CSR和SSR有什么异同 客户端 ...

  4. vue服务端渲染(ssr)与普通vue的区别,ssr的基本使用

    ssr是vue的服务端渲染技术,nuxt是一个可以用来做ssr服务端渲染开发的框架. ssr是技术基础,nuxt是封装 一.什么是SSR? Vue.js 是构建客户端应用程序的框架.默认情况下,可以在 ...

  5. Nuxt --- 也来说说vue服务端渲染

    Nuxt 随着现在vue和react的流行,许多网站都做成了SPA,确实提升了用户体验,但SPA也有两个弱点,就是SEO和首屏渲染速度.为了解决单页应用的痛点,基于vue和react的服务端渲染应运而 ...

  6. Vuex 数据流管理及Vue.js 服务端渲染(SSR)

    Vuex 数据流管理及Vue.js 服务端渲染(SSR)项目见:https://github.com/smallSix6/fed-e-task-liuhuijun/tree/master/fed-e- ...

  7. React 服务端渲染方案完美的解决方案

    最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...

  8. nuxt / ssr简介以及要不要使用服务端渲染(SSR)?

    nuxt / ssr 简介 ssr 是 vue 的服务端渲染技术 nuxt 是一个可以用来做 ssr 服务端渲染 开发的框架 他们之间的关系, ssr 是技术基础, nuxt 是封装 什么是SSR? ...

  9. 服务端渲染(SSR) 通用技术解决方案

    项目背景 服务端渲染(SSR) 通用技术解决方案的诞生来源于对 360搜索百科移动端项目的一次重构实践.而当时决定重构该项目的主要原因有以下几点: 1.  技术栈陈旧,熟悉.开发以及维护成本都较高 项 ...

最新文章

  1. 删除除了指定扩展名文件其他全部删除
  2. 怎样将包含元组的列表转换为字典?
  3. 云服务器 文件 传输,云服务器文件 传输
  4. Leetcode题库234.回文链表(递归 类似双指针 c实现)
  5. cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线
  6. GIT学习笔记2--基本使用
  7. 【31】将文件间的编译依存关系降至最低
  8. java disp()_【matlab】输出显示函数 sprintf()disp()
  9. 管脚自动分配_lattice器件管脚评估与功耗评估
  10. js 使用Rsa 加密 解密
  11. 铃声文本串转二进制串的问题(midi)
  12. Python自动化模拟键盘操作
  13. 安卓逆向_2 --- Androidkiller,apktool、dex2jar、jd-gui、jadx反编译工具 的 安装、设置及使用教程...
  14. 希捷硬盘保修时间查询
  15. ARM与裸机开发教程
  16. Sleepy Kaguya (回归之战)
  17. 博客园增加Live2D看板娘教程,超级简单,一看就懂
  18. for循环次数太多的时间优化_matlab for循环过大程序运行慢解决方案
  19. 如何理解 ISO、快门、光圈、曝光这几个概念?
  20. 论文阅读——“推荐系统”

热门文章

  1. ssh和scp的使用
  2. 红米k40和红米k40pro的区别 哪个好
  3. H5游戏-面试问题知识点总结
  4. JavaScript三种注释写法
  5. iOS:注册App ID
  6. 如何移动桌面文件到计算机,怎么样把电脑桌面文件全部转移到指定文件夹
  7. nacos access log日志占用磁盘
  8. Unity编译器下载网址!!
  9. windows 工具命令 cmd
  10. 80老翁谈人生(151):老翁老眼昏花,读错了一个数量级