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
这是 Typescript 的预期行为。请参阅为什么导入在我的发出中被忽略?以及Typescript 的 github 上的这个线程。
TypeScript 假定模块导入没有副作用,因此它会删除任何表达式中未使用的模块导入。
如果不app
使用命名空间,Typescript 甚至不会尝试导入和运行,log.js
因为命名空间没有在任何地方使用,并且它假设模块没有副作用,因此导入它是没有意义的。
如果您确实想断言单独导入应该有副作用,请使用:
import 'log.ts';
Run Code Online (Sandbox Code Playgroud)
这会导致顶级代码按log.ts
预期被记录。
请注意,这是特定于 Typescript 的行为。在 Typescript 之外,每当导入模块时,模块的顶级代码都会运行,无论稍后导入或引用什么。