Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Undeclared use of node's process causes exception in browser #43

Closed
rvolgers opened this issue Nov 18, 2019 · 19 comments
Closed

Undeclared use of node's process causes exception in browser #43

rvolgers opened this issue Nov 18, 2019 · 19 comments
Labels

Comments

@rvolgers
Copy link

rvolgers commented Nov 18, 2019

Webpack 5 no longer ships polyfills for nodejs builtin modules, and recommends using this module if a module need util, and the module README does say it should work in a browser. However, the module causes a exception when importing the resulting bundle in the browser:

vendor.2cdb7b12f7e46077b4bd.js:92301 Uncaught ReferenceError: process is not defined

This is causes by this code, which expects to be able to use the nodejs process module without importing it:

if (process.env.NODE_DEBUG) {

@goto-bus-stop
Copy link
Member

right, we assume the bundler makes the node.js globals available. This may also happen for the Buffer global (don't recall if we use it). the solution would be to explicitly do require('process')

@rvolgers rvolgers reopened this Nov 18, 2019
@rvolgers
Copy link
Author

(Sorry for the noise, mistook the "Close and comment" button for a cancel button.)

Usually importing process would be the correct thing, but is there any downside to just doing a typeof(process) !== 'undefined' check in this case?

@goto-bus-stop
Copy link
Member

For the env check, that would be enough, but we also use process.nextTick in the callbackify implementation

@Fauxil-Fox
Copy link

Can we get a fix on this soon? Webpack v5 is now the main version.

@ljharb
Copy link
Member

ljharb commented Oct 11, 2020

The best fix, unfortunately, is to use ProvidePlugin in your config to replicate the functionality webpack 5 removed.

@brenc
Copy link

brenc commented Nov 9, 2020

I hit this one today as well. Like @ljharb said, looks like you can use ProvidePlugin like this:

// webpack needs to be explicitly required
const webpack = require('webpack')

module.exports = {

/* ... rest of the config here ... */

  plugins: [
    // fix "process is not defined" error:
    // (do "npm install process" before running the build)
    new webpack.ProvidePlugin({
      process: 'process/browser',
    }),
  ]
}

More here.

I wasn't 100% in love with using the process package for this project so I ended up using DefinePlugin instead:

plugins: [  
  new webpack.DefinePlugin({
    'process.env.NODE_DEBUG': JSON.stringify(process.env.NODE_DEBUG)
  })
]

Both solutions seem to work.

deiwin added a commit to deiwin/web-pong that referenced this issue Nov 14, 2020
@rufatZZ
Copy link

rufatZZ commented Nov 19, 2020

// webpack needs to be explicitly required
const webpack = require('webpack')

module.exports = {

/* ... rest of the config here ... */

  plugins: [
    // fix "process is not defined" error:
    // (do "npm install process" before running the build)
    new webpack.ProvidePlugin({
      process: 'process/browser',
    }),
  ]
}

@brenc Thanks you man soooo much for clear, referenced reply. This saved me so much time. after 5 days of stress. This worked for me. 2nd one magically didn't work. Because of other packages.

@imsys
Copy link

imsys commented Dec 20, 2021

if (typeof process !== 'undefined' && process?.env?.NODE_DEBUG) {

salemkode added a commit to salemkode/node-util that referenced this issue Dec 27, 2021
@salemkode
Copy link

Solve in !67

@ljharb
Copy link
Member

ljharb commented Dec 27, 2021

This is a node module. It can be used with a node module bundler. A node module bundler provides node's globals wherever appropriate.

I suggest avoiding the use of a node module bundler that doesn't properly bundle node modules.

@imsys
Copy link

imsys commented Jan 23, 2022

ChainSafe/web3.js has this module as a dependence and their readthedocs page does not inform about requiring a node polyfill, but it is mentioned in their github page..

Anyway, we have the docs for webpack, but for those using Vite, Rollup or SvelteKit check rollup-plugin-polyfill-node, a good info on the implementation can be found on this comment: blocknative/web3-onboard#762 (comment)

@ljharb
Copy link
Member

ljharb commented Jan 23, 2022

All node modules may require node core module polyfills; it’s the job of a working node module bundler to handle that. Those that don’t, are broken.

@SVV-team
Copy link

For those who use Vite or Nuxt3

Error with process.env.NODE_DEBUG

solutions ==>

  1. Install polyfill using npm or yarn
yarn add @esbuild-plugins/node-globals-polyfill
  1. Add to your vite or nuxt config (NUXT example, vite similar)
import {NodeGlobalsPolyfillPlugin} from '@esbuild-plugins/node-globals-polyfill'

export default defineNuxtConfig({
vite: {
        optimizeDeps: {
            esbuildOptions: {
                define: {
                    global: 'globalThis'
                },
                plugins: [
                    NodeGlobalsPolyfillPlugin({
                        process: true,
                        buffer: true
                    }),
                ]
            }
        },
    }
})

With this config Web3 and other work perfect

@multiplehats
Copy link

import {NodeGlobalsPolyfillPlugin} from '@esbuild-plugins/node-globals-polyfill'

You're a lifesaver ❤️

@PikaJoyce
Copy link

Hi folks,

Are there any updates to this fix? We have several folks that may be hitting this issue on their applications so would love a more permanent fix. Our suggestion to temporarily fix this is found here for those on Angular.

Thanks!
Joyce

@davidfrgla
Copy link

For those who use Vite or Nuxt3

Error with process.env.NODE_DEBUG

solutions ==>

  1. Install polyfill using npm or yarn
yarn add @esbuild-plugins/node-globals-polyfill
  1. Add to your vite or nuxt config (NUXT example, vite similar)
import {NodeGlobalsPolyfillPlugin} from '@esbuild-plugins/node-globals-polyfill'

export default defineNuxtConfig({
vite: {
        optimizeDeps: {
            esbuildOptions: {
                define: {
                    global: 'globalThis'
                },
                plugins: [
                    NodeGlobalsPolyfillPlugin({
                        process: true,
                        buffer: true
                    }),
                ]
            }
        },
    }
})

With this config Web3 and other work perfect

I'm getting ReferenceError: Buffer is not defined when building app

@baixiaoyu2997
Copy link

for nuxt3 user, there is a solution
https://github.com/nuxt/framework/discussions/4393

@duartefdias
Copy link

duartefdias commented May 9, 2022

I'm getting ReferenceError: Buffer is not defined when building app

I was also getting this error after building the app and the app wouldn't work, but not when running it locally.
I was able to fix it with this solution:

vitejs/vite#2785 (comment)

Simply adding globalThis.Buffer = Buffer to the start of node_modules/buffer/index.js
Definitely not the best solution but works for deploying a static version of the app for now.

@ljharb
Copy link
Member

ljharb commented Aug 16, 2022

Glad to see so many helpful tips here.

#43 (comment) is the answer for this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.