Node.js
Node.js
- 자바스크립트는 브라우저를 조작하는 유일한 언어
- 자바스크립트를 구동하기 위한 런타임 환경인 Node.js로 인해 브라우저가 아닌
환경에서도 구동할 수 있게 됨
- Chrome V8 엔진을 제공하여 여러 OS 환경에서 실행할 수 있는 환경을 제공
- Browser만 조작 가능했으나, Server-Side-Programming 또한 가능해짐
NPM (Node Package Manage)
- 자바스크립트 패키지 관리자
- Python에 pip가 있다면 Node.js에는 npm
- pip와 마찬가지로 다양한 의존성 패키지를 관리
- Node.js의 기본 패키지 관리자
- Node.js 설치 시 함께 설치됨
Vue CLI
Vue CLI
- Vue 개발을 위한 표준 도구
- 프로젝트의 구성을 도와주는 역할
- 확장 플러그인, GUI, Babel등 다양한 tool 제공
Vue CLI Quick Start
Vue CLI 프로젝트 구조
Vue CLI 프로젝트 구조
node_modules
- node.js 환경의 여러 의존성 모듈
- python의 venv와 비슷한 역할을 함
- 따라서 .gitignore에 넣어주어야 하며,
vue 프로젝트를 생성하면 자동으로 추가됨
node_modules - Babel
Babel 동작 예시
node_modules - Webpack
- "static module bundler"
- 모듈 간의 의존성 문제를 해결하기 위한 도구
- 프로젝트에 필요한 모든 모듈을 매핑하고 내부적으로
종속성 그래프를 빌드함
Module
-
개발하는 애플리케이션의 크기가 커지고 복잡해지면
파일 하나에 모든 기능을 담기가 어려워짐
-
따라서 자연스럽게 파일을 여러 개로 분리하여 관리를 하게 되었고,
이때 분리된 파일 각각이 모듈(module) 즉, js 파일 하나가 하나의 모듈
-
모듈은 대개 기능 단위로 분리하며,
클래스 하나 혹은 특정한 목적을 가진 복수의 함수로 구성된 라이브러리 하나로 구성됨
-
여러 모듈 시스템
- ESM(ECMAScript Module), AMD, CommonJS, UMD
Module 의존성 문제
- 모듈의 수가 많아지고 라이브러리 혹은 모듈 간의 의존성이 깊어지면서
특정한 곳에서 발생한 문제가 어떤 모듈 간의 문제인지 파악하기 어려움
- Webpack은 이 모듈 간의 의존성 문제를 해결하기 위해 등장
Bundler
-
모듈 의존성 문제를 해결해주는 작업이 Bundling
-
이러한 일을 해주는 도구가 Bundler이고, Webpack은 다양한 Bundler 중 하나
-
모듈들을 하나로 묶어주고 묶인 파일은 하나(혹은 여러 개)로 만들어짐
-
Bundling된 결과물은 개별 모듈의 실행 순서에 영향을 받지 않고 동작하게 됨
-
snowpack, parcel, rollup.js 등의 webpack 이외에도 다양한 모듈 번들러 존재
-
Vue CLI는 이러한 Babel, Webpack에 대한 초기 설정이 자동으로 되어 있음
node_modules의 의존성 깊이
webpack - static module bundler
- 의존성을 webpack이 담당해 주므로 개발자는 npm install을 사용해 다양한 모듈을 한 번에 설치하고 각 모듈을 사용해 개발에 집중할 수 있음
package.json
- 프로젝트의 종속성 목록과
지원되는 브라우저에 대한 구성 옵션을 포함
package-lock.json
- node_modules에 설치되는 모듈과 관련된
모든 의존성을 설정 및 관리
- 협업 및 배포 환경에서
정확히 동일한 종속성을 설치하도록 보장하는 표현
- 사용 할 패키지의 버전을 고정
- 개발 과정 간의 의존성 패키지 충돌 방지
- python의 requirements.txt 역할
public/index.html
- Vue앱의 뼈대가 되는 html 파일
- Vue 앱과 연결될 요소가 있음
src
-
src/asset
-
src/components
-
src/App.vue
- 최상위 컴포넌트
- public/index.html과 연결됨
-
src/main.js
- webpack이 빌드를 시작할 때 가장 먼저 불러오는 entry point
- public/index.html과 src/App.vue를 연결시키는 작업이 이루어지는 곳
- Vue 전역에서 활용 할 모듈을 등록할 수 있는 파일
Component
Component
- UI를 독립적이고 재사용 가능한 조각들로 나눈 것
- CS에서는 다시 사용할 수 있는 범용성을 위해 개발된 소프트웨어 구성 요소를 의미
- 하나의 app을 구성할 때 중첩된 컴포넌트들의 tree로 구성하는 것이 보편적임
- Web 시간에 배운 HTML 요소들의 중첩을 떠올려 보자!
- Body tag root node로 하는 tree의 구조이다
- 마찬가지로, Vue에서는 src/App.vue를 root node로 하는 tree의 구조를 가짐
- 컴포넌트는 유지보수를 쉽게 만들어 줄 뿐만 아니라
재사용성의 측면에서도 매우 강력한 기능을 제공
- 우리가 사용하는 웹 서비스는 여러 개의 컴포넌트로 이루어져 있음
- 하나의 컴포넌트를 만들어 두면 반복되는 UI를 쉽게 처리할 수 있음
Django에서의 예시
- base.html과 index.html을 분리해서 작성했지만 하나의 화면으로 볼수 있었음
-> 즉, 한 화면은 여러 개의 컴포넌트로 이루어 질 수 있음
- base.html을 변경하면 이를 extends하는 모든 화면에 영향을 미침
- index.html에서 for문을 통해 여러 게시글들을 하나의 형식에 맞추어서 출력해줌
- 형식을 재사용하고 있었음
-> 우리는 너무 자연스럽게 컴포넌트 기반으로 개발을 진행하고 있었다!
Component based architecture 특징
- 관리가 용이
- 재사용성
- 확장 가능
- 캡슐화
- 독립적
SFC
component in Vue
- 그렇다면 Vue에서 말하는 component란 무엇일까?
- 이름이 있는 재사용 가능한 Vue instance
- 그렇다면 Vue instance란?
- 앞서 수업에서 사용한 new Vue()로 만든 인스턴스
SFC (Single File Component)
- 하나의 .vue 파일이 하나의 Vue instance이고, 하나의 컴포넌트이다
- Vue instance에서는 HTML, CSS, JavaScript 코드를 한번에 관리
- 이 Vue instance를 기능 단위로 작성하는 것이 핵심!
- 컴포넌트 기반 개발의 핵심 기능
정리
- HTML, CSS, 그리고 JavaScript를 .vue라는 확장자를 가진 파일 안에서 관리하며 개발
- 이 파일을 Vue instance, 또는 Vue component라고 하며, 기능 단위로 작성
- Vue CLI가 Vue를 Component based하게 사용하도록 도와줌
Vue component
vue component 구조
-
템플릿(HTML)
- HTML의 body 부분
- 눈으로 보여지는 요소 작성
- 다른 컴포넌트를 HTML 요소처럼 추가 가능
-
스크립트(JavaScript)
- JavaScript코드가 작성되는 곳
- 컴포넌트 정보, 데이터, 메서드 등
vue 인스턴스를 구성하는 대부분이 작성 됨
-
스타일(CSS)
vue component 구조 정리
- 노드하나하나가 .vue 파일
- 컴포넌트들이 tree 구조를 이루어 하나의 페이지를 만듦
- root에 해당하는 최상단의 component가 App.vue index.html과 연결
이 App.vue
- 결국 index.html 파일 하나만을 rendering
Vue component 실습
현재 구조
- Vue CLI를 실행하면 이미 HelloWorld.vue라는 컴포넌트가 생성되어 있고
App.vue에 등록되어 사용되고 있음
- npm run serve 명령어를 진행 했을 때 나온 화면의 대부분이 HelloWorld.vue
MyComponent.vue
- src/components/ 안에 생성
- script에 이름 등록
- template에 요소 추가
templates 안에는 반드시 하나의 요소만 추가 가능
- 비어있어도 안됨
- 해당 요소 안에 추가 요소를 작성해야 함
component 등록 3단계
- 불러오기
- 등록하기
- 보여주기
component 등록 - 불러오기
import {instance name} from {위치}
- instance name은 instance 생성 시 작성한 name
- @는 src의 shortcut
- .vue 생략 가능
component 등록 - 등록하기
component 등록 - 보여주기
- 닫는 태그만 있는 요소처럼 사용
component 등록 결과
자식 컴포넌트 작성
- 이제 MyComponent의 자식 컴포넌트를 만들어보자
- 자식 관계를 표현하기 위해 기존 MyComponent에 간단한 border를 추가
- src/components/ 안에 MyChild.vue 생성
scoped
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
scoped
를 적용하면 해당 .vue내 에서만 style 적용되도록 해줌