ES6 및 vue.js 사용 전 알아둬야 할 키워드 요약
ECMAScript는 스크립트 언어가 준수해야 하는 규칙, 세부 사항 및 지침을 제공한다.
ES6는 ECMAScript 2015를 의미하며 클래스와 모듈 같은 복잡한 응용 프로그램을 작성하기 위한 새로운 문법이 추가된 버전
ES6를 사용하면 가독성과 유지보수성 향상
const & let : let(변수 재선언 방지), const(상수)
화살표 함수 :=>
문법을 사용하는 축약형 함수
새로운 객체 리터럴 : 객체를 더 축약해서 정의
Spread Operator : 객체나 배열의 값을 다른 객체/배열로 복제 시 사용
템플릿 리터럴 : 문자열에서 변수 사용 시 용이
구조 분해 문법 : 객체, 배열 등 데이터를 변수 밖으로 꺼내서 사용하는 방법
js파일을 곧 모듈이라고 한다.
모듈에서 다른 모듈을 가져올import
수 있고 내보낼export
수 있다.
생성한 모듈은 브라우저도 모듈로 인식할 수 있도록 <script>
태그에 명시해줘야 한다.
<script type="module" src="./utils.js"></script>
모듈은 자신만의 스코프를 가져서 export 하지 않으면 다른 모듈에서 접근할 수 없다.
동일한 모듈을 여러번 import 하면 최초 import만 적용된다.
모듈에 선언한 변수나 함수 등 전부 다른 모듈에 제공할 때 사용
export const firstName = 'lee';
export function getAge() {
return 5;
}
export default
는 기존 내보내기로 대표나 한개만 export할 경우 지정한다.
여러값을 export하기 쉬움. export 된 이름을 사용하여 import한다.
export default myFunctionOrClass
모듈 당 한개의 default export를 가질 수 있음.
가장 간단학게 export 할 수 있어서 보통 모듈의 대표성을 가지는 것을 지정한다.
단일 값이나 모듈에 대한 대체 값 export 시 사용
예제
<my-module.js>function a(x) { return x * x * x; } const foo = Math.PI + Math.SQRT2; export { a, foo }; // let b = function b(x) { return x * x * x; } export default b;
<import 시>
import { a, foo } from 'my-module'; //default export를 import 시 import myFunction from 'my-module';
console.log(a(3));
와console.log(myFunction(3))
둘다 27이 나온다.
외부 스크립트 또는 외부 모듈의 export된 함수, 객체를 가져와서 사용할 수 있음
import {myMember} from "my-module.js";
import {foo,bar} from"my-module.js";
as
사용, 여러 멤버를 가져올 때도 가능import {reallyReallyLongModuleMemberName as shortName} from "my-module.js";
import "my-module.js";
default export
가져오기import myModule from "my-module.js";
비구조화라고 하며 구조(객체, 배열 등) 밖으로 데이터를 꺼내올 수 있는 문법이다.
기존 객체의 데이터에 접근하려면
const settings = {
notifications: {
follow: true,
alerts: true
},
color: {
theme: "dark"
}
};
console.log(settings.notifications.follow
); 이런 방식으로 접근해야 했다
Destructuring
을 적용할 경우
const {
notifications: { follow = false },
color
} = settings;
바로 console.log(follow);
로 follow의 데이터를 가져올 수 있다.
color
를 불러올 경우 { theme: 'dark' }
를 값으로 가져온다.
만약 follow의 값이 할당되어 있지않다면 default value로 설정한 false
를 가져온다.
- 배열에 적용한 경우
const fruits = ["apple", "banana"] const [f1, f2, f3="melon"] = fruits;
f2 = fruits[1];
==f2
- 함수에 적용한 경우
function saveSettings({follow, alerts, color = "light" }){ console.log(`follow: ${follow}`); } saveSettings({ follow: true, alerts: true })
기존에는 function(인자)로 객체를 받았다면
인자.변수
로 접근해야 했음.
value shorthands
객체에 key이름과 value의 이름이 동일하다면 value 하나만 적어줘도 데이터가 넣어준다.
기존에는 follow: follow
const settings = {
follow,
alerts
}
swapping
배열을 이용해 변수의 값을 바꿔주는 방법
let apple = "banana";
let banana = "apple";
[banana, apple] = [apple, banana];
[banana, apple] = [apple, banana]
== banana = apple; apple = banana;
== banana = "banana"; apple = "apple"
skipping
배열의 중간값만 필요할 때 사용하는 방법
const fruits = ["apple", "banana", "melon", "strawberry"];
const [, banana, , strawberry] = fruits;
필요 없는 값은 ,
로 설정
=>
(Arrow)로 축약한 함수.
일반 함수의 자신을 호출하는 객체를 가리키는 dynamic this
와 달리 arrows 함수는 코드의 상위 스코프(lexical scope)를 가리키는 lexical this
를 가진다.
즉 화살표 함수에서 this를 사용하면 함수 자신을 바인드 하지 않고 함수의 스코프(함수가 속한 상위 범위)에서의 this 가 적용된다.
기존 function 사용
const nameLength = nameList.map(function(name){ return name.length; })
- ES6의 arrow function 사용
const nameLength = nameList.map(name => { return name.length; })
- 인자가 1개만 존재할 경우 더 축약가능 (implicit return)
const nameLength = nameList.map(name => name.length);
- object를 반환할 경우
const nameList = ["minsung", "sungbin"] const nameLength = nameList.map((name,index) => ({ nameLength:name.length, index }));
자주 사용하는 함수
find() : 배열.find(item => item.includes(조건));
조건을 만족하는 첫번째 값을 반환
filter() : 배열.filter(item => item.includes(조건));
조건을 만족하는 모든 요소를 배열로 반환
ForEach() : 배열.forEach(item => { 본문 });
본문을 주어진 배열의 각 인덱스마다 실행한다.
Dafault Value
const intro = (name="anonymous") => "My name is " + name;
함수 생성 시 인자값에서 초기값 지정이 가능하다
변수의 정의가 범위에 따라 선언과 할당으로 분리되는 것을 의미하며 javascript(바닐라스크립트)가 가진 특징 중 하나다.
일반적으로 var
로 변수를 선언할 경우 모든 변수들은 hoist된다.
function test(){
x=10;
console.log(x);
var x;
}
변수가 함수 안에서 어디에서든지 정의가 된다면
function test(){
var x;
x=10;
console.log(x);
}
내부적으로는 변수의 선언이 함수의 최상위로 인식하며 test()
시 x가 출력되는 것을 볼 수 있다.
다른 언어들 같은 경우는 변수 선언의 위치에 맞게 코드가 순차적으로 실행되지만 자바스크립트는 순차적으로 실행하지 않고 변수선언을 가장 먼저 실행한다.
일반적으로 literal은 데이터를 표현하는 방식을 의미한다.
객체지향에서 리터럴이란 변수를 선엄함과 동시에 그 값을 정해주는 표기법이다.
ES6에는 두개의 리터럴이 존재한다.
내장된 표현식을 허용하는 문자열 리터럴. 런타임 시점에 일반 자바스크립트 문자열로 변환된다.
표현식/문자열 삽입, 여러 줄 문자열, 문자열 형식화, 문자열 태깅 등 다양한 기능을 제공
기존에는 +
로 문자열이나 변수들을 연결해줬다면
백틱(`)으로 문자열과 변수를 감싸준다.
`string text`
`string text line 1
string text line 2`
`string text ${변수} string text`
스크립트 안에서 html을 사용할 수 있다.
const appendName = () => {
const div = `
<div class="name_box">
<h1 class="name">
minsung
<h1>
</div>
`
wrapper.innerHTML = div;
}
객체를 정의할 때 축약해서 사용할 수 있도록 하는 객체 리터럴이다.
var language = 'javascript';
var josh = {
// language: language,
language
};
const myComponent = {
template: '<p>My Component</p>'
};
new Vue({
components: {
// myComponent: myComponent
myComponent
}
});
onst josh = {
coding: function() {
console.log('Hello World');
}
};
const josh = {
coding() {
console.log('Hello World');
}
};
기존 javascript에서 비동기성에 의하여 함수의 중첩으로 에러가 발생해도 바로 예외처리가 되지 않는 경우를 위해서 생긴 개체.
비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타낸 개체를 promise라고 한다.
매개변수로 excutor
를 받는다.
resolve와 reject는 함수로서 호출되면 promise를 실행하거나 거부하게 됨.
즉 비동기 작업이 모두 끝나면 resolve 를 호출해 이행하고, 중간에 오류가 생기면 reject 를 이용해 거부
Promise의 3가지 상태
- pending : 대기 상태. 아직 resolve 할지 reject 할 지 결정되지 않은 초기의 상태
- fullfilled : 이행 상태. 연산이 성공적으로 완료된 상태
- rejected : 거부 상태. 연산이 실패한 상태
const promise = new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve("resolve");
}, 3000);
});
console.log(promise);
setInterval(()=>{
console.log(promise);
}, 1000);
excutor 는 arrow함수.
3초 후에 resolve 하게 되고 밖에서는 1초마다 promise 를 실행하게 했을 때의 결과
Promise { <pending> }
Promise { <pending> }
Promise { <pending> }
Promise { 'resolve' }
Promise { 'resolve' }
Promise { 'resolve' }
promise 가 종료가 되면 resolve 에 들어간 값을 받을 수 있음.
promise.then(value => console.log(value));
reject 된 경우 then 으로 받으면 에러가 발생하기 때문에 에러는 받는 catch
promise.then(result => console.log(result)).catch(error => console.log(error));
resolve 시에는 then, reject 시에는 catch 가 실행되는 것이다.
자바스크립트는 프로토타입 기반 언어로 프로토 타입을 이용해 새로운 객체를 만들어 낸다.
프로토타입 == 객체의 원형
프로토타입으로 생성된 객체는 또 다른 객체의 원형이 될 수 있다.
프로토타입은 객체를 확장하고 객체 지향적인 프로그래밍을 가능하게 한다.
자바스크립트는 함수를 통해 변수를 생성하면 메모리에 각각의 변수가 할당된다.
function Person() {
this.eyes = 2;
this.nose = 1;
}
var kim = new Person();
var park = new Person();
kim과 part의 eyes와 nose가 각각 메모리에 할당된 것.
function Person() {}
Person.prototype.eyes = 2;
Person.prototype.nose = 1;
var kim = new Person();
var park = new Person():
프로토타입을 사용한다면 Person.prototype이라는 빈 Object를 사용해서
Person 함수로부터 생성된 객체(kim, park)은 어딘가에 존재하는 Object에 들어있는 값(eyes와 nose)을 모두 쓸 수 있다.
여러개 파일을 하나의 파일로 합쳐주는 모듈 번들러(Module bundler) 중 하나다.
ES6에서는 export를 이용해 모듈로 만들고 import로 가져오게 되는데 이런 모듈을 모든 브라우저에서 지원하진 않기 때문에 브라우저와 무관하게 사용할 수 있는 모듈이 필요한데 이때 모듈 번들러를 사용하는 것.
웹팩은 하나의 시작점Entry point
으로부터 의존적인 모듈을 전부 찾아내서 하나의 파일Output
로 만든다.
로더는 웹팩이 웹 애플리케이션을 해석할 때 자바스크립트 파일이 아닌 것들을 변환할 수 있도록 도와준다.
파일을 다른 언어 (ex : TypeScript)에서 JavaScript로 변환하거나 인라인 이미지를 데이터 URL로 로드하거나 또한 자바스크립트 모듈에서 직접 CSS파일을 import할 수 있다.
웹팩의 기본적인 동작에 추가적인 기능을 제공하는 속성.
결과물의 형태를 바꾸는 역할
즉
Loaders
는 번들이 생성되는 동안이나 생성되기 전에 개별 파일 수준에서 작업이되는 것이고Plugin
은 번들이 생성 된 후에 작동한다.
자바스크립트 컴파일러. 즉, javascript 로 결과물을 만들어주는 컴파일러
다양한 프레임워크로 개발한 스크립트 언어들을 순수 javascript로의 compile 이 필요해져서 사용한다.
다른 언어로 만들어서 크로스 브라우징 이슈가 발생하지 않도록 모든 브라우저에서 동작할 수 있도록 호환성을 지켜주는 트랜스파일러 역할.
ES6+의 자바스크립트 코드는 하위 버전으로 변환되어 다른 브라우저에서 동작하게 만든다.
npm과 yarn은 node로 프로젝트를 진행할 때 많이 쓰이는 패키지 관리 툴이다.
자바스크립트 언어를 위한 패키지 관리자로, Node.js의 기본 패키지 관리자
패키지를 설치할 때 순차적으로 처리
패키지가 설치될 때 자동으로 코드와 의존성을 실행할 수 있도록 허용해서 안정성에 위협받을 수 있음
페이스북에서 만든 자바스크립트 패키지 매니저
npm의 단점으로는 속도(performance), 안정성(stability), 보안성(security)을 보완한 가벼운 패키지 관리 툴.
패키지를 설치할 때 병렬로 처리
yarn.lock이나 package.json으로 부터 설치만 하는데 모든 디바이스에 같은 패키지를 설치하는 것을 보장하기 때문에 버전의 차이로 인해 생기는 버그를 방지
기존의 CSS의 프로젝트 규모가 커지면 가독성이 떨어지는 등 유지보수의 어려움의 단점을 보완해서 코드의 재활용성, 가독성울 높이기 위해 나온 것.
CSS를 편리하게 이용할 수 있도록 도와주며 추가 기능도 있는 확장판 스크립팅언어.
.list {
width: 100px;
float: left;
}
li {
color: red;
background: url("./image.jpg");
}
li:last-child {
margin-right: -10px;
}
.list {
width: 100px;
float: left;
li {
color: red;
background: url("./image.jpg");
&:last-child {
margin-right: -10px;
}
}
}
css 전처리기는 기존 CSS에서 스타일을 적용해야 하는 요소들이 있다면 코드를 복사해서 붙여야하고, 수정이 필요할 때에는 일일이 찾아서 수정해야 하는 번거로움을 해소하고자 나온 것.
CSS가 동작하기 전에 미리 동작한다.
객체지향의 5대 원칙 중 하나로 클래스는 단 한 개의 책임을 가져야 한다.
는 규칙.
클래스가 여러 책임을 갖게 되면 그 클래스는 각 책임마다 변경되는 이유가 여러개 발생해서 복잡해지기 때문에 클래스를 변경하는 이유는 단 한 개여야함.
클래스 안에 정의되어 있는 모든 기능은 하나의 책임을 수행하기 위해 움직여야 함.
유지보수를 용이하게 하기위해서 적용해야 할 규칙.
예제는 이 블로그에서 참고
추가 참고
ES6
vue.js+ES6
모듈번들러와 트랜스파일러
모듈
템플릿 리터럴
프로토타입
Babel
NPM과 YARN