SOCO

콘솔에 출력, script async와 defer의 차이점 본문

프론트/java script 기초지식

콘솔에 출력, script async와 defer의 차이점

ssooda 2021. 6. 10. 21:23

[기초 용어]

1. API

API는 Application Programming Interface의 약자임.

이 중 웹 API는 자바스크립트 언어 자체에 포함된 것이 아니라

브라우저가 제공하는, 브라우저가 이해할 수 있는 함수를 말함.

 

2. console.log

console APIs, 그중에 log라는 함수를 이용해서 

우리가 원하는 메세지를 console창에 출력할 수 있음

 

node.js를 이용해서 (웹 브라우저 없이) console창에 출력되는 걸 볼 수 있음. 

그것은 node.js와 웹 APIs 모두 console에 관한 API가 있는 것임

API의 interface가 둘 다 동일함

 

console은 언어 자체에 포함되어 있는 아이는 아니지만 통상적으로 많이 쓰이는 아이라서

node.js와 웹의 APIs에 공통적으로 포함되어  있어서

똑같은 console AIP를 이용하여 node.js에서도 출력할 수 있고 브라우저의 콘솔창에서도 출력할 수 있음

 

3. 개발툴

브라우저에서 딸려나오는 개발 툴을 활용하면 좋음

element탭에서는 HTML,CSS 확인 가능

console탭에서는 코드에서 작성한 메시지확인 및 자바스크립트 실행이 가능함

요소를 검사하고 붙여넣고 지우고 할 수 있음

source탭은 디버깅할 때 유용함

network탭은 네트워크가 어떻게 발생하고 얼마나 많은 사이즈의 데이터가 오고가는지 검사할 수 있음 

 

 

[HTML에서 자바스크립트를 포함할 때 어떻게 포함하는 것이 효율적일까?]

1. head안에 <script src>

브라우저가 HTML을 parshing(한줄씩 읽음)하다가

script 태그가 보이면 js파일을 다운받음

그래서 parshing하는 것을 잠시 멈추고

필요한 js파일을 서버에서 다운받아서(fetching) 이것을 실행(executing)한 다음

다시 parshing을 시작함

 

PARSHING HTML ->BLOCKED(FETCHING JS & EXECUTING JS)-> PARSHING HTML

 

이렇게 하면 사용자가 웹사이트를 보는데까지 시간이 많이 걸림

 

2. <body> 끝부분에 <script src>

PARSHING HTML PAGE -> FETCHING JS & EXECUTING JS 

 

이 경우 사용자가 HTML의 내용을 빨리 본다는 장점은 있지만

웹사이트가 자바스크립트에 의존적인 경우

(예를 들면,  js를 이용해서 서버에 있는 데이터를 받아오거나

DOM요소를 더 이쁘게 꾸며주는 식으로 동작하는 웹사이트라면)

사용자가 의미있는 콘텐츠를 보기위해서는 역시 기다리는 시간이 발생함

 

3. <head>에 <script async src>

async는 불리언 타입의 속성값이므로 선언하는 것만으로도 true로 설정되어서 async옵셥을 사용할 수 있음

이 경우 HTML을 parshing 하다가 async를 보면 병렬적으로 js파일을 다운로드받음

parshing과 fetching을 병렬적으로 하다가,

js파일 다운로드가 완료가 되면 팔싱을 멈추고 js파일을 실행(executing)하게 됨

js파일 실행이 끝나면 HTML파일의 남은 부분을 parshing하게 됨 

 

이렇게 되면 시간을 절약할 수 있지만,

js가 HTML이 모두 parshing되기도 전에 실행 되는 문제가 발생함.

만약 js파일에서 querySelector을 이용하여 DOM요소를 조작하려고 하는 경우

조작하려는 시점에서(실행되는 시점에서) HTML의 요소가 아직 정의되지 않았을 수 있음

 

또한 js를 실행하기 위해  HTML parshing이 멈출수 있으므로 사용자가 페이지를 보는데 시간이 걸릴 수 있음.

게다가 async의 경우 정의된 스크립트순서에 상관없이 다운로드가 끝난 순서대로 js파일을 실행하므로

순서에 의존적인 코드라면 문제가 발생할 수 있음

 

4. <head> 안에 <script defer src>

parshing을 하다가 defer이 있으면 parshing과 fetching을 병렬적으로 수행함

HTML을 끝까지 parshing한 다음 parshing이 끝나면 js를 실행(executing)하게 됨

defer은 HTML을 parshing하는 동안 필요한 js를 다 다운받아놓고

HTML parshing이 끝나면 사용자에게 페이지를 먼저 보여주고 이어서 js를 실행함

defer은 js를 정의된 순서대로 실행함

 

HEAD안에 defer옵션을 이용해서 쓰는 것이 효율적임

 

[자바스크립트 'use strict', 타임스크립트]

자바스크립트 파일을 쓸때는 

'use strict'라는 것을 정의해주면 좋음

자바스크립트에서는 'use strict';를 정의해야하는 이유는

js는 유연한 언어라는 장점이 있지만

이로 인해 개발자가 많은 실수를 할 수도 있게 됨

(예를 들면, 선언되지 않은 변수에 값을 할당하는 문제 등)

use strict을 선언하면 비상직적인 코드의 오류를 잡아낼 수 있음

타임스크립트를 쓸 때는 별도로 정의할 필요가 없음

=> 자바스크립트 배우고 나면 타임스크립트 배울 것!