- javascript module loader
< 모듈 포맷 > 
* AMD (Asynchronous Module Definition) 
    -  브라우저에서 사용되고 define 함수를 사용해서 모듈을 정의 
    - Require.JS 에 의해서 구현됨
requirejs/requirejs
https://github.com/requirejs/requirejs -12,268
- v2.3.6 , 2018/08
    - 예제) 
https://objectcomputing.com/resources/publications/sett/august-2015-modularizing-javascript-with-requirejs 
// s1.js 
    define(function() { 
        console.log("s1"); 
        return { text: 'test' }; 
    }); 
// s2.js: 
    require(['s1'], function(s1) { 
        console.log("s2"); 
        document.body.appendChild(document.createTextNode(s1.text)); 
    }); 
// index.html:     
<script data-main="s2.js" src="require.js"></script>
//============================= 
* CommonJS  
    - Node.js에서 사용되고 require와 module.exports를 사용해서 의존성과 모듈을 정의한다.  
// double-number.js 
module.exports = function(number) { 
  return number * 2; 
} 
//index.js 
var doubleNumber = require("./double-number"); 
console.log(doubleNumber(4)); // 8 
//============================= 
* UMD (Universal Module Definition) 
    - 브라우저와 Node.js에서 둘 다 사용 
https://github.com/umdjs/umd - 6,076 
//mod1.js 
(function (root, factory) { 
    if (typeof module === 'object' && module.exports) { 
        // Node/CommonJS 
        module.exports = factory(); 
        console.log('mod1-1'); 
    } else if (typeof define === 'function' && define.amd) { 
        // AMD. Register as an anonymous module. 
        define(factory); 
        console.log('mod1-2'); 
    } else { 
        // Browser globals 
        root.mod1 = factory(); 
        console.log('mod1-3'); 
    } 
}(this, function factory() { 
    console.log('mod1-4'); 
    // public API 
    return { 
        foo: 'bar' 
    }; 
})); 
//index.htm
<script src="mod1.js"></script>
    
    <script>
        (function (root, factory) {
            if (typeof module === 'object' && module.exports) {
                // Node/CommonJS
                factory(
                    require('./mod1.js')
                );
                console.log(1);
            } else if (typeof define === 'function' && define.amd) {
                // AMD
                define([
                    './mod1.js'
                ], factory);
                console.log(2);
            } else {
                // Browser globals
                factory(root.mod1);
                console.log(3, root.mod1);
            }
        }(this, function factory(mod1) {
            // Tests here
            console.log(4, mod1);
        }));
    </script>
//============================ 
* ES6 (ECMAScript 2015) 모듈
- 자바스크립트 표준 모듈
- 2017년 부터는 모든 브라우저에서 지원하기 시작
//lib.js 
export const pi = Math.PI; 
//app.js 
import * as lib from './lib.js'; 
console.log(lib.pi);         // 3.141592653589793 
// *.htm
<script type="module" src="app.js"></script>
//============================= 
* System.register 
    - SystemJS의 모듈 포맷 
https://github.com/systemjs/systemjs/blob/master/docs/system-register.md 
//=============================================================== 
//=============================================================== 
< 모듈 로더 (Module Loader) > 
    - 런타임에 실행 
https://trends.google.com/trends/explore?cat=31&date=today%205-y&q=RequireJS,SystemJS 
//============================= 
* RequireJS 
    - AMD 포맷 모듈을 위한 로더 
https://requirejs.org/ 
https://github.com/requirejs/requirejs - 12.260 
    - v2.3.6 , 2018/08 
//============================= 
* SystemJS 
    -  AMD, CommonJS, UMD 또는 System.register 포맷 모듈을 위한 로더 
https://github.com/systemjs/systemjs - 9,732 
    - v4.1.0 , 2019/07 
    - System.register 
        - SystemJS의 모듈 포맷 
https://github.com/systemjs/systemjs/blob/master/docs/system-register.md 
//=============== 
* System.register 모듈 포맷 로드
<script src="system.js"></script>
<script>
  System.import('/js/main.js'); // main.js = System.register 모듈 포맷 로드
</script>
//=========== 
* ES 모듈로드 
    -  브라우저에서 지원하지 않는다면 Babel 플러그인 필요 
https://github.com/systemjs/systemjs-transform-babel
<script src="system.js"></script>
<script src="extras/transform.js"></script>
<script src="plugin-babel/dist/babel-transform.js"></script>
<script>
  // main and all its dependencies will now run through transform before loading
  System.import('/js/main.js');
</script>
//================================================= 
// 참고 
RequireJS - AMD의 이해와 개발 
https://d2.naver.com/helloworld/591319 
AMD, CommonJS, UMD 모듈 
https://www.zerocho.com/category/JavaScript/post/5b67e7847bbbd3001b43fd73 
https://medium.com/computed-comparisons/commonjs-vs-amd-vs-requirejs-vs-es6-modules-2e814b114a0b 
자바스크립트 모듈, 모듈 포맷, 모듈 로더와 모듈 번들러에 대한 10분 입문서 
https://github.com/codepink/codepink.github.com/wiki/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AA%A8%EB%93%88,-%EB%AA%A8%EB%93%88-%ED%8F%AC%EB%A7%B7,-%EB%AA%A8%EB%93%88-%EB%A1%9C%EB%8D%94%EC%99%80-%EB%AA%A8%EB%93%88-%EB%B2%88%EB%93%A4%EB%9F%AC%EC%97%90-%EB%8C%80%ED%95%9C-10%EB%B6%84-%EC%9E%85%EB%AC%B8%EC%84%9C 
'Code > JavaScript' 카테고리의 다른 글
| [Javascript] gulp 사용법 - js 파일 줄이기 (0) | 2019.10.06 | 
|---|---|
| [Javascript] ES6 다이나믹 모듈 (Dynamic Module) (0) | 2019.07.30 | 
| [Javascript] ES6 (ES2015) 자바스크립트 모듈 사용법 (0) | 2019.07.28 | 
| [Javascript] Babel 사용법 (0) | 2019.07.28 | 
| [Javascript] Browserify 사용법 (0) | 2019.07.28 | 










