codemilli / BTG

Be The Googler meetings
0 stars 0 forks source link

1. JavaScript Module #1

Open codemilli opened 5 years ago

codemilli commented 5 years ago

JavaScript Module

모듈은 JS는 파일간 코드를 import, export 할 수 있게 해준다. 모듈 시스템에는 Nodejs에서 사용하는 CommonJS와 AMD 등이 있는데, 자바스크립트는 이제 표준화된 문법을 가진다.

export 키워드를 이용해서 값을 export할 수 있다.

// 📁 lib.mjs
export const repeat = (string) => `${string} ${string}`;
export function shout(string) {
  return `${string.toUpperCase()}!`;
}

import 키워드를 사용하면 export된 값을 다른 파일에서 사용할 수 있게 된다.

// 📁 main.mjs
import {repeat, shout} from './lib.mjs';
repeat('hello');
// → 'hello hello'
shout('Modules in action');
// → 'MODULES IN ACTION!'

모듈 시스템을 이용하면

JS 모듈을 브라우저에서 사용하기

다음과 같이 브라우저가 <script> 태그를 모듈처럼 처리하게 할 수 있다.

<script type="module" src="main.mjs"></script>
<script nomodule src="fallback.js"></script>

type=“module” 이라는 형식을 인식하는 브라우저는 nomodule 로 표시된 스크립트는 무시한다. 이는 모듈 시스템을 지원하지 않는 브라우저 대상으로 fallback역할을 할 수 있게 해준다. 모듈 시스템을 인식하는 브라우저라면 이 테이블에 나와있듯이 다른 모던 자바스크립트 기능을 지원함으로 따로 transpile하는 수고를 덜고 용량도 더 낮출 수 있다.

File extensions에 관하여

브라우저에서는 사실 파일 포맷이 크게 상관없다. 왜냐하면 어차피 스크립트 태그에서 자바스크립트로 표기하여 내려받기 때문이다. 하지만 .mjs 라는 포맷이 모듈에 필요한 이유는 다음 두가지 이유이다.

모듈은 기본적으로 지연된다.

renderer-main-thread-time-breakdown

type=“module” 로 선언하면 <script defer> 를 선언한 것과 같이 html parsing을 방해하지 않고, fetch 및 execute 된다.

다른 기능들

Dynamic import

간혹 모듈을 실행과 동시에 다운받지 않고, 필요할때에 따라서 받고 싶은 경우가 생긴다. 이런 행위를 통해서 초기 로드 시간을 줄일 수 있기 때문이다. 모듈 시스템에서 Dynamic Import가 가능하다 !

<script type="module">
  (async () => {
    const moduleSpecifier = './lib.mjs';
    const {repeat, shout} = await import(moduleSpecifier);
    repeat('hello');
    // → 'hello hello'
    shout('Dynamic import in action');
    // → 'DYNAMIC IMPORT IN ACTION!'
  })();
</script>

import.meta ???

퍼포먼스