2016-04-05 5 views
7

Я сталкиваюсь с поведением, которое я не могу объяснить. В зависимости от использования import или require, этот тест успешно выполнен (import) или не выполнен (require).Как «require» работает иначе, чем «import» es6?

В случае не получится, у меня есть следующее сообщение об ошибке:

PhantomJS 2.1.1 (Windows 7 0.0.0) immutability a number is immutable FAILED undefined is not a constructor (evaluating 'expect((0, _immutable.List)([1])).toEqualImmutable((0, _immutable.List)([1]))')

Вот код:

import { Map, List } from 'immutable'; 
const expect = require("expect"); 
// import expectImmutable from "expect-immutable"; 
const expectImmutable = require("expect-immutable"); 

expect.extend(expectImmutable); 

describe("immutability",() => { 
    describe("a number",() => { 
     function increment(currentState) { 
      return currentState + 1; 
     } 
     it("is immutable",() => { 
      expect(List([1])).toEqualImmutable(List([1])); 
      expect(Map({ a: 1 })).toEqualImmutable(Map({ a: 1 })); 
      let state = 42; 
      let nextState = increment(state); 

      expect(List([nextState])).toEqualImmutable(List([43])); 
      expect(List([state])).toEqualImmutable(List([42])); 
     }); 
    }); 
}); 

Кто-нибудь есть объяснение того, что происходит за кулисами?

+3

Как только вы transpiling это так или иначе - почему бы вам не проверить разницу между кодом с 'require' и transpiled' import' (который будет 'require' а)? – zerkms

+2

вы, вероятно, ищете свойство по умолчанию для требуемого объекта, попробуйте 'require (" expect "). Default' и' require ("expect-immutable"). Default' – maioman

ответ

1

Благодаря @zerkms и @maioman ваши советы действительно помогли. Вы были правы @maioman, это было связано с синтаксисом экспорта, используемым библиотекой.

ES6:

export default foo; 

требует:

module.exports = foo; 

Поэтому, когда нужно было требовать ES6 написано экспорта, мы должны обращаться с ключевым словом по умолчанию.

require("foo").default; 
Смежные вопросы