2016-12-15 3 views
4

Я пытаюсь получить приложение Angular2 quickstart для работы с Firebase (см. Это repository). Я установил последнюю версию Firebase, попытался загрузить firebase с помощью SystemJS (см. systemjs.config.js) и попытался импортировать firebase и использовать функцию initializeApp (см. app.component.ts). Тем не менее, я продолжаю получать ошибку firebase.initializeApp is not a function в консоли браузера. Правильно ли я использую SystemJS для загрузки firebase.js?Угловой 2 и Firebase SDK

Примечание: Для того, чтобы воспроизвести ошибку, вы просто должны быть в состоянии сделать npm install с последующим npm start.

+1

У меня были проблемы с Firebase и SystemJS при подготовке Plunker для проблемы AngularFire2. Мне пришлось использовать версию 3.4.0. В более поздних версиях в определениях TypeScript есть что-то, что SystemJS просто не нравится, но я не рассматривал его. – cartant

+0

@cartant: Да, возвращаясь к версии 3.4.0, похоже, проблема с SystemJS. Соответствующие файлы 'firebase.js', похоже, изменились между версиями 3.4 и 3.5. Более поздние версии (> 3.4), кажется, содержат все javascript в 'firebase.js' и не экспортируют модуль. В то время как v3.4 просто «требует» других файлов и экспортирует модуль «firebase».У меня есть ощущение, что это связано с отсутствием экспорта модулей в более поздних версиях, но не уверенно. –

+0

@artem: D'oh! Вот когда ты знаешь, что слишком долго смотришь на экран ... К счастью, только тестовая кровать - фу. Спасибо, что дали мне знать. –

ответ

5

Одно изменение: от

import * as firebase from 'firebase'; 

в

import {firebase} from 'firebase'; 

достаточно, чтобы сделать ваш пример работы с firebase 3.6.

Однако я бы сказал, что это работает случайно. firebase.js не выглядит как модуль вообще, он не использует module.exports или AMD define, он просто создает глобальную переменную firebase со следующими свойствами:

INTERNAL: Object 
Promise: Promise() 
SDK_VERSION: "3.6.4" 
User: (a, b, c) 
__esModule: true 
app: a(a) 
apps: (...) 
get apps:() 
auth: (c) 
database: (c) 
default: Object 
initializeApp: (a, c) 
messaging: (c) 
storage: (c) 
__proto__: Object 

Вероятно, это наличие __esModule, что делает SystemJS заворачивать в другом объекте - если вы посмотрите в отладчике в результате import * as firebase from 'firebase', он содержит одно свойство, также называемое firebase, которое является фактическим модулем, который вам нужен.

Интересно, что firebase.d.ts написана таким образом, что

import {firebase} from 'firebase'; 

firebase.initializeApp(...); 

работает, но, казалось бы, будут сброшены

import * as firebase from 'firebase'; 

firebase.firebase.initializeApp(...); 

не typecheck.

0

Существует обходной путь для этой проблемы here, и с ней я смог получить плунжер, работающий с последними версиями Firebase (3.6.7) и AngularFire2 (2.0.0-beta.7).

Как это работает, я понятия не имею, как я использую только SystemJS с Plunker, но включает в себя замену этого:

firebase: { 
    main: 'firebase.js' 
} 

с этим:

firebase: { 
    defaultExtension: 'js', 
    main: './firebase-browser.js' 
} 

в packages собственностью конфигурация, которая передается в System.config.

Смежные вопросы