如果将firebase包含到HTML中,它将使用firebase
变量填充全局名称空间。这可以用于配置Firebase,登录等。例如,标准配置代码段如下所示:
<script src="https://www.gstatic.com/firebasejs/5.8.5/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
// private stuff ...
};
firebase.initializeApp(config);
</script>
但是,我正在使用打字稿,却偶然发现了一个奇怪的问题。
我用npm安装了Firebase(它附带了:D)
npm install --save firebase
但是看起来打字稿定义迫使您使用模块语法。可以使用以下代码(根据打字稿编译器):
import firebase from 'firebase'
var config = {//...}
firebase.initializeApp(config);
如果没有import语句,则编译器会警告Firebase不存在。这让我感到惊讶。诚然,如果您从节点使用Firebase,则假定使用模块系统是有意义的。因此,基于模块的定义才有意义。但是,也应该有针对网络版本的定义。
因此,我查看了实际安装的节点软件包。这是我的package.json
{
"name": "test_sites",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@types/jquery": "^3.3.29",
"firebase": "^5.8.5",
"jquery": "^3.3.1"
}
}
如果将此选项提供给npm install -d
,则实际上会安装两个节点模块。一个称为@firebase
,另一个称为firebase
。
@firebase
定义都是基于模块的,firebase
定义看起来像是用于Web客户端代码的。默认情况下会以某种方式发现模块类型定义(how does the typescript compiler discover npm packages with types?),而其他类型则不会。
好吧,所以我编辑了tsconfig.json以包括Firebase定义:
{
...
typeRoots": ["./node_modules/@types", "node_modules/firebase"],
}
现在,打字稿编译器可以愉快地使用我在最顶部包含的代码片段,而无需导入模块。但是tsconfig.json被标记为错误:
Cannot find type definition file for 'dist'
获取客户端Firebase(无模块)类型的正确方法是什么?