Javascript 为什么ES6从一个模块导入所有函数,而不仅仅是请求的函数?
从模块导入函数时,将导入所有导出的函数,尽管main.js中只导入了一个: someModule.js:Javascript 为什么ES6从一个模块导入所有函数,而不仅仅是请求的函数?,javascript,es6-modules,Javascript,Es6 Modules,从模块导入函数时,将导入所有导出的函数,尽管main.js中只导入了一个: someModule.js: export let print_a = (function(){ console.log('Hello from a') })(); export let print_b = (function(){ console.log('Hello from b') })(); main.js: import { print_a } from './someModule.js'
export let print_a = (function(){
console.log('Hello from a')
})();
export let print_b = (function(){
console.log('Hello from b')
})();
main.js:
import { print_a } from './someModule.js';
index.html:
...
<body>
<script type="module" src="main.js"></script>
</body>
</html>
。。。
因为我只从someModule.js导入了print_a,所以我希望得到输出:
“你好,a”
相反,我得到了输出:
“你好,a”
“你好,b”
为什么在main.js中没有导入print_b时调用它?这两个都是立即调用的函数表达式。您已执行一个IIFE并将其值分配给
print\u b
,但尚未导入print\u b
。您可以通过尝试执行console.log(print_b)
来测试这一点,chucksmash说的是真的。这些是iife。您是否考虑过使用函数声明,然后使用“require”语法进行导出,如下所示:
module.exports = function print_a(){
console.log('Hello from a')
});
module.exports = function print_b(){
console.log('Hello from b')
});
或者,您可以定义函数,然后在一条语句中显式导出它们(而不是单独将每个函数分配给module.exports):
我将使用require语法来导入模块
进入将调用以下函数的JS文件:
const { printA, printB } = require('./someModule.js')
require和import之间的主要区别在于require将自动扫描node_模块以查找模块,而来自ES6的import则不会。大多数人使用babel来编译导入和导出,这使得导入与requireJavascript需要评估
someModule.js
以了解其中的内容。您正在调用该文件中的函数,但会产生副作用。所以你会看到这些副作用。如果不希望在读取文件时计算这些函数,请删除()
,并在导入后调用它们。实际上,您正在将print_a
的值设置为undefined
,因为这是函数调用返回的值。因为这是规范所说的在浏览器中处理JavaScript MIME类型的方式。检索文件并立即解析(整个文件)。正如马克所说,如果你不想产生副作用,就相应地构建你的模块。-“moduleItemList”是设置导入、导出语句和模块主体。我认为OPs的要点是读取和执行整个模块文件。这是真的。当谈到术语“导入”时,OP的术语有点多余:
const { printA, printB } = require('./someModule.js')