Upgrading to angular-6.x gives "Uncaught ReferenceError: global is not defined"

JavascriptAngularAngular CliAngular6

Javascript Problem Overview


I upgraded my project from angular-5.x to angular-6.x and it started giving the following error and even creation of dummy global variable does not work as given here https://stackoverflow.com/questions/50209019/angular-6-auth0-global-not-defined

The error is as follows:

Uncaught ReferenceError: global is not defined
    at Object../node_modules/has-binary2/index.js (index.js:10)
    at __webpack_require__ (bootstrap:81)
    at Object../node_modules/socket.io-parser/index.js (index.js:8)
    at __webpack_require__ (bootstrap:81)
    at Object../node_modules/socket.io-client/lib/index.js (index.js:7)
    at __webpack_require__ (bootstrap:81)
    at Object../src/app/app4pc/apiConnection/services/ApiConnectionServer.ts (auth.interceptor.ts:8)
    at __webpack_require__ (bootstrap:81)
    at Object../src/app/app4pc/apiConnection/toServer.module.ts (ApiConnectionServer.ts:11)
    at __webpack_require__ (bootstrap:81)

after resolving this I get following error:

Uncaught ReferenceError: process is not defined
    at Object../node_modules/process-nextick-args/index.js (index.js:3)
    at __webpack_require__ (bootstrap:81)
    at Object../node_modules/readable-stream/lib/_stream_readable.js (_stream_readable.js:26)
    at __webpack_require__ (bootstrap:81)
    at Object../node_modules/readable-stream/readable-browser.js (readable-browser.js:1)
    at __webpack_require__ (bootstrap:81)
    at Object../node_modules/simple-peer/index.js (index.js:7)
    at __webpack_require__ (bootstrap:81)
    at Object../src/app/util/services/call.services.ts (notification.service.ts:12)
    at __webpack_require__ (bootstrap:81)    

And continues on and on.

Javascript Solutions


Solution 1 - Javascript

Adding this line to polyfills.ts should resolve node global error

(window as any).global = window;

The solution was mentioned in this angular-cli issue thred

Solution 2 - Javascript

Add following code in your starting page e.g. index.html

var global = global || window;
var Buffer = Buffer || [];
var process = process || {
  env: { DEBUG: undefined },
  version: []
};

Example:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Client</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <script>
    var global = global || window;
    var Buffer = Buffer || [];
    var process = process || {
      env: { DEBUG: undefined },
      version: []
    };
  </script>
</head>
<body>
  <app-root>
    <div class="loader"></div>
  </app-root>
</body>
</html>

Above will work on hybrid app (in Node environment) as well as in browser

> - for "Uncaught ReferenceError: global is not defined": lang-js var global = global || window;

> - for "Uncaught ReferenceError: Buffer is not defined": lang-js var Buffer = Buffer || [];

> - for "Uncaught ReferenceError: process is not defined": lang-js var process = process || { env: { DEBUG: undefined } }

> - for "Uncaught TypeError: Cannot read property 'slice' of undefined": lang-js var process = process || { env: { DEBUG: undefined }, version: [] };

Solution 3 - Javascript

I use HttpClient and accidentally selected the default import which was 'selenium-webdriver/http'

If your app.module.ts has import { HttpClient } from 'selenium-webdriver/http';

Update it to import { HttpClient } from '@angular/common/http';

That fixed my issue.

Solution 4 - Javascript

adding this line into pollyfills.ts fixed my problem (just a workaround as @kemalbirinci said here)

(window as any).global = window;

Solution 5 - Javascript

In case, if your target is node in webpack (target: 'node'), because you want to fix "Can't resolve 'fs'. Then you're getting the following error Fix: "Uncaught ReferenceError: global is not defined" do it as follows node: { global: true, fs: 'empty' }. Bonus: if you got error "Uncaught ReferenceError: exports is not defined". simply add libraryTarget: 'umd'. The complete webpack config code is below.

const webpackConfig = {
  node: { global: true, fs: 'empty' }, // Fix: "Uncaught ReferenceError: global is not defined", and "Can't resolve 'fs'".
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  }
};

module.exports = webpackConfig; // Export all custom Webpack configs.

Many solutions have been proposed here: https://github.com/angular/angular-cli/issues/8160

Solution 6 - Javascript

Please be careful with using the top answer of adding the inline script to index.html. it will solve the immediate issue. However, if you are using SignalR, this will generate this error:

Error: Error parsing handshake response: TypeError: Right-hand side of 'instanceof' is not callable at HubConnection.push../node_modules/@microsoft/signalr/dist/esm/HubConnection.js.HubConnection.processHandshakeResponse

However, just defining global on its own will work and not break Signal R.

Solution 7 - Javascript

In my case, socket.io entry was missing from Package.JSON file. Please check it and install it to the package.

Solution 8 - Javascript

Adding the below lines in polyfills.ts worked fine for me after migrating to Angular v6.

(window as any).global = window;
global.Buffer = global.Buffer || require('buffer').Buffer;
global.process = require('process');

Answer taken from here

Solution 9 - Javascript

I don't know if this will help anyone understand their issue, I just thought I would inform anyone reading this who got the global not defined error on the user side to check your browser and/or device settings for pages asking for your location. I had just been inside the chrome browsers site settings and turned the option for location from ask first to blocked. The very next page I visited, the main content a data tableau exhibited this error message, soon as I toggled location back to ask first in chrome site settings and refreshed the page it loaded without error.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAtikur RahmanView Question on Stackoverflow
Solution 1 - JavascriptVojtechView Answer on Stackoverflow
Solution 2 - JavascriptAkhilesh KumarView Answer on Stackoverflow
Solution 3 - JavascriptTodd SkeltonView Answer on Stackoverflow
Solution 4 - JavascriptMalay MView Answer on Stackoverflow
Solution 5 - JavascriptDaniel DanieleckiView Answer on Stackoverflow
Solution 6 - Javascriptuser8037265View Answer on Stackoverflow
Solution 7 - JavascriptVibhor DubeView Answer on Stackoverflow
Solution 8 - JavascriptAkashView Answer on Stackoverflow
Solution 9 - Javascriptuser16256914View Answer on Stackoverflow