"require"与"import"在ES6中的操作方式有何不同?

7
我遇到了一个无法解释的行为。 使用import或者require,这个测试可以成功(import),也可能失败(require)。
如果失败了,我会看到以下错误信息:

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
既然你已经在转译代码了,为什么不检查一下使用 require 和转译后的 import(也将是 require)之间的区别呢? - zerkms
2
你可能正在寻找所需对象中的默认属性,请尝试使用 require("expect").defaultrequire("expect-immutable").default - maioman
1个回答

1

感谢 @zerkms 和 @maioman 的建议,真的很有帮助。 @maioman,你是对的,这是由于库使用的导出语法造成的。

es6:

export default foo;

要求:

module.exports = foo;

因此,当需要使用es6编写的导出时,我们应该处理默认关键字。
require("foo").default;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接