Node.js 및 ES6의 module.exports 및 내보내기 기본값
Node module.exports
와 ES6의 차이점은 무엇입니까 export default
? export default
Node.js 6.2.2에서 시도 할 때 왜 "__ is a constructor"오류가 발생하는지 알아 내려고합니다 .
작동하는 것
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This works
module.exports = SlimShady
무엇을 하지 않습니다 작동
'use strict'
class SlimShady {
constructor(options) {
this._options = options
}
sayName() {
return 'My name is Slim Shady.'
}
}
// This will cause the "SlimShady is not a constructor" error
// if in another file I try `let marshall = new SlimShady()`
export default SlimShady
문제는
- 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
.
tl; dr 지금 작동 SlimShady
하려면 가져 오거나 가져 오는 파일을 Babel을 사용하여 컴파일해야합니다 'use strict'
.
내가 사용하고 babel-cli
내가 처음에이 오류가 발생 프로젝트에 6.18.0을.
없이 'use strict'
나쁜 소식 곰
var SlimShady = require('./slim-shady');
var marshall = new SlimShady(); // uh, oh...
'엄격한 사용'하십시오
'use strict'
import SlimShady from './slim-shady'
var marshall = new SlimShady() // all good in the hood
참고 : https://stackoverflow.com/questions/40294870/module-exports-vs-export-default-in-node-js-and-es6
'Programing' 카테고리의 다른 글
Django-render (), render_to_response ()와 direct_to_template ()의 차이점은 무엇입니까? (0) | 2020.04.16 |
---|---|
정렬 된 배열을 정렬되지 않은 배열보다 느리게 처리하는 이유는 무엇입니까? (0) | 2020.04.16 |
MVVM을 사용하여 WPF에서 대화 상자 처리 (0) | 2020.04.16 |
REST 웹 서비스를 사용하여 메타 데이터가있는 파일을 어떻게 업로드합니까? (0) | 2020.04.16 |
서브 프로세스에서 'shell = True'의 실제 의미 (0) | 2020.04.16 |