서버사이드 랜더링이란 서버에서 랜더링의 책임을 지는 방식을 말한다
보내지는 html의 내용에 초기랜더링에 필요한 정보가 충분히 존재하는지 안하는지가 SSR과 CSR의 차이를 만들어낸다
SSR은 초기에 서버로부터 필요한 페이지의 내용이 다 담긴 html을 받게된다. ( 다 담겨있다 함은, 말 그대로 header, main, aside, footer 등등)
해당 2진수로 이루어진 html text 응답을 받은 브라우저는 응답 헤더에 담긴 content-type과, charset을 통해 이것을 html 문서로 파싱한다
이미 html에 초기 화면에 대한 레이아웃을 위한 노드들이 다 들어있기 때문에 브라우저에 그대로 페인팅을 할 수가 있다.
그 후, script 태그를 만나면 태그에 있는 src 주소를 통해 서버에 js파일을 요청하고, 이것을 응답받으면 interaction이 가능해진다
html에 필요한 정보들이 다 들어가 있는 상태로 응답받기 때문에, 전통적인 서치엔진(SEO) 이 이를 읽고 분석하기가 용이했다
예전에 SSR 의 가장 큰 단점이라면 이렇게 페이지마다 전환이 되야 할 때 html을 항상 전달받아야 했으므로 고질적인 "깜빡임" 현상을 피해갈 수가 없었다( 새로 서버로부터 html을 전달받아 리플로우와 리페인팅을 하는 과정 사이에서 발생하는 로딩 갭 )
하지만 지금은 next js와 같이 서버사이드 랜더링과 더불어 클라이언트측에서도 랜더링을 일정부분 담당하게 하는 기술들이 많이 나오게 되면서 SSR과 CSR의 장점을 같이 가져가는 형태로 발전하고 있다.
클라이언트사이드 렌더링이란 랜더링 책임이 클라이언트에게 있는 방식을 말한다
DOM을 자바스크립트로 수정이 가능하다는 부분을 이용, 모든 페이지 전환을 자바스크립트로 처리하는 방식이다
초기에는 서버사이드 랜더링과 마찬가지로 html에 대한 2진수 응답을 서버로부터 전달받는것은 동일하다.
하지만 그 안에 내용물에는, 정확하게 말하면 body 부분은 비워져있고 이 내용물을 채우는 행위를 자바스크립트로 하게된다
즉, html 파일을 파싱하면서 script 태그를 만나게 되는 순간, 서버로부터 js 파일을 요청하여 전달받는것은 SSR와 마찬가지로 동일하다
그런데 이 자바스크립트 파일에는 모든 페이지를 랜더링하는 코드가 들어있다.
따라서, 초기에 화면이 랜더링이 되기 위해서는 이 자바스크립트 파일이 모두 읽혀져서 DOM을 조작하여 리플로우와 리페인팅이 진행되기 전까지는 보여지지 않는다
이말인 즉슨, 초기 화면의 랜더링 시간이 SSR보다 늦어지게 된다는 의미가 된다.
하지만 한번 응답을 받게 되면 그 이후로는 모든 랜더링을 자바스크립트로 처리하고 필요한 데이터베이스 정보는 AJAX 요청을 통해 서버로부터 응답받아 업데이트하는 방식을 사용하므로, 사용자 경험에 있어서 유리하다는 점이 있다.
다만 초기 화면 렌더링이 오롯이 자바스크립트를 응답받고 파싱하는 시간에 달려있으므로, 만약 사용자의 인터넷 환경이 느리거나 컴퓨터 성능이 좋지 않다면 초기 화면이 보여지기 전까지 상당히 오랜시간 하얀화면을 보게 될 수도 있다.
우선 var과 (let, const) 는 서로 스코프적으로 큰 차이를 보인다
스코프란 식별자를 탐색하기 위한 바운더리를 뜻한다
모든 식별자는 자신이 선언이 된 위치에 의하여 다른 코드가 자신을 참조할 수 있는 유효 범위(스코프) 가 결정된다.
var의 스코프는 함수스코프를 따른다. 따라서, 함수 안에 존재한다면 외부에는 해당 var 의 식별자를 통해 접근을 할 수가 없다.
하지만, var은 블록스코프를 따르지 않는다. ( 예를들면 if문의 블록, for문의 블록 )
이 말인 즉슨, 전역에서 정의된 var의 식별자와 블록스코프의 안에 정의된 var 식별자는 서로 같은 스코프 안에 있는것과 다름없이 해석된다
따라서 덮어씌워지는 상황이 나타날 수 있다
var i = 10;
for (var i = 0; i < 5; i++){}
console.log(i) // 5
console.log(hoisting); // undefined
var hoisting;
console.log(hoisting) // ReferrenceError : hoisting is not defined
let hoisting;
const foo; // SyntaxError : Missing initializer in const declaration;
const bar = 1;
bar = 2; // TypeError : Assignment to constant variable