导入 ES6 模块是否执行导入文件中的代码?

2022-08-30 05:30:15

在导入过程中,js 文件中的代码是否会运行?如果是,那么一次或每次?例如:

// a.js
console.log("A");
const a = "a"; 
export default a;

// b.js
import a from "./a"; // => console logs?

// c.js
import a from "./a"; // => console logs again?

答案 1

是的,确实如此,只有一次。

请参阅 http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-module-records

如果已对此模块进行评估,则不执行任何操作。否则,以传递方式评估此模块的所有模块依赖项,然后评估此模块


答案 2

一个模块只会被评估一次,可以在一个项目中安装同一模块的两个副本,在这种情况下,该模块及其中的代码将被执行两次。

请考虑以下包结构:

index.js
package.json
node_modules/
├── package_b/
│   └── node_modules/
│       └── package_a/
|           └── index.js
└── package_c/
    └── node_modules/
        └── package_a/
            └── index.js

如果顶级索引.jspackage_bpackage_c导入,则package_a将被导入(并因此评估)两次

大多数人没有意识到这种行为,但如果他们落在这个特定的问题上,他们可能需要意识到这一点。

这是一篇关于理解npm依赖模型的古老但很好的文章,其中详细介绍了npm如何以及为什么这样做。