import 'namespace/module' 和 import '@namespace/module' 与 TypeScript 和 Yarn 的区别?

Difference between import 'namespace/module' and import '@namespace/module' with TypeScript and Yarn?

我们想知道来自 Google Firebase 支持的 Doug,导入包的不同方式是否可能是错误的来源。

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

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

我使用 Yarn 和 Lerna,以及 Typescript 3.9。它要求我使用 namespace/module 语法在导入的开头添加一个 @,否则它会抱怨没有 url 友好字符。

我使用:

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

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

谢谢

两个不同的导入路径意味着两件事:

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

查看 @firebase/auth 自述文件说

This package is not intended for direct usage, and should only be used via the officially supported firebase package.

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

回复你的 :你实际上 npm install 是哪个包裹?

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

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