使用 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/firebasefirebase 并收到相同的错误。我很确定这个错误与这个模块有关,因为当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 函数依赖项时出现编译错误

在节点服务器 Typescript 文件中使用 Firebase

用户的 Firebase v8 Typescript 定义导入