要求和导入显示不同的行为。为什么会这样?

时间:2016-12-31 06:55:33

标签: javascript node.js ecmascript-6

我正在使用requireimport,但两者都有不同的行为。到目前为止,我假设requireimport只是ES5而不是ES6。我正在做以下事情:

abc.js

console.log("abc");

xyz.js

console.log("xyz");

hello.js

require("./abc");
import "./xyz";

第二次更改文件并交换了两行。

hello.js

import "./xyz";
require("./abc");

它提供相同输出的两次

xyz
abc

即。 require的输出始终在导入后。如果我只使用导入,或仅使用import,它就会按照预期提供控制台,即。一个接一个地。 任何人都可以帮助理解这个吗?

2 个答案:

答案 0 :(得分:2)

hello.js中通过import声明的模块在运行hello.js中的任何代码之前导入。如果import语句出现在另一个语句之后,则无关紧要。在运行代码之前,模块仍然已加载。因此,无论您将import语句放在何处,首先都会获得“xyz”。

另一方面,

require()是程序化的。在程序运行时遇到require()语句时运行模块代码。

答案 1 :(得分:1)

由于ES6模块尚未在node.js中实现(不确定),我假设您正在使用babel来转换export, import语句。

当babel转换代码时,它总是将import语句放在模块的顶部,因此会发生这种情况。您可以在REPL中进行测试。

DEMO

More in depth details on import and require