본문 바로가기
www/rn

[RN] react native web 세팅

by 금이아빠s 2023. 10. 20.

react native cli로 세팅을 하게되면 ios, aos만 되지 web은 세팅이안된다

 

그래서 세팅을 해보자!

npm i react-native-web
npm i --save react-dom
npm i --save-dev babel-plugin-react-native-web
sudo npm i --save-dev @babel/core babel-loader url-loader webpack webpack-cli webpack-dev-server
npm i @babel/preset-react html-webpack-plugin

 

설치를 하다보면 안되는게 생긴다..

에러 안에 해결방법을 알려주기때문에 따라서 하기만 하면된다..

ㅎㅎㅎ

 

본격적인 기본세팅!

// public/index.html

<!DOCTYPE html>
<html>
  <head>
    <title>React Native Web</title>
  </head>
  <body>
    <div id="app">index,html</div>
  </body>
</html>
// App.web.js

import React from 'react';
import {View, Text} from 'react-native';

function App() {
  return (
    <View>
        <Text>:)</Text>
    </View>
  );
}

export default App;
// index.web.js
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.web';

const root = createRoot(document.getElementById('app'));
root.render(<App />);
// web/webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

const appDirectory = path.resolve(__dirname, '../');

const babelLoaderConfiguration = {
  test: /\.js$/,
  use: {
    loader: 'babel-loader',
    options: {
      cacheDirectory: true,
      presets: ['@babel/preset-react'],
      plugins: ['react-native-web'],
    },
  },
};

module.exports = {
  entry: [path.resolve(appDirectory, 'index.web.js')],
  output: {
    filename: 'bundle.web.js',
    path: path.resolve(appDirectory, 'dist'),
  },

  module: {
    rules: [babelLoaderConfiguration],
  },

  plugins: [new HtmlWebpackPlugin({template: './public/index.html'})],

  resolve: {
    alias: {
      'react-native$': 'react-native-web',
    },
    extensions: ['.web.js', '.js'],
  },
};
// package.json

{
  "name": "react_native",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "lint": "eslint .",
    "start": "react-native start",
    "test": "jest",
    "build-react": "webpack --mode production",
    "start-react": "webpack serve --config ./web/webpack.config.js --mode development"
  },
  "dependencies": {
    "@babel/preset-react": "^7.22.15",
    "html-webpack-plugin": "^5.5.3",
    "react": "18.2.0",
    "react-dom": "^18.2.0",
    "react-native": "0.72.6",
    "react-native-web": "^0.19.9"
  },
  "devDependencies": {
    "@babel/core": "^7.23.2",
    "@babel/preset-env": "^7.20.0",
    "@babel/runtime": "^7.20.0",
    "@react-native/eslint-config": "^0.72.2",
    "@react-native/metro-config": "^0.72.11",
    "@tsconfig/react-native": "^3.0.0",
    "@types/react": "^18.0.24",
    "@types/react-test-renderer": "^18.0.0",
    "babel-jest": "^29.2.1",
    "babel-loader": "^9.1.3",
    "babel-plugin-react-native-web": "^0.19.9",
    "eslint": "^8.19.0",
    "jest": "^29.2.1",
    "metro-react-native-babel-preset": "0.76.8",
    "prettier": "^2.4.1",
    "react-test-renderer": "18.2.0",
    "typescript": "4.8.4",
    "url-loader": "^4.1.1",
    "webpack": "^5.89.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^4.15.1"
  },
  "engines": {
    "node": ">=16"
  }
}
// babel.config.js

module.exports = {
  presets: [
    [
      'module:metro-react-native-babel-preset',
      {useTransformReactJSXExperimental: true},
    ],
  ],
  plugins: [['@babel/plugin-transform-react-jsx', {runtime: 'automatic'}]],
};

 

 

위에 설정을 다하면 실행!

yarn start-react
yarn test

yarn start-react
yarn test

뾰로롱!!!