Firebase-js-sdk: Cannot read property 'navigator' of undefined

Created on 26 Aug 2018  路  15Comments  路  Source: firebase/firebase-js-sdk


[REQUIRED] Describe your environment

  • Operating System version: Mac OS Mojave
  • Browser version: Chrome Canary
  • Firebase SDK version: Latest 5,4,1
  • Firebase Product: all

[REQUIRED] Describe the problem

Steps to reproduce:

When I try to initialize firebase I can error in chrome:
auth.esm.js:10 Uncaught TypeError: Cannot read property 'navigator' of undefined at auth.esm.js:10 at Object.<anonymous> (auth.esm.js:315) at Object../node_modules/@firebase/auth/dist/auth.esm.js (main.bundle.js:11217) at __webpack_require__ (bootstrap:723) at fn (bootstrap:100) at Object../node_modules/firebase/dist/index.cjs.js (index.cjs.js:7) at __webpack_require__ (bootstrap:723) at fn (bootstrap:100) at Object../src/app/app.component.tsx (app.component.tsx:4) at __webpack_require__ (bootstrap:723)
I am not sure how to fix this, seems to be that when bundling firebase, the code breaks somehow.

Relevant Code:

File where I initialize firebase:
````
import * as React from 'react';
import { Link, Route } from 'react-router-dom';

import firebase from 'firebase';
import 'firebase/auth';

import { environment } from '../environments/environment.dev';
import { authState } from 'rxfire/auth';

import './app.component.scss';

interface State {
toggleDropdown: boolean;
}

export class AppComponent extends React.Component<{}, State> {

user: firebase.User;

constructor(props: any) {
super(props);

this.state = { toggleDropdown: false };

firebase.initializeApp(environment.firebase);

this.onAccountToggle = this.onAccountToggle.bind(this);

}

componentWillMount(): void {
authState(firebase.auth()).subscribe(u => (this.user = u));
}

onAccountToggle() {
this.setState({ toggleDropdown: !this.state.toggleDropdown });
}

render() {
let accountToggle;
if (this.state.toggleDropdown) {
accountToggle =


Account
Logout

} else {
accountToggle = null;
}

return <div className='container'>
  <nav className='nav'>
    <div className='container'>
      <div className='links'>
        <Link to="/">Home</Link>
        <Link to="/activity">Activity</Link>
        <Link to="/wallet">Wallet</Link>
        <Link to="/help">Help</Link>
        <a className='account' onClick={this.onAccountToggle}>Account</a>
        {accountToggle}
      </div>
    </div>
  </nav>
  <div>
    { JSON.stringify(this.user) }
  </div>
</div>

}

}
Webpack:
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
mode: 'development',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].bundle.js'
},
devtool: 'source-map',
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.scss']
},
module: {
rules: [
{
test: /.(ts|tsx)$/,
loader: 'ts-loader'
},
{
test: /.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader',
{
loader: 'postcss-loader',
options: {
plugins: () => ([
require('autoprefixer'),
require('precss')
])
}
}
]
},
{ enforce: 'pre', test: /.js$/, loader: 'source-map-loader' }
]
},
plugins: [
new HtmlWebpackPlugin({ template: path.resolve(__dirname, 'src', 'index.html') }),
new webpack.HotModuleReplacementPlugin()
]
}

````

https://stackblitz.com/fork/firebase-issue-sandbox

// TODO(you): code here to reproduce the problem

Thanks for any help.

core

Most helpful comment

I'm having this issue too with Babel preset env.

For the time being going back to 4.12.1 works.

npm remove firebase
npm install [email protected]

All 15 comments

Hey there! I couldn't figure out what this issue is about, so I've labeled it for a human to triage. Hang tight.

Hey @tcaer, does this only happen in version 5.4.1? Can you check previous versions to help us isolate the cause?
I have an idea why this may be happening and have a patch to fix it: https://github.com/firebase/firebase-js-sdk/pull/1166

Hi, this also happens in version 5.4.0, 5.3.0, and 5.2.0. Perhaps this may also be a problem with webpack? I left my configuration in my original post but it seems weird that so many versions of firebase would be produced with this type of issue in it.

Hmm, I don't think this is related to Auth. I merged the tweak to the code I mentioned, but I doubt it is related to this. Seems likely related to your webpack setup. Can't really say with the information I have.

I'm having this issue too with Babel preset env.

For the time being going back to 4.12.1 works.

npm remove firebase
npm install [email protected]

Not sure if it is going to solve the issue, but it is problematic to import both firebase and firebase/auth.
firebase package is an all in one package and includes all components including firebase/auth. We encourage developers to include only components they use. You can do the following instead:

import firebase from 'firebase/app'
import 'firebase/auth'

Thanks for the tip, installing [email protected], fixed the issue for me too.

I'm having this issue too with Babel preset env.

For the time being going back to 4.12.1 works.

npm remove firebase
npm install [email protected]

The tip worked and I'm back up and running. Thanks a bunch @PierBover

If anyone has further info as to why this is happening under the hood, and how to arrive at a solution that works with the current version of firebase auth, please share :).
I don't understand how the babel preset env could torpedo the firebase auth module, but would love to learn what is going on here.

@tcaer @TimmDay @PierBover Can you please provide a minimal code/config example that reproduces this issue?
I was not able to reproduce it with Babel preset env.

Sure. I can't attest to whether the babel env was the actual perpetrator causing the clash, just that rolling back to [email protected] allowed me to use the 'auth' module again with my current set up.

Here are all the other dependencies in my package.json. It is quite possible that I have missed something obvious.

{
  "name": "factory_display",
  "version": "1.0.7",
  "main": "index.js",
  "author": "Tim Day",
  "license": "MIT",
  "scripts": {
    "build:dev": "webpack",
    "build:prod": "webpack -p --env production",
    "dev-server": "webpack-dev-server",
    "start": "node server/server.js",
    "test": "jest --config=jest.config.json",
    "build-babel": "babel src/app.js --out-file=public/scripts/app.js --presets=env,react --watch",
    "heroku-postbuild": "yarn run build:prod"
  },
  "dependencies": {
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-plugin-transform-object-rest-spread": "^6.26.0",
    "babel-preset-env": "1.5.2",
    "babel-preset-react": "6.24.1",
    "css-loader": "^0.28.11",
    "enzyme-adapter-react-16": "^1.2.0",
    "express": "4.16.0",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "firebase": "4.12.1",
    "moment": "2.18.1",
    "node-sass": "^4.8.3",
    "normalize.css": "^8.0.0",
    "numeral": "2.0.6",
    "raf": "^3.4.0",
    "react": "^16.3.1",
    "react-addons-shallow-compare": "15.6.0",
    "react-dates": "12.7.0",
    "react-dom": "^16.3.1",
    "react-modal": "^3.3.2",
    "react-redux": "^5.0.7",
    "react-router-dom": "^4.2.2",
    "redux": "^4.0.0",
    "redux-mock-store": "^1.5.3",
    "redux-thunk": "^2.3.0",
    "sass-loader": "^6.0.7",
    "style-loader": "^0.20.3",
    "uuid": "^3.2.1",
    "validator": "^9.4.1",
    "webpack": "^4.5.0"
  },
  "devDependencies": {
    "enzyme": "^3.4.1",
    "enzyme-to-json": "^3.3.4",
    "jest": "^23.1.0",
    "react-test-renderer": "^16.4.2",
    "webpack-cli": "^2.0.13",
    "webpack-dev-server": "^3.1.3"
  }
}

The issue only happened when I was using the current version of firebase, and require('firebase/auth');
The other firebase modules (I tested database, messaging, functions) all ran without an issue.

I doubt I will have time to create a repro... but here are my babel dependencies:

    "babel-polyfill": "^6.26.0",
    "babel-preset-es2017": "^6.24.1",
    "babel-core": "^6.22.1",
    "babel-eslint": "^7.1.1",
    "babel-loader": "^6.2.10",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-preset-env": "^1.2.1",
    "babel-preset-stage-2": "^6.22.0",
    "babel-register": "^6.22.0",

And my .babelrc:

{
  "presets": [
    ["env", { "modules": false }],
    "es2017",
    "stage-2"
  ],
  "plugins": ["transform-runtime"],
  "comments": false,
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": [ "istanbul" ]
    }
  }
}

This is a Vue project btw, although I doubt that's relevant.

@TimmDay @PierBover Thank you for the quick response. The problem is the older babel preset env doesn't recognize iife invoked by call correctly and map this to undefined. We have made a fix here: https://github.com/firebase/firebase-js-sdk/pull/1291

As an alternative to waiting for the fix to be released, you can upgrade to babel 7 at the mean time.

I had a similar issue. I was able to resolve it by changing my target from es2015 to es5 in my tsconfig.json file. I hope this can help someone.

Was this page helpful?
0 / 5 - 0 ratings