github Pages 배포

|

github Pages 배포

참고자료:노마드코더

github를 이용한 배포 방법

  • npm i gh-pages
  • package.json 맨 하단부분에 "homepage": "https://[유저이름].github.io/[저장소이름]" 작성
  • scripts 부분에 “predeploy”: “npm run build”, “deploy”: “gh-pages -d build” 작성
  • 이후 npm run deploy 해주면 됨
// package.json
{
  "name": "nwitter",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@fortawesome/fontawesome-free": "^5.14.0",
    "@fortawesome/fontawesome-svg-core": "^1.2.30",
    "@fortawesome/free-brands-svg-icons": "^5.14.0",
    "@fortawesome/free-regular-svg-icons": "^5.14.0",
    "@fortawesome/free-solid-svg-icons": "^5.14.0",
    "@fortawesome/react-fontawesome": "^0.1.11",
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "firebase": "^7.19.1",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-router-dom": "^5.2.0",
    "react-scripts": "3.4.3",
    "uuid": "^8.3.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "eject": "react-scripts eject",
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build"
  },
  "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"
    ]
  },
  "homepage": "https://jungsikjeong.github.io/nwitter"
}

gitCommit에러?

|

gitCommit에러?

git push 에러(?)

git init후 git push했을때 사진과 같은 현상이 발생했다.

아이콘 모양이 좀 다르고, 클릭이 안된다.

문제가 생겼으면 당연히 원인이 있겠지만 생략하고…

해결방안은 의외로 심플했다.

  1. Git init
  2. git remote add origin “https://github.com/wjdwndtlr/travel”
  3. git add .

까지 한 후에 원래는 git commit -m “커밋메시지” 후 git push origin master를 해줘야하지만, 이 과정을하면 맨 위 와같은 에러(?)가 나오므로, 3번까지만 한 후 vsCode에서 푸쉬하는 방향으로했다. (터미널 사용X)

새롭게 알게된 사실!!

  • npx create-react-app . 하면 git init이 자동으로 된다.
  • 그래서 git 디렉토리가 만들어져있으니까 어떤식으로든 git 히스토리 정리하시거나 서브모듈로 설정하라는 문구와 저런 아이콘이 생기나보다!

React 경로 보호 설정하기

|

React 경로 보호 설정하기

유데미에서 공부하면서 조금 새로운 코드를 봤습니다. 코드 정리겸 나중에 다시 사용할 수 있도록 정리하려고합니다. (거의 복붙예정)

경로보호란 무슨 말 인가?

  • 프론트단에서 로그인안한 사용자가 접근시 접근을 못하게하거나, 다른 경로로 강제이동시키는 경우를 말한다.

코드

  • component> routing> PrivateRoute.js
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';

const PrivateRoute = ({
  component: Component,
  auth: { isAuthenticated, loading },
  ...rest
}) => (
  <Route
    {...rest}
    render={(props) =>
      !isAuthenticated && !loading ? (
        <Redirect to='/login' />
      ) : (
        <Component {...props} />
      )
    }
  />
);

PrivateRoute.propTypes = {
  auth: PropTypes.object.isRequired,
};

const mapStateToProps = (state) => ({
  auth: state.auth,
});

export default connect(mapStateToProps)(PrivateRoute);
  • App.js
<PrivateRoute exact path='/dashboard' component={Dashboard} />

// <Route exact path='/dashboard' component={Dashboard} /> 에서
// <PrivateRoute exact path='/dashboard' component={Dashboard} /> 로 바뀐것임

객체 초기자

|

객체 초기자

객체 초기자와 비구조화 할당

내가 한 질문

const {name,email,password} = req.body;
 ​ ​
let user = await User.findOne({email}); ​

위의 코드에서 왜 {} 중괄호를 써준것인지 이해가 잘 안가는데요.. es6문법과 관련이 있을까요? ​
헷갈리는게.. 위에서
const {name,email,password} = req.body; 로 가져와줬기때문에 중괄호없이 바로
let user = await User.findOne(email); 이렇게 해줘도 괜찮지 않을까요?

답변

서버 질문이 아니라 자바스크립트 문법 질문으로 보이는군요

1.
const {name,email,password} = req.body;
이 부분은
ES6(EcmaScript 6th) 문법 중 Destructuring Assignment(구조분해할당, 비구조화할당)라고 합니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment


2.
let user = await User.findOne({email});
이 문장에서 {email} 때문에 말씀하시는거면 객체 초기자이며, ES6부터 간결하게 표현이 가능해졌습니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer

{ email: email }이라고 한 것과 같습니다.

재질문

답글 감사합니다.
기재해주신 링크에가서 살펴보니
"0개 이상인 객체 속성명 및 관련값 쌍 목록이 콤마로 분리되어 중괄호({})로 묶인 형태입니다."
라고되있는데, const {name,email,password} = req.body; 이 코드안의 name,email,password또한 객체이니깐 {}중괄호로 객체 초기를 명시해준거라고 이해했는데 맞을까요?

재답변

'객체'가 아니라 '객체 속성명'이라고 적혀있지요

req.body는 { name: 'james', email: 'hello@naver.com', password: 'foobar' }
이런 형태로 돼있을겁니다. req.body는 name, email, password라는 속성을 갖고있지요.

구조분해할당을 이용하면 각각 같은 이름의 변수로 할당해줄 수 있는겁니다.

const { name, email, password } = { name: 'james', email: 'hello@naver.com', password: 'foobar' };
라고 하면
name, email, password라는 변수가 선언되면서, name이란 변수가 'james' 라는 값을, email이란 변수가 'hello@naver.com'이라는 값을, password란 변수가 'foobar'란 값을 갖게 되지요.

flex-basis을 활용한 hover 효과

|

flex-basis을 활용한 hover 효과

오늘도 공차하세요~ 토이프로젝트에 사용할 효과를 유튜브에서 탐색중에 발견했습니다.
두고두고 쓰일것같아서 간단히 메모합니다.

핵심 코드

const TeamItem = styled.li`
  flex-basis: 100px;
  margin: 0 10px;
  transition: all 0.4s;

  img {
    width: 100%;
  }

  :hover {
    flex-basis: 140px;
  }
`;

전체 코드

import React from 'react';
import styled from 'styled-components';

import blackMilktea from '../assets/black-milktea.png';

const Wrapper = styled.div`
  display: flex;
  height: 100vh;
  justify-content: center;
  align-items: center;
`;

const Team = styled.ul`
  display: flex;
  justify-content: center;
`;

const TeamItem = styled.li`
  flex-basis: 100px;
  margin: 0 10px;
  transition: all 0.4s;

  img {
    width: 100%;
  }

  :hover {
    flex-basis: 140px;
  }
`;

const Profile = styled.div`
  background-color: #222;
  position: relative;
`;

const ProfileContents = styled.div`
  position: absolute;
  left: 0;
  bottom: 0;
  padding: 10px;
  color: white;

  h2 {
    font-size: 15px;

    span {
      display: block;
      font-size: 12px;
    }
  }

  p {
    display: none;
  }
`;

const Slider = () => {
  return (
    <Wrapper>
      <Team>
        <TeamItem>
          <Profile>
            <img src={blackMilktea} alt='vliews' />
            <ProfileContents>
              <h2>
                블랙밀크티<span>블랙밀크티</span>
              </h2>
              <p>
                아주아주 맛있는 블랙밀크티입니다. 시원한 아이스와 쫀득한 펄의
                만남! 맛을 기대해주세요.
              </p>
            </ProfileContents>
          </Profile>
        </TeamItem>

        <TeamItem>
          <Profile>
            <img src={blackMilktea} alt='vliews' />
            <ProfileContents>
              <h2>
                블랙밀크티<span>블랙밀크티</span>
              </h2>
              <p>
                아주아주 맛있는 블랙밀크티입니다. 시원한 아이스와 쫀득한 펄의
                만남! 맛을 기대해주세요.
              </p>
            </ProfileContents>
          </Profile>
        </TeamItem>

        <TeamItem>
          <Profile>
            <img src={blackMilktea} alt='vliews' />
            <ProfileContents>
              <h2>
                블랙밀크티<span>블랙밀크티</span>
              </h2>
              <p>
                아주아주 맛있는 블랙밀크티입니다. 시원한 아이스와 쫀득한 펄의
                만남! 맛을 기대해주세요.
              </p>
            </ProfileContents>
          </Profile>
        </TeamItem>

        <TeamItem>
          <Profile>
            <img src={blackMilktea} alt='vliews' />
            <ProfileContents>
              <h2>
                블랙밀크티<span>블랙밀크티</span>
              </h2>
              <p>
                아주아주 맛있는 블랙밀크티입니다. 시원한 아이스와 쫀득한 펄의
                만남! 맛을 기대해주세요.
              </p>
            </ProfileContents>
          </Profile>
        </TeamItem>

        <TeamItem>
          <Profile>
            <img src={blackMilktea} alt='vliews' />
            <ProfileContents>
              <h2>
                블랙밀크티<span>블랙밀크티</span>
              </h2>
              <p>
                아주아주 맛있는 블랙밀크티입니다. 시원한 아이스와 쫀득한 펄의
                만남! 맛을 기대해주세요.
              </p>
            </ProfileContents>
          </Profile>
        </TeamItem>
      </Team>
    </Wrapper>
  );
};

export default Slider;

작동 결과

views