ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Nuxt源码 — plugin (middleware) 参数之谜

2020-12-11 16:29:49  阅读:272  来源: 互联网

标签:redirect axios plugin middleware 源码 context app nuxt


在我们使用 Nuxt 框架的时候,往往在 Plugins or Middleware 中用到一些参数($axios、app、store、redirect...)。很多喜爱研究的小伙伴不知道他们到底如何来的。

  • 如中间件中:
// 中间件
export default async function ({ app, $axios, store, error, redirect, req }) {
  if (req && req.url === '/__webpack_hmr') return
  await store.dispatch('auth/updateToken')
  if (!store.state.auth.user.user_uuid) {
    return redirect('/auth/login')
  }
}
  • 再如 Axios 拦截 Plugin 中:
// Axios 拦截
export default ({ redirect, $axios }) => {
  $axios.onRequest(config => {});
  $axios.onResponse(res => {});
  $axios.onError(error => {})
};

今天就来盘一盘 Nuxt Build 好后的源码,看看到底是从哪里传递过来的这些参数。

首先 Nuxt 会在 createApp 里有个根实例对象 appapp 中有个 context 属性至关重要。
Nuxt 一开始向 app.context 中设置了一些默认属性:

参考 .nuxt/index.js
.nuxt 文件夹见项目根目录
在这里插入图片描述

// Set context to app.context
await setContext(app, {
    route,
    next,
    error: app.nuxt.error.bind(app),
    store,
    payload: ssrContext ? ssrContext.payload : undefined,
    req: ssrContext ? ssrContext.req : undefined,
    res: ssrContext ? ssrContext.res : undefined,
    beforeRenderFns: ssrContext ? ssrContext.beforeRenderFns : undefined
})

并且在 setContext 中还设置了 redirect 属性:

参考 .nuxt/utils.js

export async function setContext(app, context) {
    // ...
    app.context.redirect = function (status, path, query) {
      app.context._redirected = true // Used in middleware
      // if only 1 or 2 arguments: redirect('/') or redirect('/', { foo: 'bar' })
      let pathType = typeof path
      if (typeof status !== 'number' && (pathType === 'undefined' || pathType === 'object')) {
        query = path || {}
        path = status
        pathType = typeof path
        status = 302
      }
      if (pathType === 'object') {
        path = app.router.resolve(path).href
      }
      // ...
    }
    // ...
}

接着他会处理一些 Plugin,比如 axios(注意此处不是我们自己封装的 axios 拦截 plugin,而是 nuxt 集成的官方 axios)

参考 .nuxt/index.js

// Plugin execution
if (typeof nuxt_plugin_axios_cc389c80 === 'function') await nuxt_plugin_axios_cc389c80(app.context, inject)

此时他会将 app.context 传入到 axios 的 plugin 里面,并且在 axios 的 plugin 里会将 $axios 也设置到 app.context 里面。

参考 .nuxt/axios.js

// axios.js (ctx 即传入的 app.context)
export default (ctx, inject) => {
  // ...
  
  // Inject axios to the context as $axios
  ctx.$axios = axios
}

接下来他会处理我们写的 Axios 拦截 plugin,并且将 app.context 传递过去,此时的 app.context 就包含了上面所说的各种各样的参数。

参考 .nuxt/index.js

if (process.browser) { 
    if (typeof nuxt_plugin_axios_6613fe6f === 'function') await nuxt_plugin_axios_6613fe6f(app.context, inject)
}

码字不易,觉得有帮助的小伙伴右上角点个赞鼓励下~

在这里插入图片描述

扫描上方二维码关注我的订阅号~

标签:redirect,axios,plugin,middleware,源码,context,app,nuxt
来源: https://blog.csdn.net/q95548854/article/details/111040069

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有