Skip to content

Latest commit

Β 

History

History
289 lines (198 loc) Β· 9.16 KB

Bundler_History.md

File metadata and controls

289 lines (198 loc) Β· 9.16 KB

Bundler History πŸ“–

λͺ¨λ“ˆμ΄λž€(What is Module)

μš°λ¦¬κ°€ κ΅¬ν˜„ν•œ 세뢀사항을 μΊ‘μŠν™” λ₯Ό ν•˜κ³  ν•„μš”ν•œ APIλΆ€λΆ„λ§Œ κ³΅κ°œν•˜μ—¬ μ‰½κ²Œ λ‘œλ“œν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” μ½”λ“œ 쑰각

λ‹€λ₯Έ κ³³μ—μ„œ κ°€μ Έμ˜¨ κ²ƒμ΄μ§€λ§Œ μ½”λ“œ μ‘°κ°μ΄λΌλŠ” ν‘œν˜„μ€ μ˜€λž«λ§Œμ— λ³Έ λ“―ν•˜λ‹€.


κ·Έλ ‡λ‹€λ©΄ Module이 μ™œ ν•„μš”ν•œκ°€? πŸ“

μš°λ¦¬λŠ” μ›λž˜ 기술적으둜 μš°λ¦¬λŠ” λͺ¨λ“ˆ 없이도 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆλ‹€. μΆ©λΆ„νžˆ μ˜ˆμ „μ΄λ‚˜ μ§€κΈˆμ΄λ‚˜ jqueryλ₯Ό μ‚¬μš©ν•΄μ„œ Inline으둜 잘 κ΅¬ν˜„ν•˜κ³  μžˆμ§€μ•Šλ‚˜?

🍁 Module 은 60, 70λ…„λŒ€ 이후 κ°œλ°œμžλ“€μ΄ λ‹€μ–‘ν•œ ν˜•μ‹κ³Ό ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μ‚¬μš©ν•΄μ˜¨ νŒ¨ν„΄μ΄λ‹€. 🍁

πŸ‘‰ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ Module 은 이둠적으둜 λ‹€μŒ 사항을 ν—ˆμš©ν•΄μ•Ό ν•œλ‹€.


  1. 좔상화 : νŠΉμˆ˜ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ— κΈ°λŠ₯을 μœ„μž„ν•˜μ—¬ μ‹€μ œ κ΅¬ν˜„μ˜ λ³΅μž‘λ„λ₯Ό 이해할 ν•„μš”κ°€ μ—†λ‹€.
  2. μΊ‘μŠν™” : μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ €λ©΄ Module 내뢀에 μ½”λ“œλ₯Ό μˆ¨κΈ΄λ‹€.
  3. μž¬μ‚¬μš© : 같은 μ½”λ“œλ₯Ό λ°˜λ³΅ν•΄μ„œ μž‘μ„±ν•˜λŠ” 것을 ν”Όν•œλ‹€.
  4. μ˜μ‘΄μ„± 관리 : μ½”λ“œλ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ μ‰½κ²Œ μ˜μ‘΄μ„±μ„ λ³€κ²½ν•œλ‹€.



Inline Script

μ‚¬λžŒλ“€μ΄ μ§€κΈˆλ„? 많이 μ‚¬μš©ν•˜κ³  μžˆλŠ” <script></script> 사이에 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 방법이닀.

κ·ΈλŸ¬λ‚˜ μ˜ˆμ „λΆ€ν„° μ‚¬μš©ν•˜λŠ” λ°©λ²•μ—λŠ” λ‹Ήμ—°ν•˜κ²Œλ„ 문제점이 μžˆλ‹€. πŸ’₯

  1. μž¬μ‚¬μš©μ„± : λ‹€μ‹œ μ‚¬μš©ν•˜λ €λ©΄ μ½”λ“œλ₯Ό λ³΅λΆ™ν•΄μ•Όν•œλ‹€.
  2. μ˜μ‘΄μ„± : μ˜μ‘΄μ„±μ„ κ°œλ°œμžκ°€ 잘 λ§žμΆ°μ£Όμ–΄μ•Όν•œλ‹€.
  3. μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ˜€μ—Ό : μ „μ—­μœΌλ‘œ 선언을 ν•˜μ—¬ 전역이 λ”λŸ¬μ›Œμ§„λ‹€. (ν”νžˆ λŒ€κΈ°μ—…μ—μ„œ ν”„λ‘œμ νŠΈλ‘œ jqueryλ₯Ό μ‚¬μš©ν•  경우)


Script tag(Use External File)

μ™ΈλΆ€μ˜ scriptνŒŒμΌμ„ λ§Œλ“€μ–΄μ„œ <script src="..."></script>λ₯Ό μ‚¬μš©ν•΄μ„œ μ™ΈλΆ€νŒŒμΌμ„ κ°€μ Έμ˜€λ„λ‘ ν•˜λŠ” 것이닀.

기쑴의 μ‚¬μš©ν•˜λ˜ Inline Script μ™€λŠ” λ‹€λ₯΄κ²Œ μž¬μ‚¬μš©μ„±μ—λŠ” μ’‹μ•„μ‘ŒμœΌλ‚˜ μ˜μ‘΄μ„±λ¬Έμ œμ™€ μ „μ—­μ˜ μ˜€μ—Όμ˜ μ˜μ§€λŠ” λ‚¨μ•„μžˆκ²Œλœλ‹€. πŸ’₯

  1. μ˜μ‘΄μ„± : μ˜μ‘΄μ„±μ„ κ°œλ°œμžκ°€ 잘 λ§žμΆ°μ£Όμ–΄μ•Όν•œλ‹€.
  2. μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ˜€μ—Ό : μ „μ—­μœΌλ‘œ 선언을 ν•˜μ—¬ 전역이 λ”λŸ¬μ›Œμ§„λ‹€.


Module Object and IIFE

Module Object and IIFEλ₯Ό μ‚¬μš©ν•˜κ²Œ 됨으둜써 μ „μ—­μ˜ μ˜€μ—Όμ΄ μ€„μ–΄λ“€κ²Œ λ˜μ—ˆλ‹€. μ—¬λŸ¬κ°œλ₯Ό 전역에 선언을 ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹Œ ν•˜λ‚˜μ˜ Objectλ₯Ό λ§Œλ“€μ–΄μ„œ κ·Έ μ•ˆμ— λ§Œλ“€μ–΄ μ‚¬μš©ν•¨μ— 따라 μ˜€μ—Όλ„κ°€ μ€„μ–΄λ“€κ²Œ λ˜λŠ” 것이닀.

μ•„μ§κΉŒμ§€ μ˜μ‘΄μ„±μ˜ λ¬Έμ œμ™€ μ „μ—­λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ™„μ „ν•œ μ˜€μ—Όμ΄ μ—†λŠ” κ²½μš°κ°€ μ—†λ‹€. πŸ’₯

  1. μ˜μ‘΄μ„± : μ˜μ‘΄μ„±μ„ κ°œλ°œμžκ°€ 잘 λ§žμΆ°μ£Όμ–΄μ•Όν•œλ‹€.
  2. μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ˜€μ—Ό : μ „μ—­μœΌλ‘œ 선언을 ν•˜μ—¬ 전역이 λ”λŸ¬μ›Œμ§„λ‹€.


λͺ¨λ“ˆ νŒ¨ν„΄(Module Pattern) πŸ‘

Module 포맷은 Module을 μ •μ˜ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλŠ” 문법이닀.

EcmaScript6 λ˜λŠ” ES2015 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” Module 을 μ •μ˜ν•˜κΈ° μœ„ν•œ 곡식적인 문법을 가지고 μžˆμ§€ μ•Šμ•˜λ‹€.

κ·Έ κ²°κ³Ό μ˜λ¦¬ν•œ κ°œλ°œμžλ“€μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ Module을 μ •μ˜ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ 포맷을 κ³ μ•ˆν•΄ λƒˆλ‹€.

λ‹€μŒμ€ 많이 μ±„νƒλ˜κ³  잘 μ•Œλ €μ§„ 포맷듀이닀. ❗

  • CommonJS(Nodejsκ°€ μ±„νƒν•œ νŒ¨ν„΄)
  • 비동기 λͺ¨λ“ˆ μ •μ˜(AMD, Asynchronous Module Definition)
  • 만λŠ₯ λͺ¨λ“ˆ μ •μ˜(UMD, Universal Module Definition)
  • System.register
  • ES6 λͺ¨λ“ˆ 포맷


Commonjs

// add.js
module.exports = function add(a, b){
  return a+b;
}

var add = require('./add');

CommonJS 포맷은 Node.jsμ—μ„œ μ‚¬μš©λ˜κ³  require와 module.exportsλ₯Ό μ‚¬μš©ν•΄μ„œ μ˜μ‘΄μ„±κ³Ό λͺ¨λ“ˆμ„ μ •μ˜ν•œλ‹€.

AMD, Asynchronous Module Definition

//Calling define with a dependency array and a factory function
define(['dep1', 'dep2'], function (dep1, dep2) {

  //Define the module value by returning a value.
  return function () {};
});

Commonjs νŒ¨ν„΄μ˜ λ¬Έμ œλŠ” λ™κΈ°μ‹μ΄λΌλŠ” 것, 이에 λΉ„λ™κΈ°μ‹μœΌλ‘œ λΆˆλŸ¬μ˜€μžλŠ” νŒ¨ν„΄μ΄λ‹€.

AMD 포맷은 λΈŒλΌμš°μ €μ—μ„œ μ‚¬μš©λ˜κ³  define ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ λͺ¨λ“ˆμ„ μ •μ˜ν•œλ‹€.

UMD

UMD 포맷은 λΈŒλΌμš°μ €μ™€ Node.jsμ—μ„œ λ‘˜ λ‹€ μ‚¬μš©λ  수 μžˆλ‹€.

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['b'], factory);
  } else if (typeof module === 'object' && module.exports) {
    // Node. Does not work with strict CommonJS, but
    // only CommonJS-like environments that support module.exports,
    // like Node.
    module.exports = factory(require('b'));
  } else {
    // Browser globals (root is window)
    root.returnExports = factory(root.b);
  }
}(this, function (b) {
  //use b in some fashion.

  // Just return a value to define the module export.
  // This example returns an object, but the module
  // can return a function as the exported value.
  return {};
}));


System.register

System.register 포맷은 ES5μ—μ„œ ES6 λͺ¨λ“ˆ 문법을 μ§€μ›ν•˜κΈ° μœ„ν•΄ λ””μžμΈλ˜μ—ˆλ‹€.

import { p as q } from './dep';

var s = 'local';

export function func() {  
  return q;
}

export class C {  
}


ES6 Module Formmat

ES6μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ‚΄μž₯된 λͺ¨λ“ˆ 포맷도 μ§€μ›ν•œλ‹€.

λͺ¨λ“ˆμ˜ 곡개 API둜 내보내기 μœ„ν•΄ export 토큰을 μ‚¬μš©ν•œλ‹€.

// lib.js

// Export default function
export default function sayHello(){  
  console.log('Hello');
}

// Export non-default function
export function sayGoodbye(){  
  console.log('Goodbye');
}

그리고 import 토큰은 λͺ¨λ“ˆμ΄ λ‚΄λ³΄λ‚΄λŠ” 뢀뢄을 κ°€μ Έμ˜¨λ‹€.

import sayHello, { sayGoodbye } from './lib';

sayHello();  
// => Hello

sayGoodbye();  
// => Goodbye


λͺ¨λ“ˆ λ‘œλ”

μ£Όμš” λͺ¨λ“ˆ 포맷으둜 μž‘μ„±λœ λͺ¨λ“ˆμ„ λŸ°νƒ€μž„ λ•Œ λ‘œλ“œν•˜κ³  ν•΄μ„ν•œλ‹€.

  1. λΈŒλΌμš°μ €μ—μ„œ λͺ¨λ“ˆ λ‘œλ”λ₯Ό λ‘œλ“œν•œλ‹€.
  2. λͺ¨λ“ˆ λ‘œλ”μ—κ²Œ μ–΄λ–€ 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŒŒμΌμ„ λ‘œλ“œν•  것인지 λ €μ€€λ‹€.
  3. λͺ¨λ“ˆ λ‘œλ”λŠ” 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜κ³  ν•΄μ„ν•œλ‹€.
  4. ν•„μš”ν•œ 경우 λͺ¨λ“ˆ λ‘œλ”κ°€ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•œλ‹€.

  • RequireJS : AMD 포맷 λͺ¨λ“ˆμ„ μœ„ν•œ λ‘œλ”
  • SystemJS : AMD, CommonJS, UMD λ˜λŠ” System.register 포맷 λͺ¨λ“ˆμ„ μœ„ν•œ λ‘œλ”


λͺ¨λ“ˆ λ²ˆλ“€λŸ¬

λͺ¨λ“ˆ λ²ˆλ“€λŸ¬λŠ” λͺ¨λ“ˆ λ‘œλ”λ₯Ό λŒ€μ²΄ν•œλ‹€.

λΉŒλ“œνƒ€μž„μ— μ‚¬μš©λ˜λŠ” 라이브러리둜 λͺ¨λ“  Module 을 μ˜μ‘΄μ„±μ— 맞게 μ „μ—­μŠ€νŽ˜μ΄μŠ€μ˜ μ˜€μ—Όμ΄ 없도둝 ν•˜λ‚˜μ˜ 파일둜 λ¬Άμ–΄μ£ΌλŠ” 라이브러리 λͺ¨λ“ˆ λ‘œλ”λ₯Ό λŒ€μ²΄ν•˜κ³  λΉŒλ“œ νƒ€μž„μ— λͺ¨λ“  μ½”λ“œμ˜ λ²ˆλ“€μ„ μƒμ„±ν•œλ‹€.

  1. λΉŒλ“œ νƒ€μž„μ— λ²ˆλ“€ νŒŒμΌμ„ μƒμ„±ν•˜κΈ° μœ„ν•΄ λͺ¨λ“ˆ λ²ˆλ“€λŸ¬λ₯Ό μ‹€ν–‰ν•œλ‹€. (예: bundle.js)
  2. λΈŒλΌμš°μ €μ—μ„œ λ²ˆλ“€ νŒŒμΌμ„ λ‘œλ“œν•œλ‹€.

  • Browserify : CommonJS λͺ¨λ“ˆμ„ μœ„ν•œ λ²ˆλ“€λŸ¬
  • Webpack : AMD, CommonJS, ES6 λͺ¨λ“ˆμ„ μœ„ν•œ λ²ˆλ“€λŸ¬


Webpack

μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ λ§Žμ•„μ§€λ©΄ ν•˜λ‚˜μ˜ 파일둜 κ΄€λ¦¬ν•˜λŠ”λ° ν•œκ³„κ°€ μžˆλ‹€. μ—¬λŸ¬κ°œ νŒŒμΌμ„ λΈŒλΌμš°μ Έμ—μ„œ λ‘œλ”©ν•˜λŠ” 것은 그만큼 λ„€νŠΈμ›Œν¬ λΉ„μš©μ„ μΉ˜λ€„μ•Όν•˜λŠ” 단점이 μžˆλ‹€.

뿐만 μ•„λ‹ˆλΌ 각 νŒŒμΌμ€ μ„œλ‘œμ˜ μŠ€μ½”ν”„λ₯Ό μΉ¨λ²”ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ”λ° 잘λͺ» μž‘μ„±ν•  경우 λ³€μˆ˜ 좩돌의 μœ„ν—˜μ„±λ„ μžˆλ‹€.

ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό μ‚¬μš©ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ¦‰μ‹œν˜ΈμΆœν•¨μˆ˜(IIFE) λ₯Ό μ‚¬μš©ν•΄ λͺ¨λ“ˆμ„ λ§Œλ“€ 수 μžˆλ‹€. CommonJSλ‚˜ AMD μŠ€νƒ€μΌμ˜ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ©΄ νŒŒμΌλ³„λ‘œ λͺ¨λ“ˆμ„ 관리할 μˆ˜λ„ μžˆλ‹€.

μ—¬μ „νžˆ λΈŒλΌμš°μ Έμ—μ„œλŠ” 파일 λ‹¨μœ„ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” 것은 쉽지 μ•Šμ€ 일이닀.

πŸ”₯ λͺ¨λ“ˆμ„ IIFE μŠ€νƒ€μΌλ‘œ λ³€κ²½ν•΄ μ£ΌλŠ” κ³Όμ • 뿐만 μ•„λ‹ˆλΌ ν•˜λ‚˜μ˜ 파일둜 λ¬Άμ–΄(bundled) λ„€νŠΈμ› λΉ„μš©μ„ μ΅œμ†Œν™” ν• μˆ˜ μžˆλŠ” 방법이 μ›Ή ν”„λ‘œνŠΈμ—”λ“œ 개발 κ³Όμ •μ—λŠ” ν•„μš”ν•˜λ‹€. πŸ”₯

Webpack의 μ£Όμš” 4가지

  1. μ—”νŠΈλ¦¬: μ‹œμž‘μ 
  2. 아웃풋: λ²ˆλ“€λœ κ²°κ³Όλ¬Ό μœ„μΉ˜
  3. λ‘œλ” : μ›ΉνŒ©μ€ 기본적으둜 jsλ₯Ό μœ„ν•΄μ„œ λ‚˜μ˜¨ λ²ˆλ“€λŸ¬μ˜€λ‹€. κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬κ°€μ§€ κΈ°λŠ₯을 넣을렀고 ν•΄μ„œ μƒκΈ΄κ²ƒμœΌλ‘œ λΉ„jsλ₯Ό 읽고 해석을 ν•˜λŠ”λ° ν•„μš”ν•œκ²ƒλ“€μ„ λ„£μ–΄μ£ΌλŠ” κ³³
  4. ν”ŒλŸ¬κ·ΈμΈ : λ²ˆλ“€μ΄ μ™„λ£Œκ°€ λ˜κ³ λ‚˜μ„œ μž‘μ—…ν•˜λŠ” 것듀은 λ„£μ–΄μ£ΌλŠ” κ³³(ex λ‚œλ…ν™”)


μ°Έκ³