ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • React 프로젝트 생성하기
    Frontend/react 2020. 1. 6. 15:31

     

     

    리엑트 글로벌 패키지 설치

    npm install -g create-react-app

     

    프로젝트 생성

    create-react-app [프로젝트명]

     

    생성 완료

     

     

    babel, webpack 등 dependency package들은 ./node_modules/react-scripts 에 설치 되어 package.json엔 보이지 않는다.

    // package.json
    
    {
      "name": "",
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "@testing-library/jest-dom": "^4.2.4",
        "@testing-library/react": "^9.3.2",
        "@testing-library/user-event": "^7.1.2",
        "react": "^16.12.0",
        "react-dom": "^16.12.0",
        "react-scripts": "3.3.0"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test",
        "eject": "react-scripts eject"
      },
      "eslintConfig": {
        "extends": "react-app"
      },
      "browserslist": {
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ],
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ]
      }
    }

     

    webpack-dev-server 실행

    npm start

     

    실행 결과

    실행콘솔/웹브라우저

    hot-reload 적용 -> 개발 서버를 켜고 코드를 수정하면 자동으로 적용

     

     

    아래 명령어를 입력하면, 프로젝트 설정/스크립트를 커스터마이징 할 수 있도록 해준다.

    실행되면 node_modules/react-script 폴더가 사라지고 현재 프로젝트에 모든 설정 관련 파일들이 추가된다.

    npm eject

     

    실행 결과 콘솔

    // 수정된 package.json
    {
      "name": "",
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "@babel/core": "7.7.4",
        "@svgr/webpack": "4.3.3",
        "@testing-library/jest-dom": "^4.2.4",
        "@testing-library/react": "^9.3.2",
        "@testing-library/user-event": "^7.1.2",
        "@typescript-eslint/eslint-plugin": "^2.8.0",
        "@typescript-eslint/parser": "^2.8.0",
        "babel-eslint": "10.0.3",
        "babel-jest": "^24.9.0",
        "babel-loader": "8.0.6",
        "babel-plugin-named-asset-import": "^0.3.5",
        "babel-preset-react-app": "^9.1.0",
        "body-parser": "^1.19.0",
        "camelcase": "^5.3.1",
        "case-sensitive-paths-webpack-plugin": "2.2.0",
        "css-loader": "3.2.0",
        "dotenv": "8.2.0",
        "dotenv-expand": "5.1.0",
        "eslint": "^6.6.0",
        "eslint-config-react-app": "^5.1.0",
        "eslint-loader": "3.0.2",
        "eslint-plugin-flowtype": "3.13.0",
        "eslint-plugin-import": "2.18.2",
        "eslint-plugin-jsx-a11y": "6.2.3",
        "eslint-plugin-react": "7.16.0",
        "eslint-plugin-react-hooks": "^1.6.1",
        "express": "^4.17.1",
        "file-loader": "4.3.0",
        "fs-extra": "^8.1.0",
        "html-webpack-plugin": "4.0.0-beta.5",
        "identity-obj-proxy": "3.0.0",
        "jest": "24.9.0",
        "jest-environment-jsdom-fourteen": "0.1.0",
        "jest-resolve": "24.9.0",
        "jest-watch-typeahead": "0.4.2",
        "mini-css-extract-plugin": "0.8.0",
        "optimize-css-assets-webpack-plugin": "5.0.3",
        "path": "^0.12.7",
        "pnp-webpack-plugin": "1.5.0",
        "postcss-flexbugs-fixes": "4.1.0",
        "postcss-loader": "3.0.0",
        "postcss-normalize": "8.0.1",
        "postcss-preset-env": "6.7.0",
        "postcss-safe-parser": "4.0.1",
        "react": "^16.12.0",
        "react-app-polyfill": "^1.0.5",
        "react-dev-utils": "^10.0.0",
        "react-dom": "^16.12.0",
        "resolve": "1.12.2",
        "resolve-url-loader": "3.1.1",
        "sass-loader": "8.0.0",
        "semver": "6.3.0",
        "style-loader": "1.0.0",
        "terser-webpack-plugin": "2.2.1",
        "ts-pnp": "1.1.5",
        "url-loader": "2.3.0",
        "webpack": "4.41.2",
        "webpack-dev-server": "3.9.0",
        "webpack-manifest-plugin": "2.2.0",
        "workbox-webpack-plugin": "4.3.1"
      },
      "scripts": {
        "start": "node scripts/start.js",
        "build": "node scripts/build.js",
        "test": "node scripts/test.js"
      },
      "eslintConfig": {
        "extends": "react-app"
      },
      "browserslist": {
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ],
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ]
      },
      "devDependencies": {
        "babel-core": "^6.26.3",
        "babel-preset-es2015": "^6.24.1",
        "nodemon": "^2.0.2"
      },
      "jest": {
        "roots": [
          "<rootDir>/src"
        ],
        "collectCoverageFrom": [
          "src/**/*.{js,jsx,ts,tsx}",
          "!src/**/*.d.ts"
        ],
        "setupFiles": [
          "react-app-polyfill/jsdom"
        ],
        "setupFilesAfterEnv": [
          "<rootDir>/src/setupTests.js"
        ],
        "testMatch": [
          "<rootDir>/src/**/__tests__/**/*.{js,jsx,ts,tsx}",
          "<rootDir>/src/**/*.{spec,test}.{js,jsx,ts,tsx}"
        ],
        "testEnvironment": "jest-environment-jsdom-fourteen",
        "transform": {
          "^.+\\.(js|jsx|ts|tsx)$": "<rootDir>/node_modules/babel-jest",
          "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
          "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
        },
        "transformIgnorePatterns": [
          "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$",
          "^.+\\.module\\.(css|sass|scss)$"
        ],
        "modulePaths": [],
        "moduleNameMapper": {
          "^react-native$": "react-native-web",
          "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy"
        },
        "moduleFileExtensions": [
          "web.js",
          "js",
          "web.ts",
          "ts",
          "web.tsx",
          "tsx",
          "json",
          "web.jsx",
          "jsx",
          "node"
        ],
        "watchPlugins": [
          "jest-watch-typeahead/filename",
          "jest-watch-typeahead/testname"
        ]
      },
      "babel": {
        "presets": [
          "react-app"
        ]
      }
    }
    

     

    아래와 같이 프로젝트 폴더에 스크립트 / 설정 파일들이 생성 되었고

    package.json, yarn.lock 파일이 수정되었다.

     


     

     

    Express 적용

     

    // 글로벌 패키지 설치
    npm install -g babel-cli
    
    // 로컬 패키지 설치
    npm install --save express body-parser path
    npm install --save-dev babel-core babel-preset-es2015 nodemon

     

    // src/server.js
    import express from 'express';
    import bodyParser from 'body-parser';
    import api from './routes';
    
    const app = express();
    
    let port = 8080;
    
    
    // SETUP MIDDLEWARE
    app.use(bodyParser.json());
    
    // SERVE STATIC FILES - REACT PROJECT
    app.use('/', express.static(__dirname + '/../../build'));
    
    // LOAD API FROM ROUTES
    app.use('/api', api);
    
    
    app.listen(port, () => {
        console.log('Express is listening on port', port);
    });
    // src/routes/index.js
    import express from 'express';
    import post from './post';
    
    const router = express.Router();
    router.use('/post', post);
    
    export default router;
    // src/routes/post.js
    import express from 'express';
    
    const router = express.Router();
    
    router.post('/', (req, res) => {
        console.log(req.body.contents);
        return res.json({
            success: true
        });
    });
    
    router.get('/:id', (req, res) => {
        console.log('reading post ', req.params.id);
        return res.json({
            index: req.params.id
        });
    });
    
    export default router;

     

    실행 테스트

    babel-node src/server.js --presets=es2015

    결과

    실행콘솔 / 웹브라우저

     

     

     

     

     

     

     

     

     

     

    댓글

Designed by Tistory.