[javascript] Babel 6.x에서 기본 내보내기 값을 require () 할 수 없습니다.

Babel 5.x에서는 다음 코드를 작성할 수 있습니다.

app.js

export default function (){}

index.js

require('babel/register');
require('./app')();

그러면 node index.js오류없이 실행할 수 있습니다. 그러나 Babel 6.x를 사용하여 다음 코드를 실행하십시오.

index.es6.js

require('babel-core/register');
require('./app')();

오류가 발생합니다

require (…)는 함수가 아닙니다.

이유를 알고 싶어요?



답변

TL; DR

당신은 사용해야합니다

require('./app').default();

설명

Babel 5에는 다음과 같은 호환성 해킹이 export default있었습니다. 모듈에 내보내기가 하나만 포함되어 있고 기본 내보내기 인 경우 module.exports. 예를 들어 모듈 app.js는

export default function () {}

이것으로 변환됩니다

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = function () {};

module.exports = exports["default"];

이것은 순전히require -ing Babel-transpiled 모듈 과의 호환성을 위해 수행 되었습니다 . 또한 일관성이 없었습니다. 모듈에 명명 된 내보내기와 기본 내보내기가 모두 포함 된 경우 require-d가 될 수 없습니다 .

현실에서 ES6 모듈 사양에 따라, 기본 수출은 없다 어떤 다른 이름으로 명명 된 수출보다가 default. 컴파일 타임에 정적으로 해석 될 수있는 구문 적 설탕입니다.

import something from './app';

이것과 같다

import { default as something } from './app';

즉, Babel 6은 모듈을 변환 할 때 상호 운용성 해킹을 중단하기로 결정한 것으로 보입니다. 이제 모듈 app.js 가 다음과 같이 변환됩니다.

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {};

보시다시피 더 이상 module.exports. 에 require이 모듈, 당신은 할 필요가

require('./app').default();


답변

위의 정답으로 후속 조치를 취하십시오.

기본 내보내기 동작을 사용하려면 babel-plugin-add-module-exports 플러그인을 사용 babel@5해보세요 .

저에게 꽤 잘 작동합니다.


답변

이것이 작동하지 않는다면

require('./app').default()

사용하다

require('./app').default

마지막에 함수 호출없이.


답변