为什么从文件导入 * 执行代码?

Ser*_*res 1 javascript typescript ecmascript-6

为什么从文件(或模块)中不导出任何内容,将其重命名并将变量放入执行代码的范围中?

// log.js
console.log('A message');
Run Code Online (Sandbox Code Playgroud)
// index.js
import * as app from 'log.js';

app;
Run Code Online (Sandbox Code Playgroud)

结果:A message按预期打印。但如果你注释掉这一app行:

// log.js
console.log('A message');
Run Code Online (Sandbox Code Playgroud)
// index.js
import * as app from 'log.js';

// app;
Run Code Online (Sandbox Code Playgroud)

什么都没有打印出来。这里发生了什么?

有一个使用codesandbox的示例:https ://codesandbox.io/s/xenodochial-keldysh-j0sli

更新:我没有意识到这是我添加到问题中的打字稿示例,我正在使用打字稿和javascript进行测试:这是js版本的codesandbox: https: //codesandbox.io/s/silly-oskar-0mo2o

Cer*_*nce 6

这是 Typescript 的预期行为。请参阅为什么导入在我的发出中被忽略?以及Typescript 的 github 上的这个线程

TypeScript 假定模块导入没有副作用,因此它会删除任何表达式中未使用的模块导入。

如果不app使用命名空间,Typescript 甚至不会尝试导入和运行,log.js因为命名空间没有在任何地方使用,并且它假设模块没有副作用,因此导入它是没有意义的。

如果您确实想断言单独导入应该有副作用,请使用:

import 'log.ts';
Run Code Online (Sandbox Code Playgroud)

这会导致顶级代码按log.ts预期被记录。

请注意,这是特定于 Typescript 的行为。在 Typescript 之外,每当导入模块时,模块的顶级代码都会运行,无论稍后导入或引用什么。