首页 > 解决方案 > 使用 TypeScript 和 Yarn 导入 'namespace/module' 和 import '@namespace/module' 的区别?

问题描述

关于一个不相关的问题,我们想知道来自 Google Firebase 支持的 Doug,如果导入包的不同方式可能是错误的来源。

文档告诉使用 Typescript 和 npm 这样做:

import * as firebase from "firebase/app";
import "firebase/auth";
import "firebase/firestore";

我使用 Yarn 和 Lerna,以及 Typescript 3.9。它要求我使用命名空间/模块语法在导入的开头添加一个 @,否则它会抱怨不是 url 友好的字符。

我用:

import firebase from "@firebase/app";
import "@firebase/auth";
import "@firebase/firestore";

这两个选项实际上是否不同,以至于第二个选项可能会触发第一个选项中不会发生的错误,只是因为这个 @ ?

谢谢

标签: typescriptfirebasenpmyarnpkglerna

解决方案


两种不同的导入路径意味着两种不同的东西:

  1. import "@firebase/auth"表示您正在导入@firebase/authNPM 包。这意味着包本身在 NPM 中发布为@firebase/auth
  2. import "firebase/auth"表示您正在从包中导入auth文件夹firebase

看着@firebase/auth它说的自述文件

此软件包不适合直接使用,只能通过官方支持的firebase软件包使用。

这似乎支持您应该使用该firebase包并导入其子文件夹之一的文档。

关于您的另一个问题:您实际上使用了哪个包裹npm install

因为如果你使用的是你应该安装的firebasefirebase/auth而不是- 这不是它自己的 NPM 模块 - 或者@firebase/auth不适合直接使用。

如果您确实安装@firebase/auth了这将解释为什么 TypeScript 无法在firebase/auth路径中找到类型,因为这与您安装的包不同。


推荐阅读