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

3 분 소요

chocolatey 설치

> @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

# 설치확인
> choco -version
0.10.15

node.js 설치

// node.js 설치
$ choco install nodejs-lts

// node.js 설치 확인
$ node -v
  • 웹개발에 맞게 javascript를 학습

javascript 실행

  • index.html

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="main.js"></script>
      </head>
      <body>
      </body>
    </html>
    
  • main.js

    console.log('Hello World!');
    
  • chorme 브라우저에서 index.html 을 열고 개발자 도구 실행(F12) > ‘Hello World!’ 출력확인

dev tools

console

  • 간단한 javascript 사용 가능

source

  • 디버깅 가능

network

  • 웹페이지의 네트워크 확인

자바스크립트의 공식사이트는?

  • es6 사이트가 있지만 너무 어려움
  • developer.mozilla.org 를 추천

async vs defer

  • javascript의 위치에 따라 브라우저가 웹페이지를 해석하는 순서

첫번째 방법

  • 소스

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        **<script src="main.js"></script>**
      </head>
      <body>
      </body>
    </html>
    
  • 실행순서

    parsing HTML > fetching js > excuting js > parsing HTML       
    
  • 특징

    • 페이지를 해석하다가 자바스크립트를 다운받아 실행하고 다시 페이지를 해석
    • 페이지가 완성되는 시점이 느리다

두번째 방법

  • 소스

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
      </head>
      <body>
        **<script src="main.js"></script>**
      </body>
    </html>
    
  • 실행순서

    parsing HTML > fetching js > excuting js       
    
  • 특징

    • 페이지를 다 해석하여 완성하고 자바스크립트를 다운받아 실행
    • 페이지가 표현된 직후에는 자바스크립트를 이용한 액션이 불가능

세번째 방법

  • 소스

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
      </head>
      <body>
        **<script async src="main.js"></script>**
      </body>
    </html>
    
  • 실행순서

    parsing HTML >   blocked   > parsing HTML
     fetching js > excuting js  
    
  • 특징

    • 페이지를 해석하면서 자바스크립트를 다운로드 하므로 시간절약
    • 자바스크립트가 실행될 때 페이지가 온전히 해석되지 않았다면 오류 발생
    • 시간적인 장점도 그다지…

네번째 방법

  • 소스

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
      </head>
      <body>
        **<script defer src="main.js"></script>**
      </body>
    </html>
    
  • 실행순서

        parsing HTML        > excuting js
    fetching js
    
  • 특징

    • 페이지를 해석하면서 자바스크립트를 다운받고, 페이지 해석이 종료되면 자바스크립트를 실행
    • 가장 좋은 방법

async vs defer

async

  • 소스

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
      </head>
      <body>
        **<script async src="a.js"></script>**
        **<script async src="b.js"></script>**
        **<script async src="c.js"></script>**
      </body>
    </html>
    
  • 실행순서

    parsing HTML  > blocked  > blocked     > blocked          > parsing HTML
    fetching a.js            > executing a.js
    fetching b.js > executing b.js
    fetching c.js                          > executing ca.js
    
  • 특징

    • javascript 가 실행순서를 지키지 않고 실행됨
    • javascript 가 서로 의존적이라면 문제 발생

async

  • 소스

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
      </head>
      <body>
        **<script defer src="a.js"></script>**
        **<script defer src="b.js"></script>**
        **<script defer src="c.js"></script>**
      </body>
    </html>
    
  • 실행순서

    parsing HTML          > executing a.js > executing b.js > executing c.js
    fetching a.js     >
    fetching b.js >
    fetching c.js         >
    
  • 특징

    • javascript 를 비동기적으로 다운된 다음 순서대로 실행됨

Use strict

  • js 상단에 'use strict'; 라고 선언
  • Whole-script strict mode syntax
  • ECMA 5 에서 정의되었음
  • 예컨데 선언되지 않은 변수의 사용 등이 불가능해 짐
  • javascript 성능 개선에도 도움

참고