3

在一个基本的 kotlin js 项目中,我导入了firebase依赖项。我使用Dukat来访问类型引用并让它们编译。我的 kotlin 编译起来就像一个魅力,但在我看来,由 webpack 创建的包最终不包含 firebase 库。

我做了什么 :

  • 下载火力基地 ( npm install firebase)
  • 在其上运行 Dukat 以生成声明 ( dukat firebase/app/dist/app/index.d.ts)。
  • 将生成的文件复制到我的 Kotlin JS 项目中。

在此处输入图像描述

经过一些更改,我的 Kotlin 编译良好。然而,在运行它时,我Uncaught ReferenceError: firebase is not defined error在前端面临着一个。这个错误发生使用 firebase 的代码被调用之前,所以我认为问题来自捆绑。

这是我的堆栈跟踪:

sample-firebase.js:391 Uncaught Error: Cannot find module 'firebase'
    at webpackMissingModule (sample-firebase.js:3)
    at eval (sample-firebase.js:3)
    at eval (sample-firebase.js:8)
    at Object../kotlin-dce-dev/sample-firebase.js (sample-firebase.js:359)
    at __webpack_require__ (sample-firebase.js:388)
    at sample-firebase.js:1447
    at sample-firebase.js:1450
    at webpackUniversalModuleDefinition (sample-firebase.js:17)
    at sample-firebase.js:18
[webpack-dev-server] Module not found: Error: Package path . is not exported from package /Users/julien/Developer/kotlin-samples/sample-firebase/build/js/node_modules/firebase (see exports field in /Users/julien/Developer/kotlin-samples/sample-firebase/build/js/node_modules/firebase/package.json)

这是我的客户端代码(唯一真正有趣的行是包含initializeApp.

fun main() {
    val firebaseConfig: Json = json(...)

    val fire = initializeApp(firebaseConfig)
    console.log(fire)
    window.onload = {
        console.log(sorted(arrayOf(1, 2, 3)))
        startFirebase();
        document.body?.sayHello() } }

注释掉与 firebase 相关的代码会完全消除错误(但显然也不会添加 firebase 功能)。

我的客户在这里。您可以通过./gradlew run在 sample-firebase 模块中运行来重现。

我已经尝试了很多东西:

  • 默认情况下,Dukat 为 Kotlin 声明生成包名称。我试图删除它们,但这似乎对错误没有影响。
  • 我试图从我的客户端(`require(“firebase”))直接导入firebase,以确保它被捆绑,但这也没有成功。
  • 最后,我还尝试向另一个 npm 包声明一个实现依赖项,并使用文档中描述的自制声明导入这个。这个工作就像一个魅力。
  • 该错误也会在运行 javascript 之前发生,因此它看起来像是运行时包的导入问题。

有什么方法可以找到我编译的 Kotlin 声明之间的差异,并且不会抛出错误,而我的前端只是无法导入 firebase?

4

1 回答 1

3

Dukat 仍处于试验阶段。使用手工包装。像这样的东西:

external interface FirebaseOptions{
}

external interface FirebaseAppSettings{
    var setting: String  // needed settings
}

external interface FirebaseApp{
}

@JsModule("firebase/app")
@JsNonModule
external val firebaseModule: dynamic

val initializeApp: (options: FirebaseOptions, config: FirebaseAppSettings) -> FirebaseApp = firebaseModule.initializeApp

添加到 build.gradle:

implementation(npm("firebase", "9.1.3"))

并使用它:

fun main() {
    val options: dynamic = object {}
    val config: dynamic = object {}
    config["setting"] = "xxx"
    val firebaseApp = initializeApp(
        options.unsafeCast<FirebaseOptions>(),
        config.unsafeCast<FirebaseAppSettings>()
    )
    console.log(firebaseApp)
}
于 2021-10-22T09:17:15.430 回答