[node.js] Node.js 및 ES6의 module.exports 및 내보내기 기본값

Node module.exports와 ES6의 차이점은 무엇입니까 export default? export defaultNode.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.


답변

내보내기 기본값과 내보내기 const foo를 사용하려면 프로젝트에서 babel을 올바르게 구성해야합니다.

npm install --save-dev @babel/plugin-proposal-export-default-from

그런 다음 .babelrc에 아래 구성을 추가하십시오.

"plugins": [
       "@babel/plugin-proposal-export-default-from"
      ]


답변

Felix Kling은 nodejs에서 module.exports를 사용하여 이름 지정된 내보내기와 함께 내보내기 기본값을 수행하는 방법을 궁금해하는 사람들을 위해 두 가지를 크게 비교했습니다.

module.exports = new DAO()
module.exports.initDAO = initDAO // append other functions a named export

// now you have
let DAO = require('_/helpers/DAO');
// DAO by default is exported class or function
DAO.initDAO()


답변

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


답변