代码之家  ›  专栏  ›  技术社区  ›  TacB0sS

模块分辨率与esm和非esm文件不一致

  •  0
  • TacB0sS  · 技术社区  · 4 年前

    我有一个项目设置,其中我有一个web应用程序,它依赖于几个Firebase SDK,这些SDK是通过webpack dev server进行网页打包和服务的。

    从我不需要太多细节就能收集到的信息来看,有一个最终的依赖项,它既有常规索引,也有es2017索引文件

    enter image description here

    有些中间依赖项同时具有这两种特性,比如 应用程序 还有一些只有es2017,例如 消息传递 ,以及一些仅通用索引文件。

    我遇到的问题是,我已经从应用程序级别调试了很长一段时间,当我在不同的文件中导入一个中间依赖项时,在某些情况下需要通用索引文件,在某些情况下需要相同库的es2017。

    因此,在这里的错误stacktrace中,我试图初始化Firebase的消息服务:(暂时忽略缺少的承诺拒绝)

        at Provider.getImmediate (index.cjs.js:153)                     // in component lib 
        at Module.getMessagingInWindow (index.esm2017.js:1155)          // in messaging lib
        at new MessagingWrapper (MessagingWrapper.js:76)                // in my application 
        at FirebaseSession.push.56916.FirebaseSession.getMessaging (FirebaseSession.js:96)
        at PushPubSubModule_Class.<anonymous> (PushPubSubModule.js:118)
        at step (PushPubSubModule.js:63)
        at Object.next (PushPubSubModule.js:44)
        at fulfilled (PushPubSubModule.js:35)
    

    最初加载消息传递模块时,它也会访问组件库,并使用正确的es2017索引文件,但在稍后我尝试实际获取消息传递服务实例时,它会转到另一个常规索引文件。

    在所有情况下,我都使用与中相同的导入 import {somthing} from "@firebase/messaging"

    我从来没有真正需要担心这些事情,可能会错过一些基本的东西,但这感觉像是一个预先确定从嵌套库加载哪个模块的网页错误。。。

    你知道我能强迫webpack解析es2017索引文件的方法吗? 还是我应该打开一个虫子?


    更多详情:

    这是我的MessagingWrapper文件的传输代码:

    enter image description here

    第71行:转到消息库中正确的es2017索引文件和组件库中正确的es2017

    其中第76行:指向消息传递中正确的es2017索引文件

    行: enter image description here

    这里第1155行:实际上是到 firebase/应用程序 lib es2017文件来解析提供程序,返回到第1155行,然后调用getImmediate,它最终位于组件库中的常规索引文件中,如下所示:

    enter image description here

    我该怎么解决这个问题?

    0 回复  |  直到 4 年前
        1
  •  1
  •   samthecodingman    4 年前

    @firebase/* 包是内部的,您不应该在代码中导入它们,因为每个包上都有警告 npm directory listing 。遇到这种情况时,可能会导致模块分辨率出现问题,因为直接访问内部组件基本上会跳过内部设置步骤。

    相反,可以通过以下方式使用公共API接口: firebase/* (适用于v9+或旧版SDK v8及更低版本上的模块化SDK)和 firebase/compat/* (适用于v9+上的旧版SDK。