Published on

vite-1.0模块解析插件解读

Authors
  • avatar
    Name
    祝你好运
    Twitter

这个serverPluginModuleResolve文件也是vite 1.0里面非常重要的一个文件,我们需要仔细分析一下,整体结构如下:

首先说明,这个插件只会处理那些/@modules/开头的请求,这个开头的都是第三方库,这个步骤是这样:

  1. 请求一个文件,返回的时候通过[模块重写]修改了import的文件,第三方库都会被加上/@modules/
  2. 浏览器加载这个/@modules/开头的文件

然后我们就开始分析这个文件,看它是如何把/@modules/开头的请求映射到具体的模块和文件中,然后返回到response里面的。

伪代码解释

  1. 判断是否是第三方库开头的文件
  2. 是否有缓存
  3. 是否是提前优化过的第三方库
  4. 能否解析到具体的第三方库,比如react(这个例子不恰当,因为react会被提前优化,大家明白这个意思即可)
  5. 能否解析到具体的第三方库里面的具体文件,比如import A from 'a/b.js'这样的
  6. 打log并返回404

详细解释

1. 判断是否是第三方库

export const moduleRE = /^\/@modules\//
module-resolve-module-test

2,3. 判断是否有缓存和是否是优化过的第三方库

module-resolve-check-cache

注意第42行的ctx.read是在src/node/server/index.ts91行bind过的自定义的带缓存的读取方法,它会把读取到的结果赋值到ctx.body上。

4,5. 解析到第三方库或第三方库中的文件

我们首先要看下这里的importer的判断,它是需要检查Referer的。

module-resolve-referer-importer
然后就是尝试解析为第三方库或者第三方库中的文件 module-resolve-resolve-package-or-file

6. 最后的检查和收尾

其实我觉得87行的这个检查可以放到上面调用的那个resolveNodeModuleFile里面,这样可以封装具体的解析,不管是不是软连接,外界只要调用就行了,不用关心解析的细节。 module-resolve-end-check