使用 Typescript 创建 Firebase 云函数时出现“找不到名称‘ServiceWorkerRegistration’”错误
Posted
技术标签:
【中文标题】使用 Typescript 创建 Firebase 云函数时出现“找不到名称‘ServiceWorkerRegistration’”错误【英文标题】:"Cannot find name 'ServiceWorkerRegistration'" error when creating a firebase cloud function using Typescript 【发布时间】:2018-12-07 00:15:36 【问题描述】:当我在安装了模块 firebase
的情况下部署云功能时收到以下错误(下图)。
我尝试安装 @types/firebase
和 firebase
并收到相同的错误。我很确定这个错误与这个模块有关,因为当firebase
和@types/firebase
都被卸载时,函数会正确部署。
另外,云函数还没有调用这个模块,所以我认为错误不在函数中。我已经为我的package.json
文件和ts.config
文件提供了代码。知道为什么会出现此错误以及如何导入模块而不会出现此错误吗?让我知道是否还有其他文件值得审查。谢谢。
./package.json
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts":
"lint": "./node_modules/.bin/tslint -p tslint.json",
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log",
"build": "./node_modules/.bin/tsc"
,
"dependencies":
"dom": "0.0.3",
"expo-server-sdk": "^2.4.0",
"firebase-admin": "~5.12.1",
"firebase-functions": "^1.0.3",
"typescript": "^2.9.2"
,
"devDependencies":
"eslint": "^4.12.0",
"eslint-plugin-promise": "^3.6.0",
"ts-loader": "^4.4.2"
,
"main": "lib/index.js",
"private": true
./tsconfig.json
"compilerOptions":
"lib": ["es6"],
"module": "commonjs",
"noImplicitReturns": true,
"outDir": "lib",
"sourceMap": true,
"target": "es6",
"allowJs": true,
,
"compileOnSave": true,
"include": [
"src"
]
【问题讨论】:
你可能不想在云函数中使用firebase
,而是firebase-admin
【参考方案1】:
如果您像我一样确实需要在云功能中使用客户端 firebase 模块,则问题以及解决方法在 #880 中进行了描述:
解决方法是将
"dom"
添加到tsconfig.json
中的"lib"
编译器选项我们的包假定存在 DOM 类型。问题是导入
firebase/app
会导入所有包的类型。我们的一些包(如 Messaging)只能在浏览器中运行。不应在 Node 环境中导入这些包(或其类型)。
编辑:这是发布在问题线程中的更安全的答案
这里建议/推荐的将“dom”添加到 compilerOptions.lib 的解决方法是不安全的。这将告诉编译器任何和所有 dom 类型引用在我的代码中都是有效的,这显然不是这种情况,因为 Node.js 不是浏览器环境。如果这个库打算用作 Node.js TypeScript 库,那么它不应该依赖于环境 dom 特定的类型定义。 TypeScript 3.0 用户更安全的解决方法是按如下方式导入 firebase:
/// <reference lib="dom" />
import * as firebase from 'firebase';
第一行是 TypeScript 3.0 中首次提供的“三斜杠 lib 指令”(https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html)。这就像将 dom 添加到 compilerOptions.lib 但仅针对那个文件。请注意,三斜杠指令必须出现在任何语句之前,否则它会被解释为普通注释。
【讨论】:
就我而言,我可以通过不从"firebase/app"
导入任何内容来解决此问题(例如,我将import firestore from 'firebase/app';
更改为import firestore from 'firebase-admin';
)
这个答案非常接近,但更好的解决方案(和推理)是这个评论在#880 github.com/firebase/firebase-js-sdk/issues/…
更安全的答案实际上并不安全,因为包含的定义不仅仅局限于该包含的文件。见github.com/firebase/firebase-js-sdk/issues/…。【参考方案2】:
我过去曾多次遇到过这个问题。您可以尝试将以下内容添加到您的 tsconfig.json:
tsconfig.json:
"files": [
"node_modules/typescript/lib/lib.es6.d.ts"
],
"exclude": [
"node_modules"
]
所以你完整的 tsconfig.json 应该如下所示:
"compilerOptions":
"lib": ["es6"],
"module": "commonjs",
"noImplicitReturns": true,
"outDir": "lib",
"sourceMap": true,
"target": "es6"
,
"compileOnSave": true,
"include": [
"src"
],
"files": [
"node_modules/typescript/lib/lib.es6.d.ts"
],
"exclude": [
"node_modules"
]
【讨论】:
谢谢你修复了它,但你能告诉我为什么吗??【参考方案3】:Michael 的评论是正确的,因此将其标记为已回答。我使用的是firebase
,但应该一直使用firebase-admin
。
【讨论】:
我不同意这一点。例如,“firebase”包是您可以从云功能发送密码重置电子邮件的唯一方法。 这不是这个问题的正确答案。使用 firebase-admin SDK,您无法发送默认重置密码,您只需获取 url 链接,然后您需要自行发送。 我赞成这个。就我而言,我有一个项目,firebase
安装在根包上,firebase-admin
安装在 /functions 包上。在我的一个文件中,我正在导入 firebase
以获得某种类型,这是不正确的,因为 firebase
使用 DOM 库。我应该从 firebase-admin
导入。以上是关于使用 Typescript 创建 Firebase 云函数时出现“找不到名称‘ServiceWorkerRegistration’”错误的主要内容,如果未能解决你的问题,请参考以下文章
firebase 云功能中带有 typescript 的 firebase-admin
找不到模块“firebase”或其相应的类型声明。 React + TypeScript + Firebase
如何使用 Typescript 从 firebase-admin 导入 FieldValue?
Typescript:更新 Firebase 函数依赖项时出现编译错误