VSCode中的JavaScript React项目上的Firebase智能感知/自动补全

时间:2019-05-27 16:47:16

标签: reactjs firebase jsdoc

我正在开发一个React和Firebase项目,但是在我的代码上设置自动补全功能时遇到了麻烦(我正在使用VScode)。

这是到目前为止我得到的:


我如何为我的应用程序组件(通过上下文)提供Firebase


FirebaseContext.js

import React from 'react';

const FirebaseContext = React.createContext(null);

export default FirebaseContext;

firebase.js

import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import 'firebase/functions';

// .env file in root folder
const config = {
  apiKey: process.env.FIREBASE_APP_API_KEY,
  authDomain: process.env.FIREBASE_APP_AUTH_DOMAIN,
  databaseURL: process.env.FIREBASE_APP_DATABASE_URL,
  projectId: process.env.FIREBASE_APP_PROJECT_ID,
  storageBucket: process.env.FIREBASE_APP_STORAGE_BUCKET,
  messagingSenderId: process.env.FIREBASE_APP_MESSAGING_SENDER_ID
};

firebase.initializeApp(config);
firebase.functions().useFunctionsEmulator('http://localhost:5000');

export default firebase;

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import firebase from './helpers/firebase/firebase';
import FirebaseContext from './helpers/firebase/FirebaseContext';
import { BrowserRouter as Router} from "react-router-dom";

...

ReactDOM.render(

  // HERE'S HOW I'M PROVIDING FIREBASE FOR MY APP
  <FirebaseContext.Provider value={firebase}>
    <Router>
      <App/>
    </Router>
  </FirebaseContext.Provider>

,document.getElementById('root')
);

我如何在组件中使用Firebase


AddProductContainer.js

import React, { useEffect, useState, useCallback, useContext } from 'react';
import FirebaseContext from '../../../helpers/firebase/FirebaseContext';

function AddProductContainer() {

  const firebase = useContext(FirebaseContext);

  function saveToFirestore() {
    // I DON'T HAVE ANY AUTOCOMPLETION FROM 'FIREBASE...'
    firebase.firestore().collection('products').add({ 
      title: productDetails.title.newTitle,
      description: productDetails.description,
      categories: productDetails.categories
    });
  }

}

问题

如何在JavaScript项目中从Firebase获得自动补全功能?

注意:我所有的组件文件均为.js。我没有使用Typescript。

在这种情况下,是否可以使用JSDoc批注来访问自动完成功能?

类似的东西:

/** @type {firebase} */
const firebase = useContext(FirebaseContext);

1 个答案:

答案 0 :(得分:1)

在没有Typescript或类似内容的情况下,按照您的方式进行操作绝对是非常棘手的,但是我可以建议另一个选择吗?

我认为没有必要将firebase对象本身放在上下文中。如果您要使用多个应用程序或只是想显式显示,则将app放在上下文中可能是有道理的(从firebase.initializeApp返回的对象),但是firebase本身似乎会在使用它的任何文件中直接导入(import firebase from 'firebase/app')更有意义。它不会创建firebase的第二个实例,也不会创建任何您关心的东西,它只是firebase库的句柄。只要先运行firebase.initializeApp(),它将使用您用initializeApp()初始化的默认应用程序。 initializeApp()创建一个全局默认Firebase应用,任何Firebase方法调用都将使用该应用。

如果您对全局变量不满意,可以通过分配const app = firebase.initializeApp(...),然后通过props或context传递app,然后始终调用firebase包,来明确了解正在使用的特定应用程序以app作为参数,例如firebase.firestore(app).collection('products').etc...

但是将firebase软件包直接导入您正在使用的任何文件的顶部(并希望在其中自动完成)应该没有成本。