nuxt使用记录

530 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

Nuxt.js是一个基于 Vue.js 的通用应用框架。当需要使用服务端渲染时就可以使用nuxt,因为体验平滑开箱即用。 服务器端渲染 (SSR)的好处在于更好的 SEO。

创建nuxt项目

可以使用脚手架来创建:

1.使用npx创建

npx create-nuxt-app <项目名>

2.使用yarn创建(个人比较喜欢使用)

yarn create nuxt-app <项目名>

然后可以根据提示来选择需要的配置。 目录结构与vue是相似的

image.png

页面都是放在pages文件夹下面,nuxt会根据你创建的文件目录来帮你配置路由如官网所说:

image.png

layouts用来存放布局组件默认使用default,需要自定义布局时可以在该目录下创建vue文件,在使用时需要指定layout为使用的布局文件的文件名。

plugins目录下可以引入vue插件或者给路由添加点东西如:

import {
  Message,
} from 'element-ui';
import Cookies from "js-cookie";

export default ({ app }) => {
  app.router.beforeEach((to, from, next) => {
    let token = Cookies.get("token");
    if (to.path !== "/login") {
      if (token) {
        next();
      } else {
        Message.error("请登录后再操作")
        next("/login")
      }
    } else {
      next();
    }
  })
}

在plugins目录下添加好文件xxx后需要在nuxt.config.js中配置一下

  plugins: [
    '@/plugins/element-ui',
    '~/plugins/xxx',
  ],

配置axios拦截器:

import axios from 'axios';
import qs from 'qs';
import {
  Message,
} from 'element-ui';
import Cookies from "js-cookie";

let myredirect;
export default function ({redirect }) {
  myredirect = redirect;
}

export const $axios = axios.create({
  headers: {}
});

// service.defaults.baseURL = process.env.baseUrl;
$axios.withCredentials = true;
let contentType = 'Content-Type';
let token = Cookies.get("token");
$axios.interceptors.request.use((req) => {
  if(token){
    req.headers.token = token;
    if (!req.headers[contentType]) {
      req.headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': 'application/json',
        'token': token
      }
    }
  }
  if (req.method === 'post') {
    req.data = qs.stringify(req.data);
  }
  return req;
}, (err) => Promise.reject(err));

$axios.interceptors.response.use((res) => {
  if (res.data.code === 401) {
    Message.error(res.data.msg); // 弹出错误提示
    Cookies.remove('token');
    myredirect.replace('/login'); // 跳转到登录
  }
  switch (res.status) {
    case 200:
      return res.data;
    case 500:
      break;
    case 401:
    break;
  }
}, (err) => Promise.reject(err));

注意:使用myredirect并不能跳转,目前除了使用中间件我没有找到在拦截器中跳转路由的方法。

配置环境可以创建一个env.js文件如:

module.exports = {
  dev: {
    MODE: 'dev',
    BASE_URL: '', //测试服务器地址
    FILE_URL: ''
  },
  pro: {
    MODE: 'pro',
    BASE_URL: '', //正式服务器地址
    FILE_URL: ''
  }
}

然后在nuxt.config.js中引入并在设置即可

  env: {
    baseUrl: env[process.env.MODE].BASE_URL,
    fileUrl: env[process.env.MODE].FILE_URL,
  }

需要在启动项目时使用 cross-env MODE=xxx,代理也可在该文件中设置

  proxy: {
    '/api': {
      //要访问的跨域的api的域名
      target: env[process.env.MODE].BASE_URL,
      changOrigin: true,
    }

  },

在nuxt.config文件中可以设置很多具体的参考官网,基础使用的话照着官网梭哈就可,只需要注意一下细节,其余没啥大问题。