Nuxt入门到打包部署 Vue-SSR项目
什么是服务端渲染
前端渲染流程:
前端请求服务器,把html文件以资源的形式返回前端,浏览器拿到html文件解析。
服务器渲染:返回html之前,会先将一些数据填充好到特定区域后再返回给前端,在SPA场景下,服务端渲染都是针对第一次get请求,它会完整的html给浏览器,浏览器直接渲染出首屏,用不着浏览器端多一个AJAX请求去获取数据再渲染。
前端渲染流程:
客户端第一次请求服务器,服务器返回一个空壳的html,当created方法发送数据给服务器后,服务器才返回客户端,然后再渲染数据。此时才能看到完整的页面(搜索引擎抓取不到ajax的数据)。
服务端渲染流程:客户端请求服务器,服务器先塞数据(包含js等)进html后返回。
优点:
更好的 SEO,因为传统的搜索引擎只会从 HTML 中抓取数据,这会导致前端渲染的页面无法被抓取。
更快的内容到达时间(time-to-content),特别是对于缓慢的网络情况或运行缓慢的设备 。页面首屏时间大概有80%消耗在网络上,剩下的时间在后端读取数据以及浏览器渲染,显然要优化后面的20%是比较困难的,优化网络时间是效果最明显的手段。传统的Ajax请求是先请求js再由js发起数据请求,两项时间再加上浏览器渲染时间才是首屏时间。而SSR能将两个请求合并为一个。
缺点:
- 更多的服务器端负载。
- 服务器端和浏览器环境差异带来的问题,例如document等对象找不到的问题。
如何选择
建议:如果注重SEO的新闻站点,非强交互的页面,建议用SSR;像后台管理页面这类强交互的应用,建议使用前端渲染。
静态化:把vue文件变成html文件
什么是Nuxt.js
Vue服务端渲染官网
Nuxt.js官网
Nuxt.js 是一个基于 Vue.js 的通用应用框架。
第一个Nuxt应用程序
npm i create-nuxt-app -g
create-nuxt-app my-nuxt-demo
cd my-nuxt-demo
npm run dev
文件结构分析
└─my-nuxt-demo├─.nuxt // Nuxt自动生成,临时的用于编辑的文件,build├─assets // 用于组织未编译的静态资源如LESS、SASS或JavaScript,对于不需要通过 Webpack 处理的静态资源文件,可以放置在 static 目录中├─components // 用于自己编写的Vue组件,比如日历组件、分页组件├─layouts // 布局目录,用于组织应用的布局组件,不可更改⭐├─middleware // 用于存放中间件├─node_modules├─pages // 用于组织应用的路由及视图,Nuxt.js根据该目录结构自动生成对应的路由配置,文件名不可更改⭐├─plugins // 用于组织那些需要在 根vue.js应用 实例化之前需要运行的 Javascript 插件。├─static // 用于存放应用的静态文件,此类文件不会被 Nuxt.js 调用 Webpack 进行构建编译处理。 服务器启动的时候,该目录下的文件会映射至应用的根路径 / 下。文件夹名不可更改。⭐└─store // 用于组织应用的Vuex 状态管理。文件夹名不可更改。⭐├─.editorconfig // 开发工具格式配置├─.eslintrc.js // ESLint的配置文件,用于检查代码格式├─.gitignore // 配置git忽略文件├─nuxt.config.js // 用于组织Nuxt.js 应用的个性化配置,以便覆盖默认配置。文件名不可更改。⭐├─package-lock.json // npm自动生成,用于帮助package的统一设置的,yarn也有相同的操作├─package.json // npm 包管理配置文件├─README.md
页面和路由
nuxt的路由是自动生成的,例如再pages下创建demo.vue,浏览器输入http://localhost:3000/demo即可发文到demo.vue文件。
└─pages├─index.vue└─user├─index.vue├─demo.vue
Nuxt.js 自动生成的路由配置如下
router: {routes: [{name: 'index',path: '/',component: 'pages/index.vue'},{name: 'user',path: '/user',component: 'pages/user/index.vue'},{name: 'demo',path: '/user/demo',component: 'pages/user/demo.vue'}]
}
页面跳转
- 不要写成a标签,因为是重新获取一个新的页面,并不是SPA
<nuxt-link to="/users"></nuxt-link>
- this.$router.push(’/users’)
- 不能写a标签,a标签相当刷新页面
动态路由
- 在 Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录(例如新建_id文件夹,里面再创建一个index.vue),建议目录形式,文件容易出错,文件名可以自定义,但vue文件必须用index不然没效果。
- 获取动态参数{{$route.params.id}}
路由参数校验
Nuxt.js 可以让你在动态路由对应的页面组件中配置一个validate
方法用于校验动态路由参数的有效性。该函数有一个布尔类型的返回值,如果返回true则表示校验通过,如果返回false则表示校验未通过。
注意1,这个validate要写在_id文件夹下面的index.vue文件里而且不能写在methods里,和methods同级即可。返回false就会找不到页面。
注意2,validate这个方法拿不到this 可以用它自带的参数obj解决(可以打印这个obj,但是要在命令行里看不是浏览器)。
export default {// nuxt中使用validate方法进行路由参数校验,这个方法必须返回一个布尔值,为true表示校验通过,为false表示校验失败。注意validate不能写到methods属性中。validate(obj) {// console.log(obj);// return truereturn /^\d+$/.test(obj.params.id)}
}
嵌套路由
- 添加一个Vue文件,作为父组件
- 添加一个与父组件同名的文件夹来存放子视图组件
- 在父文件中,添加组件,用于展示匹配到的子视图
pages文件夹下创建test.vue 然后创建一个test文件夹,创建_id文件,再创建test.vue
以下是pages文件夹下的test.vue
<template>
<div class=''><nuxt-link :to="`/test/${3}`"><button>todemo</button></nuxt-link><nuxt-child></nuxt-child></div>
</template>
layouts - pages - components
创建layout
- 去layouts文件夹下面新建一个新的layout组件,例如test.vue,并在这个组件中添加组件,这样,所有和test相关的页面都会有公共的layout
- 给需要用到test.vue的组件添加layout属性,并指定需要使用的layout,例如:layout: ‘test’
<script>
import Mynav from '~/components/Mynav'
export default {// 通过layout属性,指定当前页面使用的布局组件,相当于本组件多了一个headerlayout: 'headerlayout',components: {Mynav},data () {return {teacherList: [{name: 'jack1', id: 1},{name: 'jack2', id: 2},{name: 'jack3', id: 3}]}}
}
</script>
名字就是路由名称。
组件nuxt表示显示的页面。因为的组件名是movie,那么它会自动找到pages目录下的moive.vue展示
点击link就会跳转到movie type文件夹的index.vue。
如果路由后还有参数就继续创建文件夹
创建特殊layout-error
layouts文件夹下面新建error.vue,error是关键字,error.vue相当于自定义的404页面。
新建一个组件
在components文件夹下面新建一个Header.vue组件
引入组件,注意路径的~符号,表示根目录
layout中也能使用组件
配置样式
nuxt.config.js中设置设置全局样式文件路径
css: [~表示当前目录'~/assets/styles/index.ccs'],
ElementUI使用
下载npm i element-ui -S
在plugins文件夹下面,创建ElementUI.js文件
import Vue from 'vue'
import ElementUI from 'element-ui'
Vue.use(ElementUI)
在nuxt.config.js中添加配置
css: [ 配置全局样式
不带~/表示node_modules下的文件
'element-ui/lib/theme-chalk/index.css'],plugins: [// ssr: true表示这个插件只在服务端起作用{src: '~/plugins/ElementUI', ssr: true }],build: { // 防止element-ui被多次打包vendor: ['element-ui', 'axios']}
1.5 异步数据
注意: 在nuxt中,生命周期只有created以及beforeCreate这两个函数能够在服务端正常使用, 在nuxt中发异步请求不能在created生命周期函数中去发,因为它会在前端执行。
Nuxt.js 扩展了 Vue.js,增加了一个叫 asyncData
的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。asyncData
方法会在组件(限于页面组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用。所以需要注意这个函数中不能使用this
可以使用asyncData(context, callback)callback获取,注意asyncData(context, callback)是和methods平级的函数。
发送异步请求,在asyncData函数中发送asyncData(context, callback) {console.log(context);setTimeout(() => {// callback有两个参数,第一个是错误对象,第二个是数据对象callback(null, {movieList: [{title: 'test1', id: 1},{title: 'test11', id: 2},{title: 'test131', id: 3}]})}, 1000);},
注意:常规写法如果在created钩子中写异步,是在客户端渲染的而不是在服务端
使用方法:asyncData(context, callback) {callback(null, data)}
context.route.params.xxx
获取参数
callback(new Error(), data)
渲染出错的页面
注意:这个方法在服务器端执行和在客户端执行的区别
axios的使用
安装npm install --save axios
import axios from 'axios'asyncData(context, callback) {axios.get('http://localhost:3302/in_test').then(res => {console.log(res);callback(null, {list: res.data})})
}
为防止重复打包,在nuxt.config.js中配置
module.exports = {build: {vendor: ['axios']}
}
可以用json-server模拟假数据
- 下载json-server工具:npm i json-server -g
- 可能会报错,用管理员身份运行powershell执行就解决了。
json-server --watch --port 3302 db.json
{"in_test": [{"id": 1,"title": "黄金兄弟","rating": 5.3,"genres": ["动作", "犯罪"],"img": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2535191502.jpg"}],}
SEO优化
SEO优化有俩中,全局和局部
全局
在nuxt.config.js配置文件中修改
head: {title: pkg.name,meta: [{ charset: 'utf-8' },{ name: 'viewport', content: 'width=device-width, initial-scale=1' },{ hid: 'description', name: 'description', content: pkg.description }],link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]},
局部
再指定页面加入
<template><div class="movie"><h1>欢迎访问本网站!</h1></div>
</template>
<script>
export default {layout: 'movie',head() {return {title: '电影',meta: [{name: 'keywords', content: '电影、经典电影、热映、电视剧、美剧、影评、电影院'}]}}
}
</script>
这些keywords会被搜索引擎抓取到。
最后打包部署
npm run build
把本地文件的.nuxt、static,package.json、nuxt.config.js,这四个文件夹放到服务器目录文件下
npm install
npm start
Nginx配置
server {listen 80;server_name 你的域名 你的域名;location ~ / {proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;proxy_set_header X-Nginx-Proxy true;proxy_cache_bypass $http_upgrade;proxy_pass http://nodenuxt; #反向代理}
}
upstream nodenuxt {server 127.0.0.1:3000; #nuxt项目 监听端口keepalive 64;
}
pm2开启进程守护
pm2 start npm --name “bigstu” – run start
最后这个域名就能正常访问啦:你的域名
pm2 stop 1 // 先停止
pm2 restart 1 // 再重启
Nuxt入门到打包部署 Vue-SSR项目相关推荐
- 宝塔面板部署nuxt_MacOS下创建及部署vue.js项目(及Nuxt.js、PM2等相关流程)
开发环境 权限准备 为避免后续流程出现权限不足的相关提示,首先在终端中输入以下代码检查当前系统是否已开启了对系统文件夹的保护: csrutil status 若结果为csrutil enabled,则 ...
- VUE SSR项目部署
记一次小白痛苦的踩坑经历···· VUE项目中个人感觉还是使用vue官方提供的vue-cli脚手架来构建项目的人比较多,相关的文档也总结了很多,而我的项目是采用vue-ssr即服务器端渲染,项目架构来 ...
- Ubuntu配置Nginx部署Vue SPA项目
Ubuntu配置Nginx部署Vue SPA项目 文章记录了部署Vue SPA项目后可从ip访问的过程,因域名访问需要备案暂未尝试,后续若实行亦会更新在此处. 系统为Ubuntu18.04. Ngin ...
- VUE - Apache 部署 Vue SPA 项目,刷新 404 , Apache 配置处理
问题描述 因一些原因,使用 Apache 部署 Vue SPA 项目,静态路由刷新后 404 ; 官方推荐 https://router.vuejs.org/zh/guide/essentials/h ...
- Jenkins 打包部署 vue项目
1.配置node.js centos7 安装node.js 1.1.安装node.js插件 路径:Manage Jenkins > plugin Manager > 可选插件 搜索:nod ...
- 使用jenkins自动化打包部署Vue项目。详细教程。
此教程 jenkins是直接部署到linux服务器上.服务器系统:CentOS 7.3 64位. 流程:jenkins关联码云仓库,点击立即构建,执行shell进行构建,打包,把打包后的dist目录文 ...
- 手把手教你配置:Jenkins+Github+Webhook +Nginx自动化打包部署Vue项目
前面的话 为了前端项目的工程化,减少项目发布环境的部署,实现自动化打包部署. 传统的做法,在服务器初始一个 git 仓库,然后每次代码更新后,手动去拉取,次数多了也就烦了,而自动化打包部署每次只需在项 ...
- 在阿里云从0开始部署vue+springboot项目
我很生气 服务器被黑了,top ps命令被修改,top下面的进程基本都是0占用率,控制台看到的cpu是100,找不到原因,一开始我还以为是显示错了,后来仔细看,top查看到ni(nice cpu ti ...
- springboot入门_打包部署
程序打包部署一般有两种,jar和war,本文以打war包为例,部署springboot项目. 首先,创建一个springboot项目(此处就不在多说如何创建了),修改pom.xml文件 1 <p ...
最新文章
- 锁的升级与synchronized锁的关系
- IT职场最受欢迎的十大晋升秘决
- Oracle表空间状态
- 程序员如何与人打交道
- [js] axios拦截器原理是什么?
- C#调用WebService实例和开发(转)
- 身份证号有效性检验代码 (python)
- 开发人员提升自己的四种方式
- OSGI的实现——Felix
- 电脑公司特别版常用软件盘
- JS循环延时函数setInterval根据特定情况的中断
- 根据汉字自动生成拼音
- rac的FAILOVER 和LOAD_BALANCE参数,yes和on是否通用!
- 撸了一次 Js 代码
- 微信朋友圈会在服务器上保留多久,微信朋友圈设置多久可见,暴露了你的为人...
- Word里的图片显示不全,只显示最下面的一小部分的解决办法
- 32微型计算机中的32室,32 位微型计算机中的32是指( )_学小易找答案
- 浅谈js下的发布订阅模式(观察者模式)
- GitHubActions详解
- Dinic求最大流/最小割