Giter VIP home page Giter VIP logo

happy-year-message-spa's Introduction

Vanlia JS로 SPA 구현하기! 🍨

바닐라JS라고 써있지만 타입스크립트로 구현한 SPA 기반 게시판 입니다.


프로젝트 실행 방법 🚀

npm run dev

사이트 주소 🪩

http://ts-spa.s3-website.ap-northeast-2.amazonaws.com/


페이지 소개 🌁

메인 페이지 게시글 작성 페이지 상세 페이지 수정하기 페이지

기술 스택 🛠️

  • typescript : Class를 좀더 명시적으로 작성 + 타입 지정으로 안전한 코드 작성 위함
  • webpack : spa를 구현하기 위한 환경 셋팅 + 번들러
  • scss : 스타일 코드들을 구분하여 조금 더 효율적으로 관리하기 위한 css 전처리기

디렉토리 구조 📂

자세히 보기
.
├── README.md
├── package-lock.json
├── package.json
├── index.html
├── src
│   ├── index.ts
│   ├── router.ts
│   ├── pages
│   │   ├── mainpage.ts
│   │   ├── writepage.ts
│   │   ├── editpage.ts
│   │   ├── detailpage.ts
│   │   └── notFoundpage.ts
│   ├── components
│   │   └── CommonHeader.ts
│   ├── constants
│   │   └── index.ts
│   ├── shared
│   │   └── service
│   │       ├── index.ts
│   │       ├── postService.ts
│   │       └── commentService.ts
│   └── types
│        └── index.ts
├── styles
│   ├── index.scss
│   ├── components
│   ├── constants
│   ├── layouts
│   └── mixin
|
├── prettierrc.json
├── babel.config.json
├── tsconfig.json
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js

  • /src/* : ts 파일들
    • index.ts : webpack entry 시작점 최상단 root 파일
    • router.ts : 라우터 Class가 위치한 파일
    • components
      • CommonHeader.ts : 모든 페이지 상단의 공통 Header
    • constants
      • index.ts : 프로젝트에 쓰이는 상수 모음
    • pages
      • mainpage.ts : 게시글 리스트 페이지
      • detailpage.ts : 게시글 상세 페이지
      • writepage.ts : 작성하기 페이지
      • editpage.ts : 수정하기 페이지
      • notFoundpage.ts : 404 페이지
    • shared
      • service : API 정의
        • index.ts : get, post, patch, delete API 추상화
        • postService.ts : 게시글 관련 API 모음
        • commentService.ts : 댓글 관련 API 모음
      • utils.ts : 유틸함수 모음
    • types
      • index.ts : 프로젝트의 타입들 정의

  • /styles/* : scss 파일들
    • base : 아이콘 폰트 및 css 초기화 파일들
    • components : 공통으로 쓰이는 요소들의 스타일
    • constants : 컬러, 타이포그래피
    • layouts : 페이지 단위 스타일
    • mixin : scss 함수 파일
    • index.scss : 모든 scss 파일을 import 해놓은 root

  • webpack.common.js : webpack 공통 setting
  • webpack.dev.js : webpack dev-server 환경 setting
  • webpack.prod.js : webpack 빌드 setting

주요 기능 🧑🏼‍🏫

  • spa기반 페이지 라우팅
  • 게시글 list 조회
  • 게시글 작성
  • 게시글 수정
  • 게시글 삭제
  • 상세 게시글 조회
  • 댓글 작성
  • 댓글 삭제
  • UnSplash API를 활용한 랜덤이미지 조회

주요 메서드 및 함수 🧑🏻‍💻

라우터(핵심)

  • navigate(url, replaceOption) : 페이지를 이동시킬때 사용하는 메서드
  • pathToRegex(path) : 페이지 이동시 url을 받아서 정규식을 return 하는 메서드
  • getParams(targetPage) : 현재 페이지 정보가 담긴 객체를 받아서 파라미터를 객체로 return 해주는 메서드
  • router() : 페이지 url이 바뀔때 페이지 컴포넌트들을 그려주는 메서드

메인 페이지

  • attchPostPreviews(posts, parentElement) : posts(게시글 List)를 htmlStringTemplate으로 만들어 부모 요소에 부착 시키는 메서드
  • render() : 실제 페이지가 렌더링되고 해당 페이지 로직 실행 메서드

작성하기 페이지

  • attachPreviewImage(imageUrl, args, parentElement) : unsplash에서 받아온 이미지 정보를 htmlStringTemplate으로 만들어 부모요소에 부착 시키는 메서드

  • render() : 실제 페이지가 렌더링되고 해당 페이지 로직 실행 메서드

게시글 상세페이지

  • attchComment(comments, parentElement) : comments(댓글 List)를 htmlStringTemplate으로 만들어 부모 요소에 부착 시키는 메서드

  • render() : 실제 페이지가 렌더링되고 해당 페이지 로직 실행 메서드

happy-year-message-spa's People

Contributors

kokyusik91 avatar

Stargazers

 avatar

Watchers

 avatar

Forkers

che-ri

happy-year-message-spa's Issues

페이지 이동 관련 이슈 사항 😵

문제점

게시글 작성을 하고나서 제출 작성하고나서 routerInstance.navigate('/', {replace : true})로 메인페이지로 보냈었는데, 그렇게 되니 페이지가 하나 쌓인상태가 된다. (작성하기 페이지들어갈때 페이지가 하나 쌓였기 때문에)

해결~~~

게시글 작성을 하고 routerInstance.handleNavigateBack()로 뒤로가기로 보내버린다. 그러면 페이지 스택이 하나 빠지게 되고 메인페이지로 진입시 render()함수가 실행되어 fetch (getPosts)후 게시글 목록 그려주는 작업으로 페이지가 최신화된 게시글 목록으로 렌더링 된다!

페이지 스택이 쌓이는건 주의해서 개발~~

남은 To do!

1. 기능 구현해야할 사항

  • API 모두 연동시키기 (post, comment)
  • /post/:id 이동시 파라미터인 :/id를 받아올 수 있게 구현. (이게 제일 중요!! ✨✨✨✨)
  • 중복된 게시글 작성하지 못하도록 하는 메시지를 alert창에 표현 (에러 핸들링)
  • NotFoundPage 퍼블리싱

2. 리팩토링

  • 상세페이지 댓글 렌더링부분 개선해야 함.
  • API 모아둔 파일 추상화 시키기.
  • try catch로 Fetching 해오는 부분 공통함수로 묶기.
  • 전체적으로 함수형 프로그래밍처럼 순수함수로 구분
  • 사용자가 input에 html 혹은 js 코드 넣으면 망할수도.. 체크 (이것도 중요!!!! ✨✨✨✨✨✨)
  • 사진 용량 너무 큼!! -> 체크하기
  • 리액트 컴포넌트처럼 재사용 할수 있는 컴포넌트를 import 해서 붙여넣어 사용할 수 있는지 고민.
  • 웹 접근성 고려 Aria 시리즈
  • Semantic 하게 태그를 사용했는가?
  • unsplash AccessKey 환경변수 저장

3. 배포

  • 어떤거 이용해서 배포할지?? (AWS, 네이버 클라우드)
  • 배포후 정상 작동하는지 test

4. 유저 경험 개선

  • 제출하고 통신중일때는 전송중...이라는 텍스트로 변경
  • 전체적인 반응형 : 작아지면 폰트도 작아지게
  • 전체적으로 버튼 제출중에는 disabled 처리

5. 기타

  • Readme.md 파일 작성
  • 어려웠던 개념 정리
  • 블로그 정리

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.