Babel 6은 기본값을 내보내는 방법을 변경합니다


195

전에, babel은 줄을 추가 할 것 module.exports = exports["default"]입니다. 더 이상이 작업을 수행하지 않습니다. 이것이 의미하는 것은 내가 할 수 있기 전에입니다.

var foo = require('./foo');
// use foo

이제이 작업을 수행해야합니다.

var foo = require('./foo').default;
// use foo

큰 문제는 아닙니다. 문제는 작동하는 방식에 따라 많은 코드가 있다는 것입니다 (대부분의 코드를 ES6 가져 오기로 변환 할 수는 있지만 전부는 아닙니다). 누구나 내 프로젝트를 거치지 않고 이전 방식으로 작업하는 방법에 대한 팁을 줄 수 있습니까 (또는 코드 모드를 작성하는 방법에 대한 지침조차도 매우 매끄 럽습니다).

감사!

예:

입력:

const foo = {}
export default foo

Babel 5를 사용한 출력

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var foo = {};
exports["default"] = foo;
module.exports = exports["default"];

Babel 6 및 es2015 플러그인을 사용한 출력 :

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var foo = {};
exports["default"] = foo;

출력의 유일한 차이점은 module.exports = exports["default"]입니다.


편집하다

: 당신은 내 특정 문제를 해결 한 후 쓴이 블로그 게시물에 관심이있을 수 있는 솔루션 바벨, 눈물을 업그레이드 오해 ES6 모듈, 및


궁금 require합니다 .Babel을 사용하는 코드베이스에서 작업 하는 경우 필요한 경우는 무엇입니까? 어쨌든 피할 수있는 다른 접근법이있을 수 있습니다.
loganfsmyth

죽은 코드에서 코드가 발견되면 코드가 필요하지 않은 Webpack의 기능을 활용하고 있습니다 if (false) { require('./foo') }.webpack foo.js을 사용하면 결과 번들에 실제로 포함 되지 않습니다 .
kentcdodds

무엇은되고 끝 false이 토글? 웹팩 구성에서 사용 가능한 조건 인 경우 다른 옵션이있을 수 있습니다.
loganfsmyth

이것도 저를 물었습니다. 감사합니다 @kentcdodds.
Tyler McGinnis

1
이 게시물을 찾기 전에 몇 시간 동안 문제가 발생했습니다. 나는 내 모든 것을로 교체 export default {foo, bar}했습니다 module.exports = {foo, bar}. 나는 현재 지원되지 않는 잘못된 방법을 좋아했습니다 .
stumct

답변:


90

이 플러그인 을 사용 하여 이전 export동작을 되돌릴 수도 있습니다.


1
나는 누군가가 조만간 플러그인을 작성할 것이라는 것을 알고 있었다. 감사!
kentcdodds

안타깝게도 babel-plugin-add-module-exports는 amd 스타일 모듈을 지원하지 않습니다 (아직)
zowers

3
저는 babel-plugin-transform-es2015-modules-simple-amd 를 사용하여 AMD 모듈이있는 프로젝트에서 이와 동일한 문제를 해결했습니다
Tom Wayson

UMD를 사용한다고 생각하면이 플러그인이 갈 길입니다! 감사합니다
electronix384128

매우 도움이됩니다.
Jovica Aleksic

105

CommonJS 내보내기 동작을 원하면 CommonJS를 직접 사용해야합니다 (또는 다른 답변에서 플러그인을 사용해야 함). 이 행동은 혼란을 야기하고 일부 사람들이 의존했던 잘못된 ES6 시맨틱 스로 이어지기 때문에 제거되었습니다.

export default {
  a: 'foo'
};

그리고

import {a} from './foo';

이는 유효하지 않은 ES6이지만 설명하는 CommonJS 상호 운용성 동작으로 인해 작동했습니다. 불행히도 두 경우를 모두 지원하는 것은 불가능하며 사람들이 잘못된 ES6를 작성하도록 허용하는 것은 당신을 만드는 것보다 더 나쁜 문제 .default입니다.

다른 문제는 사용자가 나중에 명명 된 내보내기를 추가 할 경우 예상치 못한 결과라는 것입니다.

export default 4;

그때

require('./mod');
// 4

그러나

export default 4;
export var foo = 5;

그때

require('./mod')
// {'default': 4, foo: 5}

이전 행동이 잘못되었다는 것에 동의합니다 (그러나 언급했습니다). 그러나 내 질문은 문제를 해결하는 방법이었습니다. 나는 잘못된 행동에 크게 의존하고 있었다 (오늘 아침까지 그것이 잘못되었다는 것을 몰랐다). 나는 ... 모두 한 번에 업데이트 모든 것을하지하는 것을 선호
kentcdodds

현재 동작을 얻는 유일한 수정 방법은 CommonJS를 직접 사용하도록 코드를 전환하거나 업데이트 할 때까지 Babel 5를 유지하는 것입니다.
loganfsmyth

4
@kentcdodds 웹 패키지 로더를 작성 하여이 작업 (또는 babel 플러그인)을 유지할 수 있습니다. 나는 그들이 하나를 제공하지 않는 놀랐어요 (또는 더 많이 변화를 홍보!)
Jamund 퍼거슨

내가 할 경우 내가 ...이 혼란스러워하고 export default function () {}다음 모듈 A와 import a from 'a'모듈 B에서 바벨 6, a{ default: function () {} }... 난에서 이해할 수있는 건 exploringjs.com/es6/... 이 작동합니다 내가 보낸 가야 객체가 아닌 B의 함수.
mamapitufo

@mamapitufo 그것은 효과가있을 것입니다. 그러나 예를 보지 않고 무엇이 잘못되었는지 말하기는 어렵습니다. 채팅을하려면 슬랙에서 바벨의 지원 채널을 이용하십시오.
loganfsmyth

33

라이브러리 작성자의 경우이 문제를 해결할 수 있습니다.

나는 일반적으로 index.js의 메인 필드에서 가리키는 파일 인 진입 점을 가지고 있습니다 package.json. lib의 실제 진입 점을 다시 내보내는 것 외에는 아무것도하지 않습니다.

export { default } from "./components/MyComponent";

babel 문제를 해결하기 위해 이것을 import명령문으로 변경 한 다음 기본값을 다음과 같이 지정했습니다 module.exports.

import MyComponent from "./components/MyComponent";
module.exports = MyComponent;

다른 모든 파일은 해결 방법없이 순수한 ES6 모듈로 유지됩니다. 따라서 진입 점 만 약간 변경해야합니다. :)

babel이 리버스 interop (commonjs-> es6)을 삭제하지 않은 것 같으므로 commonjs 요구 사항 및 ES6 가져 오기에서도 작동합니다. Babel은 commonjs를 패치하기 위해 다음 함수를 주입합니다.

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 

나는 이것을 싸우는 데 몇 시간을 보냈으므로 다른 누군가의 노력을 구할 수 있기를 바랍니다!


어떤 이유로, 나는 내 머리에 대한 권리 spinned 없었어 module.exportsexport default물건. 이제 우리는 다시 정사각형으로 돌아왔습니까?
windmaomao

@windmaomao 무슨 뜻인가요? 이것은 commonjs 사용자가 할 필요가 없도록 속임수 require("whatever").default입니다. 당신이 도서관 저자가 아니라면, 이것은 아마도 관련이 없습니다
WickyNilliams

1

나는 그런 종류의 문제를 겪었다. 그리고 이것은 내 해결책입니다.

//src/arithmetic.js

export var operations = {
  add: function (a, b) {
      return a + b;
  },

  subtract: function (a, b) {
      return a - b;
  }
};

//src/main.js

import { operations }  from './arithmetic';

let result = operations.add(1, 1);

console.log(result);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.