- 2018年2月28日 4:58@Hoishin*
我所说的“默认的CommonJS导出”是指module.exports = something
,而不是module.exports.foo = something
或module.exports = {foo: something}
。
它可能属于microsoft/vscode#21507,但我认为它有点不同。
- VSCode版本:1.20.1
- 操作系统版本:macOS High Sierra版本10.13.3
重现步骤:
module.exports
something
const f = 1234;
module.exports = f;
require
it
const f = require('./above-file');
console.log(f);
- 在
console.log
中的f
在Find All References中不显示跨文件的引用。如果您从模块文件中查找所有引用,则可以找到跨文件的引用。
然而, module.exports.foo
something
const f = 1234;
module.exports.foo = f;
require
it
const {foo} = require('./above-file');
console.log(foo);
- 在
console.log
中的foo
在Find All References中确实显示了跨文件的引用。如果您从模块文件中查找所有引用,则可以找到跨文件的引用。
当所有扩展都被禁用时,此问题是否仍然存在?:是的
- 原始问题已复制:microsoft/vscode#44700*
7条答案
按热度按时间ruoxqz4g1#
在控制台的console.log中的f没有显示在Find All References中的所有文件之间的引用。如果你从模块文件中使用Find All References,你可以找到跨文件的引用。
这里的问题是,find all references显示了
f
在./above-file
中。f
有一个不同的名字,不应该出现在引用集中。在控制台的console.log中的foo确实显示了跨文件的引用。如果你从模块文件中使用Find All References,你可以找到跨文件的引用。这很有意义,因为你是在引用模块上的属性。
xxhby3vn2#
在
importTracker
中,我将以下内容添加到了isNodeImport
:但是在
checker.getImmediateAliasedSymbol(symbol);
和getImport
中失败了。问题在于const x = require("./x")
没有给我们一个导出的别名,它只是给了我们一个与 x 导出相同类型的变量。从导出到导入的工作是可行的,因为检测导入是基于被导入的文件。但是反向操作不起作用,除非我们有一种方法来获取原始符号。@rbuckton@sandersn 我们为什么不在
const x = require("./x")
创建别名符号,而是在import x = require("./x")
创建呢?我进行了测试:
57hvy0tb3#
以下测试用例在当前(未修改)的情况下因找不到符号而崩溃:
eqfvzcg84#
#23570 是否修复了这个问题?它将 module.exports 设置为一个别名,就像 export= 一样。
xsuvu9jc5#
@sandersn That fixes the second example, but it looks like
const x = require("./a");
is still not an alias. So it will still crash in the first example (given the modification toisNodeImport
).sqyvllje6#
我认为修复 #25533 可以解决这个问题。
2w3kk1z57#
在这个问题上,Typescript的行为是如此的糟糕,以至于在修复Javascript之前需要先修复它。
在
/*1*/
处查找所有引用,找到了四个引用,这是有争议的,因为g
和good
有不同的名称。在/*1*/
处重命名所有四个引用,这似乎很糟糕,因为g
和good
不是同一个名称,而welove.ts
可能是一个d.ts文件,重命名会导致中断。在这里,在(1)处查找所有引用找到了最后三行,这看起来没问题。但是即使导入是
import { good as go }
,它也会出现错误,与export=
示例中的错误相同。重命名功能完全无法使用。在(1)处重命名最后一行,将导入重命名为import { good as go }
,然后错误地重命名了export const go = g
。这个问题可能在VS的一些版本中已经修复了,但在VS Code和emacs中仍然存在问题。我会看看是否已经有现有的bug报告。