Властивість 'firebase' не існує для типу {production: boolean; }


80

Тому я намагався створити та розгорнути свою програму Angular 4 для виробництва як на Firebase, так і на Heroku, але я натрапив на помилку наступним чином:

ПОМИЛКА в / Users / ... / ... (57,49): Властивість 'firebase' не існує у типі '{production: boolean; } '.

Це відбувається, коли я запускаю ng build --prod, і мої сервери розгортання працюють абсолютно нормально. Ось мій файл app.module.ts для довідки:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { AngularFireModule } from 'angularfire2';
import { AngularFireDatabaseModule } from 'angularfire2/database';
import { Ng2ScrollimateModule } from 'ng2-scrollimate';
import { Ng2PageScrollModule } from 'ng2-page-scroll';

import { HttpModule } from '@angular/http';
import { trigger, state, style, animate, transition, keyframes } from '@angular/animations';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { environment } from '../environments/environment';

import { AppComponent } from './app.component';

import { LogoComponent } from './logo/logo.component';
import { InfoComponent } from './info/info.component';
import { AboutComponent } from './about/about.component';
import { DividerComponent } from './divider/divider.component';
import { ProficienciesComponent } from './proficiencies/proficiencies.component';
import { ProficiencyComponent } from './proficiency/proficiency.component';
import { PortfolioComponent } from './portfolio/portfolio.component';
import { ProjectComponent } from './project/project.component';
import { ResumeComponent } from './resume/resume.component';
import { FooterComponent } from './footer/footer.component';
import { ContactComponent } from './contact/contact.component';
import { LoadingComponent } from './loading/loading.component';

@NgModule({
  declarations: [
    AppComponent,
    LogoComponent,
    InfoComponent,
    AboutComponent,
    DividerComponent,
    ProficienciesComponent,
    ProficiencyComponent,
    PortfolioComponent,
    ProjectComponent,
    ResumeComponent,
    FooterComponent,
    ContactComponent,
    LoadingComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    BrowserAnimationsModule,
    AngularFireModule.initializeApp(environment.firebase),
    AngularFireDatabaseModule,
    Ng2ScrollimateModule,
    Ng2PageScrollModule.forRoot(),
  ],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}

оточення.prod.ts

export const environment = {
  production: true
};

довкілля.ц

export const environment = {
  production: true,
  firebase: {
    apiKey: '...',
    authDomain: 'project.firebaseapp.com',
    databaseURL: 'https://project.firebaseio.com',
    projectId: 'project',
    storageBucket: 'project.appspot.com',
    messagingSenderId: '...',
  },
};

Після вивчення StackOverflow та GitHub можливих рішень, здається, немає розробників, які зіткнулися з цією точною помилкою та опублікували свої висновки, тому мені було цікаво, чи хтось знає, як піти на вирішення цієї проблеми. Велике спасибі заздалегідь!


Як виглядає ваш environmentімпорт?
еко

@echonax Дозвольте мені оновити питання до вас за допомогою мого коду.
Ентоні Кривонос

Відповіді:


197

При запуску ng build --prodкутовим клі буде використовувати environment.prod.tsфайл і ваші environment.prod.tsфайли environmentзмінний не має firebaseполе , отже , ви отримуєте виняток.

Додайте поле до environment.prod.ts

export const environment = {
  production: true,
  firebase: {
    apiKey: '...',
    authDomain: 'project.firebaseapp.com',
    databaseURL: 'https://project.firebaseio.com',
    projectId: 'project',
    storageBucket: 'project.appspot.com',
    messagingSenderId: '...',
  },
};

12
Ви, сер, рятуєте життя. Мені потрібно було лише скопіювати свій environment.tsкод у свій environment.prod.tsфайл. Потім я просто побіг: ng build --prodі firebase deploy.
Ентоні Кривонос

1
@AnthonyKrivonos рада, що я могла допомогти :-)
еко

Я згоден, тепер я отримую firebase не є частиною .... поки я додав його в обидва середовища
user7082181

6

Мій підхід полягає в об’єднанні об’єкта загального середовища з продуктом. Ось моє середовище.prod.ts :

import { environment as common } from './environment';

export const environment = {
  ...common,
  production: true
};

Отже, об’єкт загального середовища діє як стандартний за замовчуванням для всіх інших середовищ.


Мені такий підхід виглядає добре, але не впевнений, чому Angular 7 cli показує попередження, ** ПОПЕРЕДЖЕННЯ у виявленій циркулярній залежності: src \ environment \ \ environment.ts -> src \ environment / \ environment.ts **
user2243747

3

Я ненавиджу дублікати в коді,
тому давайте створимо окремий файл із іменем environments/firebase.tsвмісту

export const firebase = {
    //...
};

використання

import {firebase} from '../environments/firebase';
//...
AngularFireModule.initializeApp(firebase)

все зрозуміло як для мене


Отже, як це подолає проблему, що коли буде викликано ng build --prod, він буде включати цей файл, а коли буде викликано ng serve, він буде викликати інший?
еко

@echonax так, я бачу це у main.<hash>.jsфайлі
Влад

Я не знаю, що це означає, але дозвольте мені сказати це так; коли OP викликає ng serve, шукатиме angular-cli, environment.tsа коли ng build --prodбуде викликаний - angular-cli environment.prod.ts. Роблячи це, як ваша відповідь, як прод, так і середовище розробки використовуватимуть одну і ту ж конфігурацію.
еко

1

Я отримав ту саму помилку, оскільки помилково написав слово "firebase", як "firebas"

firebas: {apiKey: "...", authDomain: "project.firebaseapp.com", databaseURL: " https://project.firebaseio.com ", projectId: "project", storageBucket: "project.appspot.com" , messagingSenderId: "..."}


-12

Переконайтесь, що між firebaseі :.

Тобто має бути firebase:, а не firebase :.


Бачу, деякі люди проголосували за цю відповідь. Однак у моєму випадку ця відповідь вирішила проблему, з якою я стикався. Дякую!
Енні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.