Nuxt服务端渲染ssr
正文:
module.exports= { modules: [ '@nuxtjs/axios' ], axios: { proxy: true, //开启代理 credentials: true, //跨域请求需使用凭证 }, proxy: [ ['/api',{ target: 'http://example.com/api', // (后端请求地址) changeOrigin: true, pathRewrite: {'^/api': ''} }] ] }
服务端渲染SSR
Nuxt 提供了几种不同的方法来使用 asyncData 方法:
- 返回一个 Promise, nuxt.js会等待该Promise被解析之后才会设置组件的数据,从而渲染组件.
- 使用 async 或 await
- 使用回调函数
1、返回Promise
export default { asyncData ({ params }) { return axios.get(`https://my-api/posts/${params.id}`) .then((res) => { return { title: res.data.title } }) } }
2、async或await
export default { async asyncData ({ params }) { const { data } = await axios.get(`https://my-api/posts/${params.id}`) return { title: data.title } } }
3、使用回调函数
export default { asyncData ({ params }, callback) { axios.get(`https://my-api/posts/${params.id}`) .then((res) => { callback(null, { title: res.data.title }) }) } }
Tips: 在实际项目中,我们一般会有验权操作的。我们需要获取cookie或者服务端存储的session里面的一些校验机制。
这时候我们需要使用到vuex状态树,在状态树中有个方法非常有用 nuxtServerInit
actions: { nuxtServerInit ({ commit }, { req }) { if (req.session.user) { commit('user', req.session.user) } } }
多环境配置(开发、测试、生产)
如果项目中不:要那么多环境,简单配置一个环境就可以了。
modules: [ '@nuxtjs/axios', '@nuxtjs/proxy', ['@nuxtjs/dotenv', { filename: '.env.prod' }], ],
如果有多环境,为了不需要频繁改动环境,我们可以在nuxt.config.js中引入并且在module中使用:
require('dotenv').config({path: '.env'}) module.exports={ modules: [ '@nuxtjs/axios', '@nuxtjs/dotenv' ] }
而且我们可以在根目录配置.env.dev 、 .env.test 、.env.prod文件,
我们只需要修改对应的NODE_ENV:
// .env.dev NODE_ENV=development // .env.test NODE_ENV=test // .env.prod NODE_ENV=production
axios做跨域请求时,可以自动根据环境给axios配置baseURL。API_URL是我们在env配置的url
import axios from 'axios'; const axiosInstance = axios.create({ timeout: 10000, baseURL: process.env.API_URL })
到这一步基本完成我们Nuxt的基础配置了,还有一些周边知识可以梳理梳理:
Nginx反向代理
一般在测试环境或者生产环境,需要使用到nginx做代理服务器,解决跨域。因为我们的项目前后端可能部署在不同的服务。
upstream nodenuxt { server 127.0.0.1:3000; #nuxt项目 监听端口 keepalive 64; } server { listen 80; server_name https://www.example.com; #访问域名 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; #反向代理 } }
pm2守护node进程配置
一般我们在服务端执行npm start项目可以跑起来,but我们的项目总会挂掉。为了让我们服务进程常驻,我们要用到pm2来守护node进程。
而且可以用pm2来做自动重启、性能监控以及负载均衡。
步骤如下:
step 1:
npm install pm2 -g // 全局安装
step 2:
pm2 start ./node_modules/nuxt/bin/nuxt.js -- start // 启动
step 3:
当项目报错,我们想查看日志,这时候,我可以修改pm2.config.js的配置:
module.exports = { apps: [ { name: 'nuxt-demo',//项目名称 cwd: './',//当前工作路径 script: 'npm',//实际启动脚本 args: 'run start',//参数 autorestart: true, //自动重启 error_file: 'logs/nuxt-demo-err.log',//错误日志 out_file: 'logs/nuxt-demo-out.log', //正常运行日志 exec_mode: 'cluster_mode',// 应用启动模式,支持fork和cluster模式 min_uptime: '60s', //应用运行少于时间被认为是异常启动 restart_delay: '60s',//重启时延 instance: 4,//开启4个实例,仅在cluster模式有效,用于负载均衡 watch: true,//监控变化的目录,一旦变化,自动重启 watch: ['.nuxt', 'nuxt.config.js'],//监控变化的目录 watch_delay: 1000,//监控时延 ignore_watch: ['node_modules'],//从监控目录中排除 watch_options: { // 监听配置 'followSymlinks': false, 'usePolling': true } } ] }
这个文件我们可以在package.json中引入使用:
{ "scripts": { "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server --exec babel-node", "build": "nuxt build", "start:test": "cross-env NODE_ENV=test node server/index.js pm2 start pm2.config.js --exec babel-node", "start:prod": "cross-env NODE_ENV=production node server/index.js pm2 start.config.js --exec babel-node", } }
Tips: 如果有报错需要安装babel转译 ```npm install babel-cli babel-core babel-preset-es2015 --save-dev
到这里,基本就大功告成了,but还是可以弄下docker容器部署前端工程
服务端docker容器部署前端工程
step 1: 建立Dockerfile
FROM node:alpine RUN mkdir -p /app/src COPY ./src /app/src WORKDIR /app/src ENV HOST "0.0.0.0" RUN sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_REPOSITORIES}/g" /etc/apk/repositories RUN apk add --no-cache make gcc g++ python RUN npm config set registry https://registry.npm.taobao.org RUN npm install -g pm2 RUN npm install RUN npm run build RUN npm cache clean --force RUN apk del make gcc g++ python EXPOSE 3000 CMD ["npm", "run", "start:test"] #CMD ["npm", "run", "start:prod"]
setp 2: 然后构建镜像
docker build -t nuxt-demo
step 3: 启动容器
docker run -dt -p 3000:3000 nuxt-demo
Tips:这里服务端部署后需要0.0.0.0:3000访问,我们还需配置主机号和端口,在nuxt.config.js中配置。
module.exports = { server: { host: '0.0.0.0', port: 3000 } }
本篇分享到这里就结束啦,给朋友们推荐一个前端公众号,里面都是前端技术干货。