문제는
- CommonJS에서 ES6 모듈을 에뮬레이트하는 방법
- 모듈을 가져 오는 방법
ES6에서 CommonJS로
이 문서를 작성할 당시에는 기본적으로 ES6 모듈을 지원하는 환경이 없습니다. Node.js에서 사용할 때는 Babel과 같은 것을 사용하여 모듈을 CommonJS로 변환해야합니다. 그러나 정확히 어떻게 발생합니까?
많은 사람들이 생각 module.exports = ...
하는 것과 수 export default ...
와 exports.foo ...
동등 할 export const foo = ...
. 그러나 그것은 사실이 아니거나 적어도 바벨이 그렇게하는 방식은 아닙니다.
ES6의 default
수출은 실제로도있다 라는 것을 제외하고, 수출 default
은 "예약 된"이름이고 그것을 위해 특수 구문 지원이있다. Babel이 이름이 지정된 내보내기와 기본 내보내기를 컴파일하는 방법을 살펴 보겠습니다.
// input
export const foo = 42;
export default 21;
// output
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;
여기에서 기본 내보내기가 exports
객체 의 속성이되는 것처럼 볼 수 foo
있습니다.
모듈 가져 오기
CommonJS를 사용하거나 ES6 import
구문을 사용하여 두 가지 방법으로 모듈을 가져올 수 있습니다 .
당신의 문제 : 나는 당신이 다음과 같은 일을하고 있다고 생각합니다 :
var bar = require('./input');
new bar();
그 기대하는 것은 bar
기본 수출의 값이 할당됩니다. 그러나 위의 예에서 볼 수 있듯이 기본 내보내기는 default
속성에 할당됩니다 !
따라서 기본 내보내기에 액세스하려면 실제로해야합니다.
var bar = require('./input').default;
ES6 모듈 구문을 사용하면
import bar from './input';
console.log(bar);
바벨은 그것을
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
에 대한 모든 액세스가 access로 bar
변환 되었음을 알 수 있습니다 .default
.