๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/React

[React] ์ตœ์‹  Reactํ™˜๊ฒฝ์—์„œ Web3.js ์ ์šฉํ•˜๊ธฐ(์˜ค๋ฅ˜์ˆ˜์ •)

๋ฐ˜์‘ํ˜•

Create-React-App

npx create-react-app frontend
npm install web3 web3-utils

์ตœ์‹  react ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ web3.js๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ˆ˜ ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๊ณต์‹ ๊นƒํ—™์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ react-app-wired๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ถ€์กฑํ•œ ๋ชจ๋“ˆ์„ ์ง์ ‘ ์„ค์น˜ํ•˜๋„๋ก ์•ˆ๋‚ดํ•˜๊ณ  ์žˆ๋‹ค.

1. react-app-rewired ๋ฐ ๋ถ€์กฑํ•œ ๋ชจ๋“ˆ ์„ค์น˜

npm install --save-dev react-app-rewired crypto-browserify stream-browserify assert stream-http https-browserify os-browserify url buffer process

2. ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— 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;
}

3. package.json ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •

"scripts": {
  "start": "react-app-rewired start",  // "react-scripts start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test",
  "eject": "react-scripts eject"
},

(์ถ”๊ฐ€)
์•ˆ๋‚ด๋Œ€๋กœ๋งŒ ์„ค์น˜ํ•˜๋ฉด 2๊ฐ€์ง€ ๋ชจ๋“ˆ(constants, path)์ด ์ถ”๊ฐ€๋กœ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ํ™˜๊ฒฝ ํŒŒ์ผ์— ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ๋ถ€์กฑํ•œ ๋ชจ๋“ˆ ์ถ”๊ฐ€ ์„ค์น˜

npm install --save-dev constants-browserify path-browserify

5. 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"),
    constants: require.resolve("constants-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"),
    path: require.resolve("path-browserify"), // ์ถ”๊ฐ€
    url: require.resolve("url"),
  });
  config.resolve.fallback = fallback;
  config.ignoreWarnings = [/Failed to parse source map/];
  config.plugins = (config.plugins || []).concat([
    new webpack.ProvidePlugin({
      process: "process/browser",
      Buffer: ["buffer", "Buffer"],
    }),
  ]);
  return config;
};

๋ธ”๋ก์ฒด์ธ์— ๊ด€๋ จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ํ”„๋ก ํŠธ์—์„œ Web3.js๋ฅผ ์ ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด ์ถฉ๋Œ์ด ํฌ๊ฒŒ ๋ฐœ์ƒํ•˜์—ฌ ๊ธฐ๋ก์„ ๋‚จ๊ธด๋‹ค.
๊ฐ€์žฅ ๋จผ์ € ์ ‘ํ•œ ๊ธ€์€ react-scripts ๋ฒ„์ „์„ ๋‚ฎ์ถ”๋ผ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋Š”๋ฐ, ๊ธฐ์กด์— ์ž‘์—…ํ•œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋“ค์ด ์ตœ์‹ ๋ฒ„์ „์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ์–ด ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์Šˆ๋กœ ๋‹ค๋ค„์ง€๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด์–ด์„œ ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ์œผ๋กœ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์ „ํ•  ์ˆ˜ ์žˆ๋˜ ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•