当我从webpack v4升级到v5时,也遇到了这些错误。
通过对webpack.config.js
进行以下更改来解决:
添加
resolve.fallback
属性
移除
node
属性
{
resolve: {
modules: [...],
fallback: {
"fs": false,
"tls": false,
"net": false,
"path": false,
"zlib": false,
"http": false,
"https": false,
"stream": false,
"crypto": false,
"crypto-browserify": require.resolve('crypto-browserify'), //if you want to use this module also don't forget npm i crypto-browserify
}
},
entry: [...],
output: {...},
module: {
rules: [...]
},
plugins: [...],
optimization: {
minimizer: [...],
},
// node: {
// fs: 'empty',
// net: 'empty',
// tls: 'empty'
// },
}
webpack.config.js
文件中设置 webpack 配置。https://webpack.js.org/configuration/ - Maqsood Ahmedcreate-react-app
创建的项目。因此,你可以通过弹出项目或进入 react-scripts
的 node_modules 文件夹来获取配置文件。
https://dev59.com/nlYM5IYBdhLWcg3wxSR_ - Maqsood Ahmed使用node-polyfill-webpack-plugin
重新添加对Node.js核心模块的支持:
安装该软件包后,将以下内容添加到您的webpack.config.js文件中:
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin")
module.exports = {
// Other rules...
plugins: [
new NodePolyfillPlugin()
]
}
fs
?我们只需使用一个shim吗? - Richie Bendalltarget: 'node'
。这帮助我解决了这个问题。根据Web3文档:
如果您使用的是create-react-app版本>=5,可能会遇到构建问题。这是因为NodeJS polyfill未包含在最新版本的create-react-app中。
解决方案:
安装react-app-rewired和缺失的模块。
如果您使用的是yarn:
yarn add --dev react-app-rewired crypto-browserify stream-browserify assert stream-http https-browserify os-browserify url buffer process
如果您正在使用 npm:
npm install --save-dev react-app-rewired crypto-browserify stream-browserify assert stream-http https-browserify os-browserify url buffer process
在项目文件夹的根目录下创建config-overrides.js文件,其内容如下:const webpack = require('webpack');
module.exports = function override(config) {
const fallback = config.resolve.fallback || {};
Object.assign(fallback, {
"crypto": require.resolve("crypto-browserify"),
"stream": require.resolve("stream-browserify"),
"assert": require.resolve("assert"),
"http": require.resolve("stream-http"),
"https": require.resolve("https-browserify"),
"os": require.resolve("os-browserify"),
"url": require.resolve("url")
})
config.resolve.fallback = fallback;
config.plugins = (config.plugins || []).concat([
new webpack.ProvidePlugin({
process: 'process/browser',
Buffer: ['buffer', 'Buffer']
})
])
return config;
}
在package.json中,将start、build和test的scripts字段进行修改。将react-scripts替换为react-app-rewired。 之前:
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
之后:
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
现在应该包含了缺失的 Nodejs polyfills,并且您的应用程序应该能够与 web3 一起正常运行。
如果您想要隐藏控制台创建的警告:
在 config-overrides.js 中的 override 函数中添加:
config.ignoreWarnings = [/Failed to parse source map/];
找不到模块:错误:无法解析“/Users/bartolini/workspace-osa/osa-web-ui/node_modules/axios/lib/defaults”中的“process/browser” 你是指“browser.js”吗? 重大变更:请求“process/browser”未能解析,仅因为它被视为完全指定的模块。
- bartektartanus我在使用create-react-app
遇到了这个问题,因为默认情况下它给了我...
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "5.0.0",
"web-vitals": "^2.1.2"
我只需将 react-scripts
的版本更改为 4.0.3
,就解决了问题。
看起来你使用了path
包,但是它默认不包含在webpack构建中。对我来说,像这样扩展webpack配置有所帮助:
{
// rest of the webpack config
resolve: {
// ... rest of the resolve config
fallback: {
"path": require.resolve("path-browserify")
}
},
}
如果您正在使用yarn,请通过yarn add path-browserify --dev
或者通过 npm install path-browserify --save-dev
安装 path-browserify
。
你需要 React => v17,React 脚本 => v5,webpack => v5
解决问题的方法
1)安装
"fs": "^2.0.0", // npm i fs
"assert": "^2.0.0", // npm i assert
"https-browserify": "^1.0.0", // npm i https-browserify
"os": "^0.1.2", // npm i os
"os-browserify": "^0.3.0", // npm i os-browserify
"react-app-rewired": "^2.1.9", //npm i react-app-rewired
"stream-browserify": "^3.0.0", // stream-browserify
"stream-http": "^3.2.0", //stream-http
2) 在根目录创建config-overrides.js文件 图像
3) 将配置添加到config-overrides.js文件中
const webpack = require('webpack');
module.exports = function override(config, env) {
config.resolve.fallback = {
url: require.resolve('url'),
fs: require.resolve('fs'),
assert: require.resolve('assert'),
crypto: require.resolve('crypto-browserify'),
http: require.resolve('stream-http'),
https: require.resolve('https-browserify'),
os: require.resolve('os-browserify/browser'),
buffer: require.resolve('buffer'),
stream: require.resolve('stream-browserify'),
};
config.plugins.push(
new webpack.ProvidePlugin({
process: 'process/browser',
Buffer: ['buffer', 'Buffer'],
}),
);
return config;
}
3) 更改 packages.json 文件
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-app-rewired eject"
}
问题已解决 :)
svgr
,但它一直抱怨os.homedir
不是一个函数,尽管它使用了最新版本的os-browserify
。可悲的是,我找不到任何关于我特定问题的答案,但我猜这种方式尝试使用Node应用程序可能有点巧妙。 - bas最近Create React App发布了v5版本,现在采用Webpack v5. 这将会完全打破很多库,包括web3,因为所需的Node核心库polyfills将缺失。
要快速解决此问题,您可以在package.json中进行更改:
"react-scripts": "^5.0.0"
对于这个
"react-scripts": "4.0.3"
之后:
rm -r node_modules
rm package-lock.json
npm install
当我重新安装节点模块时,我遇到了问题,我的webpack当前版本是5.38.1
,我通过npm i path-browserify -D
解决了这个问题。安装后,您需要更新webpack.config.js
中的resolve{}
,添加fallback: {"fs": false, "path": require.resolve("path-browserify")}
。如果不使用"fs": false
,会显示错误信息,例如:Module not found: Error: Can't resolve 'fs' in '/YOUR DIRECTORY ...'
,因此不要忘记添加它;与其他内容一起,看起来像:
module.exports = {
...
resolve: {
extensions: [".js", ".jsx", ".json", ".ts", ".tsx"],// other stuff
fallback: {
"fs": false,
"path": require.resolve("path-browserify")
}
},
};
如果在您的webpack.config.js
文件中存在node
属性,则删除它。
打开project/node_modules/react-scripts/config/webpack.config.js
在fallback中添加"crypto": require.resolve("crypto-browserify")
resolve: {
fallback: {
"crypto": require.resolve("crypto-browserify")
}
}
npm i crypto-browserify
node_modules
安装patch-package: yarn add patch-package
安装所需的polyfill(进行应用程序的初始构建并将其告诉您)。
修改node_modules/react-scripts/config/webpack.config.js
。这是一个示例。这是来自Webpack文档的内容。
module.exports = {
//...
resolve: {
fallback: {
assert: require.resolve('assert'),
buffer: require.resolve('buffer'),
console: require.resolve('console-browserify'),
constants: require.resolve('constants-browserify'),
crypto: require.resolve('crypto-browserify'),
domain: require.resolve('domain-browser'),
events: require.resolve('events'),
http: require.resolve('stream-http'),
https: require.resolve('https-browserify'),
os: require.resolve('os-browserify/browser'),
path: require.resolve('path-browserify'),
punycode: require.resolve('punycode'),
process: require.resolve('process/browser'),
querystring: require.resolve('querystring-es3'),
stream: require.resolve('stream-browserify'),
string_decoder: require.resolve('string_decoder'),
sys: require.resolve('util'),
timers: require.resolve('timers-browserify'),
tty: require.resolve('tty-browserify'),
url: require.resolve('url'),
util: require.resolve('util'),
vm: require.resolve('vm-browserify'),
zlib: require.resolve('browserify-zlib'),
},
},
};
确保在修改webpack配置之前先安装软件包。
运行yarn patch-package react-scripts
。这将生成一个补丁(这应该在你的仓库中提交)。
在package.json中添加一个postinstall脚本:"postinstall": "yarn patch-package"
。现在,任何时候,有人在此项目上安装npm依赖项时,都会自动应用您在步骤3中创建的补丁。
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"postinstall": "yarn patch-package"
},
process
。请查看其他使用ProvidePlugin的答案。 - lawrence