JavaScript Module System
JavaScript:Module/JavaScript:Import 항목과 동일.
JavaScript에 모듈 시스템(Module System)을 추가하기 위한 개발자들의 뻘짓 집합체
간단한 차이점
각각의 스팩별 사용 방법 및 차이점:
- CommonJS (CJS):
require
와module.exports
- Asynchronous module definition (AMD):
define
- Universal Module Definition (UMD): CommonJS 와 AMD 의 하이브리드. (지원 여부에 따라 조건문이 추가됨) - 스팩이라기 보단 디자인 패턴에 가깝다.
- ECMAScript Module (ESM):
import
와export
==
<script>
type module ==
script
태그에 type="module"
을 선언하면 자바스크립트 파일은 모듈로 동작합니다. 이때 모듈이라는 것을 명확히 알기 위해서 mjs
확장자를 사용하도록 권장합니다.
webpack을 사용한다면 Webpack#Modules 항목 참조.
모듈 정의하기 (export)
ES6
// 모듈 전체를 export, 파일내 한번만 사용가능하다.
var module = {};
export default module
// 모든 속성을 export
export *;
// 함수를 직접 export
export function moduleFunc() {};
var property = "some property";
export {property};
CommonJS
// 모듈 전체를 export
module.exports = module
// 모든 속성을 export
// (아시는 분 알려주세요)
// 함수를 직접 export
exports.moduleFunc = function() {}
모듈 가져오기 (import)
구문:
import defaultExport from "module-name";
import * as name from "module-name";
import { export1 } from "module-name";
import { export1 as alias1 } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export1 [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
var promise = import("module-name");
ES6
// 모듈 전체를 import
import module
import module as myModule
// 모든 속성 import
import * from module
// 특정 멤버(함수 등)만 import
import {moduleFunc, moduleFunc2} from module
CommonJS
// 모듈 전체를 import
var module = require('./someModule.js')
// 모든 속성 import
// (위의 module 객체에 모든 속성이 담아져 온다.)
// 특정 멤버(함수 등)만 import, 위의 module을 이용한다.
module.moduleFunc
UMD
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['exports', 'b'], factory);
} else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
// CommonJS
factory(exports, require('b'));
} else {
// Browser globals
factory((root.commonJsStrict = {}), root.b);
}
}(this, function (exports, b) {
//use b in some fashion.
// attach properties to the exports object to define
// the exported module properties.
exports.action = function () {};
}));
See also
Favorite site
- MDN - JavaScript modules
- Webpack(웹팩) Import vs Require 차이점은 무엇일까?
- (javascript) require vs import (CommonJs와 ES6) 1
- Webpack - Documentation - Modules
- Javascript의 Module System
- JavaScript Module System
References
-
Javascript_-require_vs_import-CommonJS_and_ES6-_bono_blog.pdf ↩