Reputation: 2845
Our application kept showing the error in the title. The problem is very likely related to Webpack 5 polyfill and after going through a couple of solutions:
fallback: {
"stream": require.resolve("stream-browserify"),
"buffer": require.resolve("buffer/")
}
alias: {
"buffer": "buffer",
"stream": "stream-browserify"
}
We are still seeing the dreadful error:
rfc6979.js:3 Uncaught ReferenceError: Buffer is not defined
at Object.4142 (rfc6979.js:3)
at r (bootstrap:19)
at Object.5892 (js.js:4)
at r (bootstrap:19)
at Object.4090 (bip32.js:5)
at r (bootstrap:19)
at Object.7786 (index.js:3)
at r (bootstrap:19)
at Object.1649 (MnemonicKey.js:50)
at r (bootstrap:19)
Our setup is vanilla NodeJS + TypeScript + Webpack for multi-target: node + browser. Any help would be great!
Upvotes: 105
Views: 229666
Reputation: 61
Install node-polyfill-webpack-plugin
:
This plugin will add polyfills for Node.js core modules that your dependencies might be expecting.
npm install node-polyfill-webpack-plugin
Update Your Webpack Configuration:
If you're using react-app-rewired
for customizing Webpack, you can modify your config-overrides.js
file to include this plugin:
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin');
module.exports = function override(config, env) {
// Add polyfills for Node.js core modules
config.plugins = [
...config.plugins,
new NodePolyfillPlugin()
];
// Ensure that extensions are properly handled
config.resolve.extensions = ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.json'];
return config;
};
Upvotes: 1
Reputation: 21
If you're using Craco, this is the way to format the code in craco.config.js
to resolve the Buffer is not defined:
//plugin to avoid Buffer is not defined
webpackConfig.plugins.push(
new webpack.ProvidePlugin({
process: 'process/browser',
}),
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
})
);
Upvotes: 1
Reputation: 2775
The CSS minimizer in Webpack 5 is more strict about what is allowed in the CSS files. You likely have a misplaced /
somewhere in your CSS.
For instance, it does not like //
comments:
// This will break
Also, check for slashes in any className paths, e.g.:
.myDiv/otherDiv
Removing these will solve your problem and allow you to keep your optimized CSS. Replace any comments using the /* */
syntax. Also check to make sure those are well-formed.
Upvotes: 0
Reputation: 3856
While everyone is suggesting to install polyfill, there is a native way in NodeJS to do this, per their documentation
import { Buffer } from 'node:buffer'
If you are using this in NodeJs, including Webpack, and not in the browser, this is the preferred solution.
Upvotes: 3
Reputation: 71
I was getting the same error, and this is how I solved the problem.
First:
npm install --save buffer
Then:
Added this to my
app.tsx
file.
window.Buffer = window.Buffer || require("buffer").Buffer;
Upvotes: 7
Reputation: 6769
What worked for me is the following:
First:
npm install --save buffer
Then:
// webpack.config.js
const webpack = require("webpack");
module.exports = {
plugins: [
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
}),
// ..
]
// ..
}
Upvotes: 11
Reputation: 169
Additional detail for VueJS developers,
this answer worked and my vue.config.js file was like this.
const { defineConfig } = require('@vue/cli-service')
const webpack = require('webpack');
module.exports = defineConfig({
transpileDependencies: true,
configureWebpack: {
plugins: [
// Work around for Buffer is undefined:
// https://github.com/webpack/changelog-v5/issues/10
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
})
],
resolve: {
extensions: ['.ts', '.js'],
fallback: {
"stream": require.resolve("stream-browserify"),
"buffer": require.resolve("buffer")
}
},
}
})
I deleted my node_modules folder and ran npm install
again.
Upvotes: 4
Reputation: 600
This worked for me
npm install --save buffer
Then in the file where I was using buffer
import { Buffer } from 'buffer';
I guess it wasn't installed, but my IDE already had type descriptions for it? Idk
Upvotes: 14
Reputation: 1465
It turns out that there is third-party plugin that provides all node.js polyfills (not just Buffer) out of the box:
node-polyfill-webpack-plugin
.
It brings all polyfills as its own dependancies, so you should use
excludeAliases
config property to define what polyfills you do not want to be included.
Upvotes: 0
Reputation: 131
I've found a bug when I tried to use TonWebSDK with create-react-app and found a fix for that.
After project setup with npx create-react-app my-app
I imported tonweb from 'tonweb'
but faced an error Uncaught ReferenceError: Buffer is not defined
.
I run npm run eject
in order to modify the webpack config. I added Buffer support to the plugins
of webpack with next lines:
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
})
And this worked for me.
Upvotes: 1
Reputation: 22964
I've tried all the answers here to resolve this issue and nothing worked for me. What did work for me was putting the following in my polyfills.ts:
import { Buffer } from 'buffer';
// @ts-ignore
window.Buffer = Buffer;
and of course, npm install --save buffer
Upvotes: 74
Reputation: 1441
Everyone who came here because of react-scripts (5.0.0) (@whileons answer is correct, this is only the configuration for react-scripts):
First, add these dependencies to your package.json:
"buffer": "^6.0.3",
"process": "^0.11.10",
"stream-browserify": "^3.0.0"
"react-app-rewired": "^2.2.1" --dev
Update your package.json scripts.
Before:
"scripts": {
"debug": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
After
"scripts": {
"debug": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-app-rewired eject"
},
Create a file config-overrides.js
in the root folder (NOT under src, in the same folder like your package.json) and paste the following code inside:
const webpack = require("webpack")
module.exports = function override(config, env) {
//do stuff with the webpack config...
config.resolve.fallback = {
...config.resolve.fallback,
stream: require.resolve("stream-browserify"),
buffer: require.resolve("buffer"),
}
config.resolve.extensions = [...config.resolve.extensions, ".ts", ".js"]
config.plugins = [
...config.plugins,
new webpack.ProvidePlugin({
process: "process/browser",
Buffer: ["buffer", "Buffer"],
}),
]
// console.log(config.resolve)
// console.log(config.plugins)
return config
}
Dont forget to delete node_modules and npm install
it again.
Upvotes: 42
Reputation: 75
You could also just install the following library: https://github.com/feross/buffer
yarn add buffer
Upvotes: 3
Reputation: 133
Downgrading react-scripts to 4.0.3 worked https://github.com/terra-money/terra.js/issues/223. It may not be the optimal solution, but it was the only thing that worked for me.
Upvotes: 0
Reputation: 2845
Answering my own question. Two things helped to resolve the issue:
const webpack = require('webpack');
module.exports = {
// ...
plugins: [
// Work around for Buffer is undefined:
// https://github.com/webpack/changelog-v5/issues/10
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
}),
new webpack.ProvidePlugin({
process: 'process/browser',
}),
],
resolve: {
extensions: [ '.ts', '.js' ],
fallback: {
"stream": require.resolve("stream-browserify"),
"buffer": require.resolve("buffer")
}
},
Upvotes: 112