[Webpack] module

κ³ λ³‘ν‘œΒ·2022λ…„ 2μ›” 28일
0

Webpack

λͺ©λ‘ 보기
1/5
post-thumbnail

πŸ’‘ μ›ΉνŒ©μ€ λͺ¨λ“ˆ λ²ˆλ“€λŸ¬ 이닀!
μ›ΉνŒ©μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ μ΄ν•΄ν•˜κ³  λ„˜μ–΄κ°€μ•Όν•  것이 λ°”λ‘œ "λͺ¨λ“ˆ" μž…λ‹ˆλ‹€. πŸ˜‰

λͺ¨λ“ˆ

λͺ¨λ“ˆ(module)


A module is one of the separate parts.

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ λͺ¨λ“ˆμ΄λž€ κΈ°λŠ₯이 κ΅¬ν˜„λœ "μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ³„ 파일"이라고 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.
  • 잘 λ§Œλ“  λͺ¨λ“ˆνŒ¨ν„΄μ€ ν•˜λ‚˜μ˜ 파일이 ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ΄ 되며, ν•˜λ‚˜μ˜ νŒŒμΌμ€ ν•˜λ‚˜μ˜ scope이 λ˜λ„λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·Έλž˜μ•Ό 파일 λ‚΄μ—μ„œ λ³€μˆ˜λ„ 자유둭게 μ„ μ–Έν•  수 있고, κ΄€λ ¨ κΈ°λŠ₯만 ν•˜λ‚˜μ˜ νŒŒμΌμ— κ΅¬ν˜„ν•΄μ„œ λ‹€λ₯Έ 파일의 λ°©ν•΄λ₯Ό 받지 μ•Šμ„ 수 있게 λ©λ‹ˆλ‹€!
  • 바닐라 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ λͺ¨λ“ˆνŒ¨ν„΄μ€ scope κ°œλ…μ„ ν™œμš©ν•΄μ„œ 직접 κ΅¬ν˜„ν•΄μ•Ό ν•˜λ©°, λ‹€λ₯Έ 도움 μ—†μ΄λŠ” λͺ¨λ“ˆν™” μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μ—†μŠ΅λ‹ˆλ‹€. commonJS, AMD, ES2015 등을 ν†΅ν•΄μ„œ λͺ¨λ“ˆν™” μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘ νŠΈμ•€λ“œμ—μ„œ λͺ¨λ“ˆν™”λŠ” μ•„μ£Ό μ˜ˆμ „λΆ€ν„° 있던 κ°œλ…μ΄λ©°, reactκ°€ μ—†λ˜ μ‹œμ ˆμ—λ„ λͺ¨λ“ˆν™”λ₯Ό μ‚¬μš©ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ •μ˜


  • ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” λ‹¨μœ„
  • μžμ‹ λ§Œμ˜ 독립적인 μ‹€ν–‰ μ˜μ—­
  • 보톡 파일 λ‹¨μœ„λ‘œ λ‚˜λ‰¨

λͺ¨λ“ˆνŒ¨ν„΄κ³Ό ν•„μš”μ„±


  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ†ŒμŠ€λ₯Ό λͺ¨λ“ˆ λ‹¨μœ„λ‘œ κ΄€λ¦¬ν•˜κ±°λ‚˜ 라이브러리 등을 λ§Œλ“€ λ•Œ μ‚¬μš©
  • μ „μ—­ λ³€μˆ˜μ˜ μ‚¬μš©μ„ μ΅œμ†Œν™” ν•˜κΈ° μœ„ν•¨
  • λ³€μˆ˜ scope을 μ§€μ •ν•΄μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•¨
  • Reusablility, Isolation, Organization
  • λͺ¨λ“ˆ λ‹¨μœ„λ‘œ μ†ŒμŠ€λ₯Ό κ°œλ°œν•˜λ©΄ 각 λͺ¨λ“ˆ κ°„μ˜ μ˜μ‘΄μ„±μ„ μ΅œμ†Œν™”ν•˜κ±°λ‚˜ μ˜μ‘΄μ„± νŒŒμ•…ν•˜κΈ° 쉬움

λͺ¨λ“ˆ κ΅¬ν˜„

μ˜›λ‚  이야기


  • μ™œ ν•„μš”ν–ˆλ‚˜? λ„€μž„μŠ€νŽ˜μ΄μŠ€ 생성을 μœ„ν•΄ λͺ¨λ“ˆνŒ¨ν„΄μ„ μ‚¬μš©ν•¨.
  • 라이브러리(CRA) 없이 λͺ¨λ“ˆ νŒ¨ν„΄ κ΅¬ν˜„ν•  λ•ŒλŠ” μ–΄λ–»κ²Œ ν–ˆλ‚˜?
    // μ΄λ ‡κ²Œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
    (function () {
    	// scopeκ°€ λ§‰ν˜€μžˆκΈ° λ•Œλ¬Έμ— μ „μ—­λ³€μˆ˜κ°€ μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      // μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜λŠ” 보톡 일회용 μ½”λ“œ
    })();
    
    // λͺ¨λ“ˆ 또 ν•˜λ‚˜
    (function () {
    	window.myLibrary = /* */;
    }());
    
    // λͺ¨λ“ˆ 또 ν•˜λ‚˜
    (function () {
    	var math = {
    		add: function () {}
    	}
    
    	window.math = math;
    }());
  • Kakao λ‘œκ·ΈμΈν•  λ•Œ Kakaoκ°€ ν•˜λ‚˜μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€λΌκ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ νŠΉμ • νšŒμ‚¬μ˜ μ™ΈλΆ€ λͺ¨λ“ˆμ˜ μš©λ„λ₯Ό λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„ν•˜κ³ μž λͺ¨λ“ˆ νŒ¨ν„΄μ„ ν™•μž₯ν•˜μ—¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ ν™œμš©ν•©λ‹ˆλ‹€.
    //kakao μ½”λ“œ 초반
    (function (f) {
      if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") {
        module.exports = f();
      } else if (typeof define === "function" && define.amd) {
        define([], f);
      } else {
        var g;
    
    		if (typeof window !== "undefined") {
          g = window;
        } else if (typeof global !== "undefined") {
          g = global;
        } else if (typeof self !== "undefined") {
          g = self;
        } else {
          g = this;
        }
    
    		g.Kakao = f();
      }
    })(function() { return /* λ‚΄λΆ€ μ½”λ“œ */ })

λͺ¨λ“ˆμ‹œμŠ€ν…œ, 라이브러리

λͺ¨λ“ˆ κΈ°λŠ₯ ν‘œμ€€ν™”


ES Module

  • μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ΄μš©ν•˜λŠ” μ›ΉνŽ˜μ΄μ§€μ˜ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κΈ° μ‹œμž‘ν•˜λ©΄μ„œ 효율적인 μ†ŒμŠ€ 관리가 ν•„μš”ν•΄μ Έμ„œ μ΄μ œλŠ” λͺ¨λ“ˆμ„ μ •μ˜ν•˜λŠ” 것 λ˜ν•œ ν‘œμ€€μœΌλ‘œ μ •μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    <!-- IEλŠ” 아직 지원 μ•ˆ 됨. μ‚¬μš©ν•˜λ €λ©΄ type 속성 μΆ”κ°€ -->
    <script type="module" src="index.js" />
    // index.js
    import fn, { name } from './module';
    
    console.log(name);
    console.log(fn());
    // module.js
    export const name = 'λͺ¨λ“ˆ';
    
    export default function() {
      console.log('읡λͺ…ν•¨μˆ˜')
    }
  • 아직 IE지원이 μ•ˆλ˜λ―€λ‘œ, λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ €λ©΄ babel, webpack이 ν•„μš”ν•˜λ‹€.
    • babel은 ES6 β†’ λΈŒλΌμš°μ €μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λͺ¨λ“ˆμ„ commonjs둜 λ°”κΏ”μ£Όκ³ ,
    • webpack은 λͺ¨λ“ˆκ°„μ˜ μ˜μ‘΄μ„±μ„ νŒŒμ•…ν•˜μ—¬ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό bundle(합쳐) ν•΄μ€€λ‹€.

CommonJS

// routes.js

const routes = { name: "/main" };

module.exports = routes;
// index.js

const routes = require("./routes");

console.log(routes);  // { name: '/main' }

0개의 λŒ“κΈ€