【问题标题】:Visual Studio 2017, JavaScript intellisense inconsistenciesVisual Studio 2017,JavaScript 智能感知不一致
【发布时间】:2017-08-22 03:22:53
【问题描述】:

TL;DR:如何在 Visual Studio 2017 中包含一个 tsconfig.json 文件,并且仍然让 JavaScript 智能感知像默认情况下一样工作,为您自己的代码和第三个代码提供代码提示党图书馆?它很无聊,还是我只需要更好地了解它的工作原理?

与 jQuery 非常相似,我希望通过智能感知在 JavaScript 和 html 文件中无处不在地访问我自己的 JavaScript 命名空间。如何做到这一点?


编辑 3
我在developercommunity.visualstudio.com 上报告了这个问题。请考虑对该问题进行投票以吸引 Microsoft 的更多关注。


编辑 2
目前,“解决方案”是 Resharper,它提供了人们期望的开箱即用的东西。但是,对于 Visual Studio 自己提供的市场产品而言,299 美元/年/用户的价格并不理想。


编辑 1:
如果我对 Visual Studio 中 JavaScript 智能感知的期望不准确,下面是我期望它如何运行的人为示例。

假设我在 ./Scripts 文件夹中创建了三个 TypeScript 文件,我们将它们命名为 A.tsB.tsC.ts 。每个都包含自己的命名空间:

A.ts

namespace A {
    export function f1(s: string) {
        return s;
    }
}

B.ts

namespace B {
    export function f1(n: number) {
        return n;
    }
}

C.ts

namespace C {
    export function f1(b: boolean) {
        return b;
    }
}

此时,人们可能希望能够开始看到他们新创建的命名空间的智能感知,事实上,在 A.ts、B.ts 和 C.ts 中,您开始看到这些命名空间的智能感知。很酷。

不幸的是,这不会延续到其他地方,例如 /Home/Index.cshtml。 Index.cshtml 对 A、B 或 C 命名空间一无所知。此外,.js 文件对这些命名空间一无所知,因此需要它们各自的 TypeScript 声明 (.d.ts) 文件。

所以我们将继续将我们的 tsconfig.json 文件添加到我们项目的根目录并像我们上面那样配置它。如果我们对我们的一个 .ts 文件执行编辑并保存它,这会触发我们将相应的 .d.ts 文件编译到我们的 ./Scripts/out 文件夹中。我们现在是否在 Index.cshtml 和 .js 文件中获得智能感知? ...没有。

现在您可能认为需要将这些文件包含在项目中,以便 Visual Studio 将它们用于智能感知(在创建时将它们排除在外)。因此,您将它们包含在项目中。智能感知?不,jQuery 智能感知?不。也许它们需要与您要在其中使用它们的文件位于同一目录中? .....的种类?我在很多场合都遇到过这样的智能感知不一致:

不知何故,我们在 C3.js(注意:一个 JavaScript 文件)中的“A”命名空间获得了智能感知,但其他的都没有。什么?

也许您认为自己走在正确的轨道上,并且在智能感知引擎方面取得了小小的胜利。但随后您重新启动 Visual Studio 实例并...

等等....我只是对“A”命名空间有智能感知。发生了什么事!?

我不知道。但是在搞砸了一段时间后,我尝试在 .js 文件的顶部放置一个 import 语句,突然间智能感知开始为导入的文件/模块启动。呵呵!

甚至在 Index.cshtml 中,我也开始为我们导入的命名空间接收智能感知。

但是,当我关闭带有 import 语句的 .js 文件时,突然间我在 Index.cshtml 中失去了它们的智能感知。等等……什么??与 JavaScript 文件不同,我无法编写导入语句来接收它们的智能感知:

或者至少...不是我自己的命名空间:

正是这种不一致的来回使我对 Visual Studio 的 JavaScript 智能感知究竟是如何工作的感到困惑。我仍然不知道它是否只是坏了,或者我是否需要更好地了解它。


原帖

系统
Windows 10
VS2017 15.0.0+26228.10
新的 JavaScript 语言服务已启用

几天来,我一直在努力让 Visual Studio 2017 的 JavaScript 智能感知为我工作,但无济于事。我不知道 IDE 是否真的有问题,或者我只是没有正确理解它。

我现在对 how VS2017's JS intellisense 作品的理解是通过 typescript 定义文件或 .d.ts 文件。最终,我希望获得智能感知来帮助我们使用我们自己的 TypeScript/JavaScript,但现在我会满足于让它在一个新项目中始终如一地工作。

如果我创建一个新的 ASP.NET MVC 4.5.2 项目,开箱即用的 JS 智能感知似乎可以正常工作,我的意思是我可以在 .js 中键入美元符号 ($)文件或 script> 标签之间,我正确地接收到 jQuery 的智能感知。惊人的。现在,考虑到创建 TypeScript 文件 (.ts) 并让 TypeScript 编译器自动生成我们的 .d.ts 文件的最终目标,以便我们可以为自己的代码获得丰富的智能感知,我想介绍一个 tsconfig.json 文件到项目的根目录以进行配置。

创建 tsconfig.json 文件后,JS intellisense 停止运行。我在 .js 文件或 script> 标签之间键入一个美元符号 ($),我得到 jQuery 的零智能感知。这是一段令人沮丧的经历,但后来我在上面的链接页面上看到了这个小笔记:

注意:如果使用 tsconfig.json,则默认禁用此功能 配置文件,但可以设置为启用进一步概述 下面)。

“此功能”是指“默认情况下,Salsa 语言服务将尝试检测正在使用的 JavaScript 库...以提供更丰富的 IntelliSense。”好的,所以 Salsa 语言服务将不会自动检测正在使用的库,并在存在 tsconfig.json 文件时为它们提供智能感知,除非您按照“如下所述”专门配置它。至少,我是这么理解的。

如果我们稍微向下滚动页面并进入 tsconfig 文件设置,我们会遇到 enableAutoDiscovery 的设置,该设置“启用如上所述的定义文件的自动检测和下载”。关于“如上所述”所指的内容并不是很明确,但我只能假设它是指之前的说明,表明重新启用 Salsa 的自动检测功能以提供丰富的智能感知。所以我将该选项包含在我的 tsconfig.json 文件中并且......没有任何好处;仍然没有 JS 智能感知。

事实证明,typingOptions.enableAutoDiscovery has been renamed to typeAcquisition.enable。呸呸呸。好的,所以我们在 tsconfig.json 中进行了更改 aaaaaa 并且......仍然没有 JS 智能感知。

此时,我能够编写自己的 .d.ts 文件,Visual Studio 的智能感知可以正常使用(大部分时间......),但我仍然没有智能感知对于像 jQuery 这样的 3rd-party 库,这是不好的。

到目前为止,我已经找到了以下 tsconfig.json 文件:

{
  "compilerOptions": {
    "noEmitOnError": true,
    "noImplicitAny": false,
    "removeComments": false,
    "target": "es5",
    "declaration": true,
    "declarationDir": "./Scripts/out"
  },
  "compileOnSave": true,
  "typeAcquisition": {
    "enable": true, 
    "include": ["jquery"]
  },
  "include": [
    "./Scripts/app/**/*"
  ],
  "exclude": [
    "./Scripts/vendors/**/*",
    "./Scripts/out/**/*"
  ]
}

查看 TypeScript 虚拟项目后,我可以看到项目的 .ts 文件以及 jQuery 都包含在我的 %LOCALAPPDATA%\Microsoft\TypeScript\node_modules\@types 目录中。

我希望在完成所有这些后,我可以同时为我自己的项目的 .ts 文件和 3rd 方库(至少是那些特别包含的库;此时只有 jQuery)提供智能感知。唉……不。仍然没有 jQuery 智能感知。

顺便说一句,如果我为 jQuery 编写导入行,我会突然得到 jQuery intellisense

...有趣。也许这很有意义;我并没有搞砸模块导入以及 Visual Studio 的智能感知如何处理这些问题,但我真正想要的是在我们的代码和第 3 方库中都具有智能感知应用程序范围。 p>

【问题讨论】:

  • 我一直在经历同样的行为。一段时间以来,我的命名空间有了智能感知。突然之间,我失去了所有这些。无法弄清楚它是如何在 vs 2017 中为 javascript/typescript 读取和构建智能感知的
  • 现在是六月,当然。我想知道您是否在这个问题上取得了任何进展?在将项目文件的 TypeScriptToolsVersion 节点修改为 2.2 后,我能够使用 tsconfig.json 文件让 Intellisense 在 VS2017 中工作。您的工具版本设置为多少?

标签: javascript typescript intellisense visual-studio-2017 tsconfig


【解决方案1】:

JS 文件用于 javascript,不使用 typescript 编译器进行转译。

如果您使用的是 typescript,请将所有 typescript 保存在 ts 文件中。

此外,您不应该将 typescript 放在您的 cshtml 文件中,因为 typescript 不是 javascript。您需要使用 typescript 编译器将您的 typescript 转换为 javascript,然后您可以在 HTML 页面中使用该 javascript。

我认为您尝试做的不是人们通常使用打字稿的方式。通常您将所有打字稿写在 TS 文件中,然后作为构建过程,您将所有打字稿转译成 javascript。关于如何做到这一点有很多策略。您可以将所有 javascript 捆绑到一个文件中或将它们分解为模块。关于您希望最终 javascript 输出的外观,有很多选项。

您的 CSHTML 视图将引用您编译的 javascript 而不是您的打字稿。浏览器不知道用打字稿做什么。

【讨论】:

    【解决方案2】:

    貌似是 2017 年 3 月 14 日的最新更新(build 26228.09)导致了这个问题,你可以去控制面板——程序和功能——查看已安装的更新并删除这个更新,然后重新打开 VS 来检查智能感知。如果有效,说明本次更新导致了这个问题,你可以暂时不安装本次更新

    我注意到 Microsoft Report Projects for Visual Studio Extension 在项目中使用时可能会导致诸如此类的问题,在我将 SQL Server Report 项目添加到解决方案并重新启动 Visual Studio 后,我的几个已经坏了.. 所以现在我从解决方案中删除了我的报告项目,但我希望微软能解决这个问题

    【讨论】:

    • 是否有任何来源可以验证所说的更新实际上破坏了 JavaScript 智能感知?无论如何,我似乎没有安装该更新,所以不是这样。如前所述,上述所有步骤都在一个新的 ASP.NET MVC 4.5.2 项目中进行;解决方案中没有添加任何其他项目。
    • 目前在 VS2017 的已知问题中列出:visualstudio.com/en-us/news/releasenotes/… 查找标题:JavaScript IntelliSense 停止工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2011-10-14
    • 2014-11-25
    • 2018-02-06
    • 2018-02-20
    相关资源
    最近更新 更多