nuxt-cnode
基于vue的nuxt框架仿的cnode社区服务端衬着,重如果为了seo优化以及首屏加载速率
线上地点 http://nuxt-cnode.foreversnsd.cn
github地点 https://github.com/Kim09AI/nu…
手艺栈
- 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 Nuxt.js docs.