无法在 HTML 中的脚本模块内初始化 Firebase APP

Not able to Initialize Firebase APP inside script module in HTML

我正在使用 Preact 和 Firebase 进行一个最小的(概念验证)项目。

单个 HTML 文件,由于 HTM 作为 JSX 替代品,bundler/transpiler 免费。

相关代码如下:

            useEffect(() => {
                let isSuscribed = true
                const initFirebase = async () => {

                    let initApp = initializeApp || (await import('https://www.gstatic.com/firebasejs/9.6.10/firebase-app.js')).initializeApp
                    if (!initializeApp) {
                        setInitializeApp(initApp)
                    }


                    let getDB = getFirestore || (await import('https://www.gstatic.com/firebasejs/9.6.10/firebase-firestore.js')).getFirestore
                    if (!getFirestore) {
                        setGetFirestore(getDB)
                    }

                    const fireApp = initApp(firebaseConfig)
                    const appDB = getDB(fireApp)

                    if (isSuscribed) {
                        setFirebase(fireApp)
                        setDB(appDB)
                    }
                }
                if (firebaseConfig)
                    initFirebase()
                        .catch(e => {
                            console.log(e);
                        })

                return () => isSuscribed = false
            }, [firebaseConfig])

当从 <input type="file"/> 加载 firebaseConfig(JSON 文件)时,它成功导入 initializeApp从提供的 CDN 中获取 Firestore

但不管我是使用firebaseConfig数据还是直接使用项目id returns:

FirebaseError: "projectId" not provided in firebase.initializeApp.

这也不行:

initApp({ projectId: 'project-id' })

所有内容都在 <script type="module"> 标签内。

问题已解决。

我认为代理变量 initApp 导致了这个问题。 我改变了 initializeApp 的导入方式,它成功了。

            useEffect(() => {
                let isSuscribed = true
                const initFirebase = async () => {
                    try {
                        const [
                            { initializeApp },
                            { getFirestore, collection, addDoc }
                        ] = await Promise
                            .all([
                                import('https://www.gstatic.com/firebasejs/9.6.10/firebase-app.js'),
                                import('https://www.gstatic.com/firebasejs/9.6.10/firebase-firestore.js')
                            ])

                        const fireApp = initializeApp(firebaseConfig)
                        const appDB = getFirestore(fireApp)

                        if (isSuscribed) {
                            setFirebase(fireApp)
                            setDB(appDB)
                            setResult('success')
                        }
                    } catch (e) {
                        console.log(e);
                        setResult('error')
                    }
                }

                if (firebaseConfig) {
                    initFirebase()
                        .catch(e => {
                            console.log(e);
                        })
                }

                return () => isSuscribed = false
            }, [firebaseConfig])