模块分辨率与 esm 和非 esm 文件不一致
Module resolution not consistent with esm and non esm files
我有一个项目设置,其中有一个 Web 应用程序依赖于几个 Firebase SDK,这些 SDK 是 Webpacked 并通过 webpack 开发服务器提供服务。
从我可以收集到的信息来看,没有过多的细节,有一个最终的依赖项,它既有通用索引,也有 es2017 索引文件
有一些中间依赖项也有两者,比如 app 和一些只有 es2017 例如 messaging,还有一些只有一般索引文件。
我遇到的问题是,我已经调试了很长时间,当我在不同文件中导入中间依赖项时,从我的应用程序级别,在某些情况下它采用通用索引文件,而在某些情况下同库的es2017.
所以在错误堆栈跟踪中,我正在尝试初始化 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 错误,它预先确定从嵌套库加载哪个模块...
你知道我可以强制 webpack 解析 es2017 索引文件的方法吗?
还是我应该打开一个错误?
更多详情:
这是我的 MessagingWrapper 文件的转译代码:
第 71 行:转到消息库中正确的 es2017 索引文件和组件库中正确的 es2017
第 76 行:转到消息中正确的 es2017 索引文件
行:
和第 1155 行:实际上转到 firebase/app lib es2017 文件来解析提供程序,返回到第 1155 行,然后调用 getImmediate,最终在组件库的通用索引文件中,如下所示:
我该如何解决这个问题?
@firebase/*
包是内部包,您不应该按照每个 npm directory listing 上的警告在您的代码中导入它们。正如您所遇到的,这可能会导致模块解析出现问题,因为您实际上是通过直接访问内部结构来跳过内部设置步骤。
相反,通过 firebase/*
(对于 v9+ 上的模块化 SDK 或旧版 SDK v8 及更低版本)和通过 firebase/compat/*
(对于v9+ 上的旧版 SDK)。
我有一个项目设置,其中有一个 Web 应用程序依赖于几个 Firebase SDK,这些 SDK 是 Webpacked 并通过 webpack 开发服务器提供服务。
从我可以收集到的信息来看,没有过多的细节,有一个最终的依赖项,它既有通用索引,也有 es2017 索引文件
有一些中间依赖项也有两者,比如 app 和一些只有 es2017 例如 messaging,还有一些只有一般索引文件。
我遇到的问题是,我已经调试了很长时间,当我在不同文件中导入中间依赖项时,从我的应用程序级别,在某些情况下它采用通用索引文件,而在某些情况下同库的es2017.
所以在错误堆栈跟踪中,我正在尝试初始化 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 错误,它预先确定从嵌套库加载哪个模块...
你知道我可以强制 webpack 解析 es2017 索引文件的方法吗? 还是我应该打开一个错误?
更多详情:
这是我的 MessagingWrapper 文件的转译代码:
第 71 行:转到消息库中正确的 es2017 索引文件和组件库中正确的 es2017
第 76 行:转到消息中正确的 es2017 索引文件
行:
和第 1155 行:实际上转到 firebase/app lib es2017 文件来解析提供程序,返回到第 1155 行,然后调用 getImmediate,最终在组件库的通用索引文件中,如下所示:
我该如何解决这个问题?
@firebase/*
包是内部包,您不应该按照每个 npm directory listing 上的警告在您的代码中导入它们。正如您所遇到的,这可能会导致模块解析出现问题,因为您实际上是通过直接访问内部结构来跳过内部设置步骤。
相反,通过 firebase/*
(对于 v9+ 上的模块化 SDK 或旧版 SDK v8 及更低版本)和通过 firebase/compat/*
(对于v9+ 上的旧版 SDK)。