iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
0
Modern Web

Nuxt - 使用 Vue.js 做 SSR 的第一哩路系列 第 27

27. @nuxtjs/axios 如何透過 module 包裝 axios

  • 分享至 

  • xImage
  •  

Nuxt Axios 模組 - @nuxtjs/axios ,是官方推薦使用的 HTTP Client Module
主要功能及組成有

  • axios 提供 HTTP Client 和 Interceptor
  • axios-retry 提供失敗後的自動重試機制
  • Proxy Module 主要做 Path rewrites,拿來掛 api routes
    (WebSockets、Auth、Cookie 處理他也包,但這邊不重要)

其他細節如

  • 整合進度條顯示 (Axios onProgress & Nuxt Progressbar)
  • credentials
  • debug logs

模組實現解說

程式碼在這 Github
以下解說結構和作用,不貼太多原始碼


主要程式碼放在 lib 內

  • plugin.template.js 實作前後端載入 Axios 的 Code Template
  • module.js 彙整 options,呼叫 addPlugin() 產生實際的 axios plugin,並且傳相關設定給 proxy module

進入點 lib/module.js

const path = require('path')
const consola = require('consola')

const logger = consola.withScope('nuxt:axios')

module.exports = function nuxtAxios (_moduleOptions) {
  // 彙整 nuxt.config.js 中 `axios` 和 `modules` 傳入參數
  
  // 設定預設值
  
  // 映射環境變數,蓋掉 Axios 預設值
  
  // 檢查 http/https,並依情況切換
  
  // 註冊 Axios Module 的客製 Plugin
  /* call addPlugins() and addTemplate() */
  this.addPlugin({
    src: path.resolve(__dirname, 'plugin.template.js'),
    fileName: 'axios.js',
    options
  })
  
  // 載入關聯模組並整合 @nuxtjs/proxy
  /* call requireModule */
  if (options.proxy) {
    this.requireModule([
      '@nuxtjs/proxy',
      typeof options.proxy === 'object' ? options.proxy : {}
    ])
  }
}

plugin.template.js - 模組附加 axios 設定和額外功能 (上一篇 plugin 做的事也一樣)

/* 他不直接改 Axios 原型,改 instance  */

/* 重新命名對應 RESTful 的 function,原名加 `$` 字前綴 */

/* config and implement: debug logs */
/* config and implement: credentials */
/* config and implement: progress */

export default (ctx, inject) {
  /* 定義 plugins 對外接口與執行細節 */    
  
  // baseURL config
  
  // header config, both of proxy and server-side encoding
  
  // create new axios instance and extends it
  
  // Setup interceptors
  /* includes debug logs, credentials, progress, retry */
  
  // Inject axios to the context as $axios
  ctx.$axios = axios
  inject('axios', axios)
}


上一篇
26. Nuxt Module,Nuxt 的擴充元件
下一篇
28. Nuxt 靜態頁部署
系列文
Nuxt - 使用 Vue.js 做 SSR 的第一哩路32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言