1、修改路由配置

// router/index.jsimport Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'Vue.use(VueRouter)// 工厂函数 每次请求返回一个Router实例
export function createRouter() {return new VueRouter({mode: 'history',base: process.env.BASE_URL,routes})
}const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About', component: () => import('../views/About.vue')}
]

2、修改vuex配置

// store/index.jsimport Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)//createStore
export function createStore() {return new Vuex.Store({state: {count: 99,},mutations: {add(state){ state.count += 1}},actions: {},modules: {}})
}

3、修改main.js

// main.jsimport Vue from 'vue'
import App from './App.vue'//引用createRouter,createStore
import { createRouter } from './router'
import { createStore } from './store'Vue.config.productionTip = false// 需要每次请求 放回一个vue实例(不用挂载app)
export function createApp(context) {const router = createRouter()const store = createStore()const app = new Vue({router,store, // 挂载context, // 用于和外的renderer交互render: h => h(App)})return {app, router}
}

4、在src录下创建服务端入口(entry-server.js)

// src/entry-server.js
// 和渲染器打交道
// 创建vue实例
import { createApp } from './main'export default context => {const { app, router } = createApp(context)return new Promise((resolve, reject) => {// 跳转首屏地址router.push(context.url)// 等待路由就绪router.onReady(() => {resolve(app)}, reject)})
}

5、在src目录下创建客户端入口文件entry-client.js

// src/entry-client.jsimport { createApp } from './main'const { app, router } = createApp()router.onReady(() => {app.$mount('#app')
})

6、webpack配置

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

npm i vue vue-server-renderer -S // 必须和vue保持同一版本

7、在项目根目录下创建vue.config.js并配置

// 两个插件分别负责打包客户端和服务端
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");// 根据传入环境变量决定入口文件和相应配置项
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',// target设置为node使webpack以Node适用的方式处理动态导入,// 并且还会在编译Vue组件时告知`vue-loader`输出面向服务器代码。target: TARGET_NODE ? "node" : "web",// 是否模拟node全局变量node: TARGET_NODE ? undefined : false,output: {// 此处使用Node风格导出模块libraryTarget: TARGET_NODE ? "commonjs2" : undefined},// https://webpack.js.org/configuration/externals/#function// https://github.com/liady/webpack-node-externals// 外置化应用程序依赖模块。可以使服务器构建速度更快,并生成较小的打包文件。externals: TARGET_NODE? nodeExternals({// 不要外置化webpack需要处理的依赖模块。// 可以在这里添加更多的文件类型。例如,未处理 *.vue 原始文件,// 还应该将修改`global`(例如polyfill)的依赖模块列入白名单whitelist: [/\.css$/]}): undefined,optimization: {splitChunks: undefined},// 这是将服务器的整个输出构建为单个 JSON 文件的插件。// 服务端默认文件名为 `vue-ssr-server-bundle.json`// 客户端默认文件名为 `vue-ssr-client-manifest.json`。plugins: [TARGET_NODE ? new VueSSRServerPlugin() : new VueSSRClientPlugin()]}),chainWebpack: config => {// cli4项目添加if (TARGET_NODE) {config.optimization.delete('splitChunks')}config.module.rule("vue").use("vue-loader").tap(options => {merge(options, {optimizeSSR: false});});}
};

8、脚本配置安装依赖

npm i cross-env -D

9、修改package.json配置

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

10、修改public目录下的index.html

<!DOCTYPE html>
<html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1.0"><!-- 1.删掉之前动态标签 --><title>{{title}}</title></head><body><!-- 2.把宿主元素变成一个注释 --><div id="app"><!--vue-ssr-outlet--></div></body>
</html>

11、新增服务器启动文件 (根目录创建文件 server/ssr.js)

// 创建一个express实例
const express = require('express')const app = express()// 获取绝对地址
const resolve = dir => require('path').resolve(__dirname, dir)// 静态文件服务
// 开发dist/client目录,关闭默认的index页面打开功能
app.use(express.static(resolve('../dist/client'), {index: false}))// 创建渲染器
const { createBundleRenderer } = require('vue-server-renderer')
// 参数1:服务端bundle
const bundle = resolve('../dist/server/vue-ssr-server-bundle.json')
const renderer = createBundleRenderer(bundle, {runInNewContext: false, // https://ssr.vuejs.org/zh/api/#runinnewcontexttemplate: require('fs').readFileSync(resolve("../public/index.html"), "utf-8"), // 宿主文件clientManifest: require(resolve("../dist/client/vue-ssr-client-manifest.json")) // 客户端清单
})// 只做一个件事,渲染
app.get('*', async (req, res) => {try {const context = {
title:'',url: req.url}// 渲染: 得到html字符串const html = await renderer.renderToString(context)// 发送回前端res.send(html)} catch (error) {res.status(500).send('服务器内部错误')}})// 监听端口
app.listen(3000, () => console.log('服务器开启'))

12、打包文件

npm run build

//会创建一个dist文件目录,名下包括client和server两个文件件

13、启动服务器node

node ./server/ssr.js

14、注意事项

1)、vue与vue-server-renderer版本一致

2)、报错:Error: [webpack-node-externals] : Option 'whitelist' is not supported. Did you mean 'allowlist'   //修改vue.config.js(whitelist 改成 allowlist)

3)、在beforeCreate,created除外的生命周期以及全局的执行环境中调用特定的api前需要判断执行环境

4)、每次修改需要重新打包,重启服务器

5)、其他注意事项vue-ssr问题 - 简书

VUE项目配置SSR相关推荐

  1. 使用Jenkins持续集成Vue项目配置Sonar任务

    title: 使用Jenkins持续集成Vue项目配置Sonar任务 tags: jenkins Vue.js Sonar categories: ci date: 2017-12-05 22:09: ...

  2. 新版Vue项目配置项目名称-publicPath-前端_v1.0.2

    文件名称 版本号 作者 qq 版本 新版Vue项目配置项目名称-publicPath-前端 v1.0.2 学生宫布 8416837 webpack 4.28.4 文章目录 js配置 js配置 定义全局 ...

  3. vue项目设置服务器地址,vue项目配置后端服务器地址

    vue项目配置后端服务器地址 内容精选 换一换 查询负载均衡器状态树.可通过该接口查询负载均衡器关联的监听器.后端云服务器组.后端云服务器.健康检查.转发策略.转发规则的主要信息,了解负载均衡器下资源 ...

  4. Vue项目配置本地访问地址和IP访问地址

    Vue项目配置本地访问地址和IP访问地址 1.在config/index.js配置: dev: {host: '0.0.0.0', } 2.在build/webpack.dev.config.js更改 ...

  5. SwitchHosts使用和vue项目配置

    SwitchHosts使用和vue项目配置 1.解压SwitchHosts到本地电脑上,右键以管理员身份运行exe文件: 2.配置自己需要的域名 3.vue项目中修改配置文件 webpack.dev. ...

  6. vue项目配置eslint(附visio studio code配置)

    eslint基础环境搭建 全局安装eslint:npm install eslint -g 项目eslint初始化:eslint --init,按团队或自己的编程风格回答三道题. ? How woul ...

  7. vue项目配置public静态资源路径访问

    1.简介 一般的vue项目都有一个初始index.html,而其他js.css都是这个html引入的,默认情况下使用绝对路径引入,如/js/app.js 这样就有一个问题,静态资源经常要部署在不同的上 ...

  8. vue项目配置 webpack-obfuscator 进行代码加密混淆

    背景 公司代码提供给第三方使用,为了不完全泄露源码,需要对给出的代码进行加密混淆,前端代码虽然无法做到完全加密混淆,但是通过使用 webpack-obfuscator 通过增加随机废代码段.字符编码转 ...

  9. vue项目配置生产、测试和开发环境

    目前的 web 项目开发基本都是基于前后端分离的模式. 在实际的开发过程中,从开发到测试完成.发布到线上所调用到的接口地址可能都不一样,那就需要在项目中分别配置各个环境的接口地址(或者域名,也可以定义 ...

  10. vue项目配置rem移动端适配

    一.项目介绍 脚手架CLI:@vue/cli Vue版本:2.6.11 移动UI组件库:Vant#2.10.14 CSS预处理器:sass 二.配置lib-flexible插件 下载插件 npm i ...

最新文章

  1. 微信小程序/uni-app 封装请求
  2. 2015年各银行无抵押信用贷款利率及额度是多少?
  3. 【数字信号处理】基本序列 ( 正弦序列 | 数字角频率 ω | 模拟角频率 Ω | 数字频率 f | 模拟频率 f0 | 采样频率 Fs | 采样周期 T )
  4. MAC显示隐藏文件和文件夹
  5. 使用 requests 配置代理服务
  6. Performance Metrics(性能指标1)
  7. springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了
  8. 网络框架 Retrofit(三)
  9. latex中文模板_都8012年了还不用LaTex编辑论文就out了!!
  10. chmod命令(chmod函数)自动清除设置用户ID位和设置组ID位
  11. 畅聊“云时代下的芯片设计”,Fabless IT走进嘉楠科技!
  12. OMRON欧姆龙Sysmac Studio软件--ESI文件的安装
  13. 3.3V和1.8V电平双向转换——电平转换芯片
  14. 用计算机发射wifi经常很卡,电脑WiFi上网速度慢原因解决办法
  15. 数字经济是党和国家定下的重要发展战略
  16. python读取tsv文件_Python读取tsv文件和evalu
  17. CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]
  18. git撤回上一次的提交
  19. POSIX标准是什么?
  20. 通俗理解同步通信与异步通信

热门文章

  1. html怎么填充单元格颜色,PPT表格单元格怎么填充颜色 PPT填充表格单元格颜色的详细教程...
  2. 单片机和嵌入式区别?
  3. Mysql 省市区字典(带层级,带经纬度,带拼音)
  4. 新机常用软件及环境配置清单
  5. 苏东坡的起伏一生:就算人生不顺利,也要活的潇潇洒洒
  6. 如何将pdf文件转换成图片?
  7. 网站访问速度优化之二 - JS和CSS优化
  8. 2.4G频段的无线收发芯片 SI24R1 问题汇总解答
  9. 高中数学基础-1.2.2函数的表示法(上):解析法、列表法、图形法
  10. 三星nand flash K9K8G08U0M详解