繁体   English   中英

Visual Studio 2017,JavaScript 智能感知不一致

[英]Visual Studio 2017, JavaScript intellisense inconsistencies

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

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


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


编辑 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 智能感知究竟是如何工作的感到困惑。 我仍然不知道它是否只是坏了,或者我是否需要更好地理解它。


原帖

系统
视窗 10
VS2017 15.0.0+26228.10
启用了新的 JavaScript 语言服务

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

我现在对VS2017 的 JS 智能感知如何工作的理解是通过 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 智能感知停止运行。 我在 .js 文件或 < script > 标签之间输入一个美元符号 ($),我得到的 jQuery 智能感知为零。 这是一段令人沮丧的经历,但后来我读到了上面链接页面上的这个小笔记:

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

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

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

事实证明, typingOptions.enableAutoDiscovery已重命名为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 目录中。

TypeScript 虚拟项目

我希望有了这一切,我将同时拥有我自己项目的 .ts 文件和 3rd 方库的智能感知(至少是那些特别包含的库;此时只有 jQuery)。 唉……不。 仍然没有 jQuery 智能感知。

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

在此处输入图像描述

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

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

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

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

如果您使用的是打字稿,则将所有打字稿保存在 ts 文件中。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM