Nuxt.js 服务端渲染 axios(@nuxtjs/axios) 和 proxy 代理的配置

一、介绍
  • Nuxt.js(Vue SSR)创建项目到服务器(Nginx+PM2)部署详细流程

  • nuxt.js 在创建项目的时候可以选择安装 axios

  • axios@nuxtjs/axios 可以共用 nuxt.config.js 中代理配置。

  • 使用的时候需要注意 asyncData() 中需要请求全链接或者服务器有配代理的接口,也就是在服务器渲染的时候需要拿到组装的数据,等到了浏览器本地之后,需要走代理请求,否则会出现跨域,支持加载更多跟其他接口请求操作,更换数据也是没问题的,但是到浏览器之后必须走代理请求,在服务器渲染的时候必须走全链接请求或者走服务器配置了代理的请求,没配置代理就走全链接请求,在服务器不存在跨域,下面 axios 使用中有例子。

二、使用 @nuxtjs/axios
  • 在创建项目的时候,就可以选择导入 @nuxtjs/axios,它是对 axios 包装,更好在 nuxt.js 中使用,可以通过 this.$axios.get(url).then() 进行全局使用。

  • 检查 package.json 文件中 dependencies 有没有存在 @nuxtjs/axios,没有命令行安装(建议创建项目的时候就通过脚手架安装上)

    $ npm install --save @nuxtjs/axios
    

    image.png

  • nuxt.config.js 配置,代理配置

    export default {
      head: { ... },
      css: [],
    
      modules: [
        '@nuxtjs/axios',
      ],
    
      axios: {
        // 开启代理 (如果需要判断线上线下环境,可以通过 process.env.NODE_ENV !== 'production' 来判断)
        proxy: true,
        // 给请求 url 加个前缀 /api,如果这项不配置,则需要手动添加到请求链接前面
        // 如果是多个代理的时候,则不需要配置,走手动添加代理前缀
        prefix: '/api',
        // 跨域请求时是否需要使用凭证
        credentials: true
      },
    
      proxy: {
        '/api': {
          // 目标接口域
          target: 'http://test.dzm.com',
          // 全局配置是否跨域
          changeOrigin: true,
          pathRewrite: {
            // 单个配置是否跨域
            // changeOrigin: true
            // 把 '/api' 替换成 '/',具体需要替换为 '' 还是 '/' 看自己习惯
            '^/api': '/'
          }
        }
      },
    
      build: {
        // 防止重复打包
        vendor: ['axios']
      }
    }
    
  • 在组件中使用,这样就可以在服务器渲染到页面之后,通过请求进行更换数据,因为到页面之后需要走代理的方式才能获取到数据,否则会报错跨域。

    mounted() {
        this.$axios.get("/index").then(res=>{
            console.log(res)
        })
        
        // axios 需要手动加上 '/api' 代理协议
        // @nuxtjs/axios 因为配置了 prefix: '/api' 会自动添加,否则也得手动添加
        // 访问的 url 地址为  http://x.x.x.x:3000/api/index
        // 然后根据上面代理转为 http://test.dzm.com/index
        // /api 会自动加到访问链接中
    }
    
二、使用 axios
  • 安装命令,默认一般 nuxt.js 自带 axios,是不需要手动安装的,在 package.json 文件中 dependencies 中可能并不体现出来,可以通过 node_modules 文件夹找到 axios

    $ npm install --save axios
    

    image.png

  • 如果找到了,就不要去安装了,直接使用即可,代理是公用的。

    <script>
    import axios from 'axios'
    export default {
        mounted() {
            axios.get("/api/index").then(res=>{
                console.log(res)
            })
    
            // axios 需要手动加上 '/api' 代理协议
            // @nuxtjs/axios 因为配置了 prefix: '/api' 会自动添加,否则也得手动添加
            // 访问的 url 地址为  http://x.x.x.x:3000/api/index
            // 然后根据上面代理转为 http://test.dzm.com/index
            // /api 会自动加到访问链接中
        }
    }
    </script>
    
  • axios 可以进行封装使用,跟 vue 中一样

    • axios.js

      import axios from 'axios'
      
      const service = axios.create({
        // 请求地址,为空则请求的时候带上
        baseURL: '',
        // 请求超时时间
        timeout: 90000
      })
      
      export {
        service as axios
      }
      
    • request.js

      import { axios } from './axios'
      // 请求地址
      const BASE_URL = process.env.NODE_ENV === 'production' ? 'http://dzm.com' : 'http://test.dzm.com'
      
      // 这种带全链接用于放在 asyncData() 中进行 SEO 请求
      export function getxxx (parameter) {
        return axios({
          url: BASE_URL + `/list`,
          method: 'get',
          params: parameter
        })
      }
      
      // 这种带全链接用于放在 asyncData() 中进行 SEO 请求
      export function postxxx (parameter) {
        return axios({
          url: BASE_URL + `/reload`,
          method: 'post',
          data: parameter
        })
      }
      
      // 这种带全链接用于放在页面加载到浏览器之后,加载更多或者其他请求操作使用,不会出现跨域问题
      export function getxxx (parameter) {
        return axios({
          url: '/api' + `/list`,
          method: 'get',
          params: parameter
        })
      }
      
      // 这种带全链接用于放在页面加载到浏览器之后,加载更多或者其他请求操作使用,不会出现跨域问题
      export function postxxx (parameter) {
        return axios({
          url: '/api' + `/reload`,
          method: 'post',
          data: parameter
        })
      }
      
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值