module.js
// 해당 부분은 여러 소스코드에서 여러번 불러와도 한번만 출력됩니다.
console.log('foo')
require 키워드를 사용하여 모듈을 내보하며 module.exports 혹은 exports 키워드를 사용하여 모듈을 불러옵니다.module.exports 혹은 exports 키워드를 사용하여 모듈을 내보냅니다.require 키워드를 사용하여 지정된 모듈을 불러오며, 이는 로드한 모듈에서 내보내기된 리소스들을 object 형식으로 반환합니다.exports: module.exports 의 숏컷 버전으로 사용하며, 실질적으로 module.exports를 가리킵니다.exports -> module.exports -> {}
exports 와 moduel.exports 를 출력해보면 빈 object가 출력됩니다.console.log(module.exports)
console.log(exports)
// 출력결과
{}
{}
exports 는 module.exports 를 call by reference로 참조합니다.exports의 값을 수정하면, module.exports 의 값이 변하게 되지만, module.exports 의 값을 수정해도 exports 의 값은 변하지 않습니다.let foo = 'foo';
module.exports = { 'foo': foo };
console.log(module.exports)
console.log(exports)
// 출력 결과
{ foo: 'foo' }
{}
let foo = 'foo';
exports.foo = foo;
console.log(module.exports)
console.log(exports)
// 출력 결과
{ foo: 'foo' }
{ foo: 'foo' }
module.exports 입니다.module.js
let foo = 'foo';
module.exports = { bar: 'bar' }
exports.foo = foo;
main.js
const m = require('./module');
console.log(m);
// 출력 결과
{ bar: 'bar' }
주의할 점으로 exports 를 직접 수정하면 exports 가 가리키는 module.exports가 수정되기 때문에 직접 수정하지 않습니다다.
따라서 다음의 상황에 따라 둘의 사용을 구분해서 사용한다
여러개의 객체를 각각 내보내는 경우
exports를 사용한다.하나의 객체를 내보내는 경우
module.exports를 사용한다.
require 를 통해 반환된다고 했습니다.module.js
let foo = 'foo';
exports.foo = foo;
console.log(`module.exports in module.js: ${JSON.stringify(module.exports)}`);
console.log(`exports in module.js: ${JSON.stringify(exports)}`);
setTimeout(() => {
console.log(`foo in module.js: ${foo}`);
}, 1000);
main.js
const m = require('./module');
console.log(`before change: ${JSON.stringify(m)}`);
m.foo = 'testing';
console.log(`after change: ${JSON.stringify(m)}`);
module.js 에서 내보내기 합니다.main.js 에서 모듈을 평가하고 변수를 변경하는 시간을 기다리고 나서 출력하기 위함입니다.main.js 에서는 모듈을 로드하고 불러오기한 변수를 수정합니다.
export 와 module.exports에는 foo 라는 이름으로 지정된 변수 foo가 내보내기로 지정됩니다.main.js 에서 foo 변수를 변경하면 main.js 에서는 변경된 값이 출력되지만, 원본 모듈에서는 변경되기 이전의 값이 출력되는 것을 볼 수 있습니다.exports 키워드를 사용하여 내보내고, import 키워드를 사용하여 불러오기를 하는 모듈 시스템입니다.commonjs 에서는 module.exports 라는 객체에 내보내기할 리소스를 할당하는 방법을 사용했지만, ES6 에서는 해당 키워드로 내보내기할 리소스를 지정합니다.export const foo = "foo";
import 키워드를 사용하여 불러오며, 내보내기된 리소스 중 사용할 리소스만 선택하여 불러옵니다.import { foo } from './module.js'
export 키워드를 붙입니다.export const foo = "foo";
export const bar = () => "bar";
const foo = "foo";
const bar = () => "bar";
export { foo, bar };
import 키워드를 사용하여 불러올 리소스만 불러오기 할 수 있습니다.import { bar, foo } from './module.js';
console.log(foo);
console.log(bar());
// 출력 결과
foo
bar
* 을 사용하며 해당 모듈에 이름을 지정하여 불러옵니다.import * as t from './module.js';
console.log(t.foo);
console.log(t.bar());
// 출력 결과
foo
bar
default 키워드를 사용하며, 하나의 리소스를 반환하고자 하는 경우 사용합니다.export default function () {
return "foo";
};
import foo from './module.js';
console.log(foo());
// 출력 결과
foo
export default {
foo: () => "foo",
bar: () => "bar",
}
import baz from './module.js';
console.log(baz.foo());
console.log(baz.bar());
// 출력 결과
foo
bar
let foo = "foo";
export default foo;
import bar from './module.js'
console.log(bar);
// 출력 결과
foo
let foo = "foo";
let bar = () => "bar";
export {
foo,
bar
}
export default "baz";
import testing, { bar, foo } from './module.js'
console.log(foo);
console.log(bar());
console.log(testing);
// 출력 결과
foo
bar
baz
* 을 사용하며, 이름을 지정하여 object 형식으로 불러옵니다.default 키워드로 접근합니다.import * as t from './module.js'
console.log(t.foo);
console.log(t.bar());
console.log(t.default);