241128 - react webpack < 5 used to include polyfills for node.js core modules by default. This is no longer the case. Verify if you need this module and configure a polyfill for it. / cloudinary fs module not found
문제 상황
- cloudinary client를 다운받고, .ts파일을 만들어 돌리려는데 Webpack 5 어쩌고 에러가 남
-
- 문제를 해결했지만, fs module을 찾지 못했다는 에러가 계속 남
해결 방법
1번 문제
- webpack.config.js를 연다 (위치 - node_modules/react-scripts/config/webpack.config.js)
- plugin 부분에 밑에 github 답변대로
new webpack.ProvidePlugin...
부분을 넣는다. - 그 아래 resolve 안에 fallback 부분을 추가하고, 필요한 모듈을 넣는다.
https://webpack.kr/configuration/resolve/#resolvefallback - 추가한 모듈들을 모두
npm install
한다. 설치하지 않으면 계속 오류가 나게 된다. - 실행하고 잘 돌아가는지를 확인한다.
각 모듈별 resolve 하는 방법은 다음 링크에 나와 있다. - https://webpack.kr/configuration/resolve/#resolvefallback
해당 링크는 webpack5에서 더 이상 자동으로 polyfill 하지 않는 모듈들 리스트이다.
즉, 다음 모듈들이 import되지 않아 문제가 생기므로 다음 모듈들을 다운로드하여 간다면 문제가 없어야 한다.
Webpack 5는 더 이상 Node.js의 핵심 모듈을 자동으로 폴리필하지 않습니다. 즉, 브라우저 등에서 실행되는 코드에서 사용하는 경우 npm에서 호환되는 모듈을 설치하고 직접 포함해야 합니다. 다음은 webpack 5 이전에 사용한 폴리필 목록입니다.
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'),
},
},
};
또는, 다음과 같은 방법으로도 해결 가능한 것 같다.
https://sooknise.tistory.com/169
2번 문제
일단 원인은 fs모듈이 node.js 모듈인데, 브라우저에 들어가지 못해서 나는 문제인 것 같다.
next.js를 사용하는 사람들도 해당 문제에 대해 많이 질문했는데, 대부분 next.config.js에서 fs:false로 설정하는 방식으로 문제를 해결했다.
나도 그렇게 하면 해결이 될까 싶어 따라해봤다.
위의 fallback에 fs: false,
를 추가했더니 성공이다.
참고 자료
1번 문제 관련
https://github.com/web3/web3.js/issues/4090
ㄴ여기 northhub 님 답변대로 하니까 빌드됨
npm i buffer process stream-browserify os-browserify stream-http https-browserify url
node_modules/react-scripts/config/webpack.config.js 파일 수정
const webpack = require("webpack")
...
module.exports = {
...
plugins: [
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
process: "process/browser",
}),
],
resolve: {
fallback: {
http: require.resolve("stream-http"),
https: require.resolve("https-browserify"),
crypto: require.resolve("crypto-browserify"),
stream: require.resolve("stream-browserify"),
os: require.resolve("os-browserify/browser"),
url: require.resolve("url"),
assert: require.resolve("assert"),
},
},
};
https://webpack.kr/configuration/resolve/#resolvefallback
2번 문제 관련
https://github.com/JuyeolRyu/NodeSNS/issues/3
일단 해당 글에서 제일 잘 나와있다.
https://github.com/vercel/next.js/issues/1501
ㄴ여기서도
You can't use cloudinary because I hope it's a server side file issue.
라고 한다.
https://github.com/facebook/create-react-app/issues/11756#issuecomment-994680220
ㄴ브라우저에서 사용하면 안 된다는 글
ㄴnext.js에서도 false로 사용을 해제한다