基于Vue和Express框架写的一个全栈购物商城,记录项目过程当中遇到的一些问题以及经验和技巧。css
基于Vue-CLI2.0:点我查看html
这个分支版本是一两年前的,基于Vue-CLI2.0写的,数据请求是Mock,纯前端的项目。
前端
基于 Vue-CLI3.0:点我查看vue
这个分支版本是基于Vue-CLI3.0的,将脚手架从2.0迁移升级到了3.0,遇到的一些问题和坑也都填完了~也是纯Web端Mock模拟数据的项目。
ios
当前版本:点我查看git
基于Vue-CLI3.0,前端用Vue全家桶,后端用Express+MongoDB+Redis,后台管理系统CMS是用的Vue-Element-Admin
github
在线预览:www.fancystore.cn vue-router
项目代码px自动转换为rem,须要在main.js中引入amfe-flexible库vuex
Vant UI库也有REM单位,须要在vue.config.js中配置: vue-cli
单页(SPA)SEO是一个痛点,目前有两种方式,一种是SSR,一种是预渲染(PrerenderSPAPlugin)。
这个项目是用预渲染(PrerenderSPAPlugin)+vue-meta-info这两个库来作SEO优化的。
将rouer.js模式改成mode:history
下载安装PrerenderSPAPlugin
PrerenderSPAPlugin是Google的一个库,基于Chromium是获取数据,安装PrerenderSPAPlugin的时候会自动下载Chromium浏览器,国内npm安装Chromium会常常安装失败,建议用淘宝的cnpm安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install PrerenderSPAPlugin --save
复制代码
在vue.config.js中引入PrerenderSPAPlugin,配置须要预渲染的路由。
下载安装 vue-meta-info
在main.js中引入vue-meta-info,在每一个页面配置meta信息,这样每一个单页路由都有不一样的title,理由爬虫引擎抓取重要内容,利于SEO。
预渲染前只有一个index.html,预渲染后最后打包出来的预渲染目录文件以下:
项目中会使用keep-alive会提升用户体验和网站的性能,若是想实现部分页面缓存,部分页面不须要缓存,能够在router.js里面的路由添加meta.keepalive在跟router-vier加入判断:
用Vuex管理全局的状态,会遇到刷新页面的时候全部的状态丢失或者重置,能够在App.vue的钩子函数添加代码,会在页面刷新的时候将Vuex存储到Storage中,刷新完成后又再从Storage取出来存到Vuex里面:
封装Axios,添加Axios请求(request)和相应(response),统一处理错误信息或者登陆认证的消息,全部的数据请求都存放到api目录下,对应的页面方便后续的维护和管理。
区分开发环境和生产环境
alias的方式直接指定目录。
CDN
生产环境中将一些共有库Vue,vuex,vue-router等库不打包到项目中,而是经过CDN的方式引入这些共有库,这样能够减小项目的大小,也能够借助CDN的优点,让网站加载更快。推荐一个强大的cdn库:[https://www.bootcdn.cn/](https://www.bootcdn.cn/)
生产环境压缩和出去console打印日志
生产环境开启gzip压缩
生产环境启用预渲染
生产环境分离css,外链CSS能够缓存
集成Sentry开源日志监控系统,在官网注册获取key,在main.js中引入RavenVue并配置便可
Github自动构建和持续集成基于Travis
登陆Travis选择须要持续集成的项目。
在.travis.yml写上相应的config,服务器配置ssh_key,
每次代码push到指定分支(好比master)的时候,Travis会自动执行项目上的.travis.yml文件,开始自动构建,构建成功经过scp密令传送到服务器,完成自动部署的功能。
每次须要发版,只须要push代码,而后去喝杯咖啡,回来就已经构建发布完成,解放劳动力
团队合做的时候,每一个成员用的编辑器不一样,缩进格式也不一样,这样合并代码的时候会出现各类意外的状况,团队统一编辑器和编辑器不太现实,由于每一个人的写代码习惯和风格不一致。能够借助husky 和 link-stage,每次commit的时候都会安装配置的规则格式化代码,参考文章:segmentfault.com/a/119000000…
用Session认证机制,来实现登陆登出。 配置Session的加密解密,将Session存储到Redis,提升性能,若是有多台服务器,Redis能够共享Session。
有些API请求是须要用户登陆才能够访问的,能够写中间件来判断:
有些API的请求是须要判断用户是否有权限,好比添加、删除和更新,会在中间件判断是否有权限
配合后端作了权限系统,根据用户的权限来展现和隐藏菜单和按钮。
后台管理CMS: github.com/czero1995/f…