博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于vue的nuxt框架cnode社区服务端渲染
阅读量:6316 次
发布时间:2019-06-22

本文共 5048 字,大约阅读时间需要 16 分钟。

nuxt-cnode

基于vue的nuxt框架仿的cnode社区服务端渲染,主要是为了seo优化以及首屏加载速度

线上地址

github地址

技术栈

  • vue
  • vue-router
  • vuex
  • nuxt
  • axios
  • simplemde
  • ES6/7
  • stylus

目录结构

├─npm-shrinkwrap.json├─nuxt.config.js                # nuxt配置文件├─package.json├─README.md├─utils|   ├─axios.js                  # axios封装|   ├─index.js                  # 工具函数|   └scroll.js                  # 滚动条操作函数├─store                         # store|   ├─actions.js|   ├─getters.js|   ├─index.js|   ├─mutation-types.js|   ├─mutations.js|   ├─README.md|   └state.js├─static                        # 静态资源|   ├─favicon.ico|   └README.md├─plugins                       # vue实例化之前执行的插件|    ├─component.js             # 注册全局组件|    ├─filter.js                # 注册全局filter|    ├─README.md                |    └ssrAccessToken.js         # 服务端渲染时保存access_token,供服务端请求时的api获取├─pages                         # 页面级组件|   ├─index.vue                 # 首页|   ├─login.vue                 # 登录页|   ├─README.md |   ├─user|   |  ├─messages.vue           # 未读消息页|   |  ├─_id|   |  |  ├─index.vue           # 用户信息页|   |  |  └collections.vue      # 用户收藏的主题页|   ├─topic|   |   ├─create.vue            # topic创建页,复用为编辑页|   |   ├─_id|   |   |  └index.vue           # topic详情页├─mixins                        # mixins|   └index.js├─middleware                    # 中间件,页面渲染之前执行|     ├─auth.js                 # 用户权限中间件|     ├─checkRoute.js           # 主要是对404页面的重定向|     └README.md├─layouts                       # 布局|    ├─default.vue|    └README.md├─filters                       # 全局filter|    └index.js├─components|     ├─alert.vue               # 提示组件|     ├─backTop.vue|     ├─clientPanel.vue|     ├─commentList.vue         # 评论列表|     ├─commonFooter.vue|     ├─commonHeader.vue|     ├─mainLayout.vue          # 页面内的主布局,划分左右两栏|     ├─markdown.vue            # 基于simplemde封装的组件|     ├─messageList.vue         # 消息列表|     ├─pageNav.vue             # 分页组件|     ├─panel.vue|     ├─README.md|     ├─tabHeader.vue|     ├─topicCreatePanel.vue|     ├─topicList.vue           # 文章列表|     └userInfoPanel.vue├─assets|   ├─README.md|   ├─css|   |  ├─common.styl|   |  ├─icon.styl|   |  ├─index.styl|   |  ├─mixin.styl|   |  ├─reset.styl|   |  └simplemdecover.styl├─api                           # 请求api|  └index.js

实现的功能

  • 首页
  • topic详情页
  • 新建topic
  • 编辑topic
  • 收藏topic
  • 用户收藏的topic
  • 取消收藏topic
  • 新建topic的评论
  • 新建评论的评论
  • 点赞评论
  • 个人信息及用户信息
  • 登录/退出
  • 未读消息页

cookie的共享

只要做服务端渲染,不管是vue还是react,都必然会遇到cookie共享的问题,因为在服务器上不会为请求自动带cookie,所以需要手动来为请求带上cookie,以下方法主要是借鉴vue-srr导出一个创建app、router、store工厂函数的方法,导出一个创建axios的工厂函数,然后把创建的axios实例注入store,建立store与axios一一对应的关系,

然后就可以通过store.$axios或state.$axios去请求就会自动带cookie了

首先获取cookie中的东西放到store.state

export const nuxtServerInit = async ({ commit, dispatch, state }, { req }) => {    let accessToken = parseCookieByName(req.headers.cookie, 'access_token')    if (!!accessToken) {        try {            let res = await state.$axios.checkAccesstoken(accessToken)            if (res.success) {                let userDetail = await state.$axios.getUserDetail(res.loginname)                userDetail.data.id = res.id                // 提交登录状态及用户信息                dispatch('setUserInfo', {                    loginState: true,                    user: userDetail.data,                    accessToken: accessToken                })            }        } catch (e) {            console.log('fail in nuxtServerInit', e.message)        }    }}

导出一个创建axios的工厂函数

class CreateAxios extends Api {    constructor(store) {        super(store)        this.store = store    }    getAccessToken() {        return this.store.state.accessToken    }    get(url, config = {}) {        let accessToken = this.getAccessToken()        config.params = config.params || {}        accessToken && (config.params.accesstoken = accessToken)        return axios.get(url, config)    }    post(url, data = {}, config = {}) {        let accessToken = this.getAccessToken()        accessToken && (data.accesstoken = accessToken)        return axios.post(url, qs.stringify(data), config)    }    // 返回服务端渲染结果时会用JSON.stringify对state处理,因为store与$axios实例循环引用会导致无法序列化    // 添加toJSON绕过JSON.stringify    toJSON() {}}export default CreateAxios

在创建store时创建axios并把axios注入store

const createStore = () => {    let store = new Vuex.Store({        state,        getters,        mutations,        actions    })    store.$axios = store.state.$axios =  new CreateAxios(store)    if (process.browser) {        let replaceState = store.replaceState.bind(store)        store.replaceState = (...args) => {            replaceState(...args)            store.state.$axios = store.$axios            replaceState = null        }    }    return store}export default createStore

之后就可以在asyncData函数中使用store.$axios、在组件内使用this.$store.$axios、在axtion中使用state.$axios或rootState.$axios发起请求了,这些请求都会自动的带上cookie中的东西

若该项目对你有帮助,欢迎 star

Build Setup

# install dependencies$ npm install # Or yarn install# serve with hot reload at localhost:3000$ npm run dev# build for production and launch server$ npm run build$ npm start# generate static project$ npm run generate

For detailed explanation on how things work, checkout the .

转载地址:http://zfuaa.baihongyu.com/

你可能感兴趣的文章
为什么要跟别人比?
查看>>
app启动白屏
查看>>
Oracle 提高查询性能(基础)
查看>>
学习知识应该像织网一样去学习——“网状学习法”
查看>>
Hadoop集群完全分布式安装
查看>>
QString,char,string之间赋值
查看>>
我的友情链接
查看>>
Nginx+mysql+php-fpm负载均衡配置实例
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
VMware.Workstation Linux与windows实现文件夹共享
查看>>
ARM inlinehook小结
查看>>
wordpress admin https + nginx反向代理配置
查看>>
管理/var/spool/clientmqueue/下的大文件
查看>>
mysql dba系统学习(20)mysql存储引擎MyISAM
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
浅谈代理
查看>>
基于jquery实现的超酷动画源码
查看>>
fl包下的TransitionManager的使用
查看>>