介绍
1.nuxt是什么?
Nuxt 是一个基于 Vue 生态的更高层的框架,为开发服务端渲染的 Vue 应用提供了极其便利的开发体验。更酷的是,你甚至可以用它来做为静态站生成器。
2.Egg.js是什么?
Egg.js是基于Koa的上层框架,为企业级框架和应用而生。
快速初始化
$ npm i egg-init -g
$ egg-init egg-example --type=simple
$ cd egg-example
$ npm i
$ npm install nuxt
目录结构
egg-example
├── package.json
├── app.js
├── agent.js
|—— client
├── app
| ├── router.js
│ ├── controller
│ | └── home.js
│ ├── service
│ | └── user.js
│ ├── middleware
│ | └── nuxt.js
│ ├── schedule
│ | └── task.js
│ ├── public
│ | └── reset.css
│ ├── view
│ | └── home.tpl
│ └── extend
│ ├── helper.js
│ ├── request.js
│ ├── response.js
│ ├── context.js
│ ├── application.js
│ └── agent.js
├── config
| ├── plugin.js
| ├── config.default.js
│ ├── config.prod.js
| ├── config.test.js
| ├── config.local.js
| └── config.unittest.js
└── test
├── middleware
| └── nuxt.test.js
└── controller
└── home.test.js
新建NUXT中间件
const { Nuxt, Builder } = require("nuxt");
let config = require("../../nuxt.config");
module.exports = (options, app) => {
const nuxtRender = new Nuxt(config);
let isProduction = process.env.NODE_ENV === "production";
if (isProduction) {
new Builder(nuxtRender).build();
}
return async function(ctx, next) {
let flag = false;
let routerArr = [];
if (!flag) {
routerArr = app.router.stack.map(el => el.path);
flag = true;
}
if (routerArr.some(el => el === ctx.path)) {
return await next();
}
ctx.status = 200;
ctx.req.session = ctx.session;
const { res, req } = ctx;
return new Promise((resolve, reject) => {
ctx.res.on("close", resolve);
ctx.res.on("finish", resolve);
nuxtRender.render(req, res, promise => {
promise.then(resolve).catch(reject);
});
});
};
};
新建NUXT目录以及配置文件
1.新建client目录,目录规范遵循nuxt配置
2.在项目根目录新建nuxt.config.js
module.exports = {
srcDir: "client/",
};
其余配置参考nuxt官方配置
问题
1.如果后端采用session鉴权,由于session依赖cookie,需要在asyncData的时候讲cookie传后端
asyncData({ params, store, req }) {
if (process.server) {
Object.keys(req.headers).map(key => {
axios.defaults.headers.common[key] = req.headers[key];
});
}
return axios.get("http://127.0.0.1:7001/api/news/list").then(res => {
return { list: res.data };
});
}
2.使用官方axios直接进行代理
axios