Visual Studio 2015 JSX/ES2015 语法高亮

IT技术 visual-studio-2015 intellisense ecmascript-6 react-jsx
2021-03-28 01:20:41

如何使用 ES2015 代码在 Visual Studio 2015 for JSX 中获得正确的语法高亮显示?

ES2015代码

如果我删除importexport关键字它工作正常无导入/导出

我刚刚更新到 Visual Studio 2015 Enterprise Update 1,但它仍然保持不变。

6个回答

更新 (2017-02)

Node Tools for Visual Studio (NTVS) 自 v1.2 以来一直使用 Salsa 分析引擎,使用 NTVS 可能是 JSX 支持阻力最小的途径。

https://github.com/Microsoft/nodejstools

阅读(并投票)此答案以获取更多详细信息:https : //stackoverflow.com/a/41996170/9324


原答案

我遇到了同样的问题并找到了两种解决方案 - 一种使用 ReSharper,一种修改 Visual Studio 外部 Web 工具。

解决方案 1

在 ReSharper 10 中:

  • 打开选项对话框
  • 代码编辑 > JavaScript > 检查下,在JavaScript 语言级别下拉菜单中选择ECMAScript 6
  • 确保在 .JS 文件中启用 JSX 语法选项也被选中(假设您使用 JSX 语法)。
  • 您还需要在 Visual Studio 中禁用 javascript 语法错误,如下所示:
    • 转到工具 > 选项 > 文本编辑器 > JavaScript > IntelliSense
    • 取消选中显示语法错误框并确定。
  • 重新加载VS解决方案

重新加载解决方案后,红色波浪线对我来说消失了。但是,JSX 的语法突出显示不起作用。我在render函数中声明的任何元素的开头部分都没有正确的着色——但这对我来说很容易忽略。

我还应该提到 javascript 文件需要具有.js扩展名。如果你给他们.jsx扩展名,你会在你的第一个 import 语句中得到红色波浪线。错误消息将是JSX Parser: illegal import declaration(这可以使用下面的解决方案#2 修复)

更新:感谢@SntsDev 提供的解决方法 有一种方法可以避免将.jsx文件命名.js

  • 在 Visual Studio 中,转到选项 > 文本编辑器 > 文件扩展名
  • 添加jsx并将其分配给Javascript 编辑器

解决方案2

好奇心战胜了我,我想探索是否有非 ReSharper 解决方案。Visual Studio 使用一个本地运行的节点服务器modulereact-server来动态解析 JSX。这个module可以在这里找到:

C:\Program Files (x86)\Microsoft Visual Studio
14.0\Common7\IDE\Extensions\Microsoft\Web Tools\External\react-server

Visual Studio 2015 更新 3 的更新 感谢@TheQuickBrownFox的评论/更新。对于更新 3,react-server命令的位置现在在此文件中:

C:\Program Files (x86)\Microsoft Visual Studio 
14.0\Web\External\vs-task-server\react-commands.js

进一步检查上述文件夹中server.jsreact-commands.js文件,有一个名为transformJsxFromPostor的函数transformJsx此方法包含以下行:var transformed = reactTools.transformWithDetails(code, { elementMap: true });. 这是对react-toolsmodule ( https://www.npmjs.com/package/react-tools )的引用,该module具有更多可用于解析 ES6 的选项。

所以:

  • 替换这一行:

    var transformed = reactTools.transformWithDetails(code, { elementMap: true });

  • 具有以下内容:

    var transformed = reactTools.transformWithDetails(code, { elementMap: true, es6module: "--es6module", harmony: "--harmony" });

    请注意添加--es6module--harmony标志,指示react-tools将传入代码视为 ES6。

  • 在 Visual Studio 中禁用 javascript 语法错误,如下所示:

    • 在 Visual Studio 中,转到工具 > 选项 > 文本编辑器 > JavaScript > IntelliSense
    • 取消选中显示语法错误框并确定
  • 重要提示:重新启动 Visual Studio。.jsx用ES6代码文件应该不会再有你的ES6代码红色波浪线。


笔记:

  • 我不知道解决方案 2 中概述的server.js文件更改是否会影响非 ES6 代码。因此,实施风险自负。
  • 此外,很可能/很可能您的更改可能会被 Visual Studio 的后续更新覆盖。
  • 这将是酷/好玩替换使用的react-tools范围内react-server与巴贝尔CLI。更新:感谢@NickDewitt,他似乎能够完成这项工作:https : //stackoverflow.com/a/36321109/9324
@AdamWeber 如果您有兴趣,我设法将其换成了 babel,请在下面查看我的答案
2021-05-23 01:20:41
@DylanParry,您需要执行解决方案 1 中的可选步骤:转到工具 > 选项 > 文本编辑器 > JavaScript > IntelliSense,然后取消选中显示语法错误
2021-06-06 01:20:41
从更新 2 或 3 开始,不确定是哪个,它现在位于“C:\Program Files (x86)\Microsoft Visual Studio 14.0\Web\External”下。
2021-06-07 01:20:41
有一种方法可以避免将 .jsx 文件命名为 .js:在 VS 中,选项 > 文本编辑器 > 文件扩展名,添加“jsx”并将其分配给“Javascript 编辑器”。这是解决方案 1。谢谢!
2021-06-08 01:20:41
从 VS2015 Update 1 开始,解决方案 2 是否仍然有效?我已应用该修复程序并重新启动,但 VS 仍然在所有 .jsx 文件的导入和导出上显示红色波浪线。
2021-06-19 01:20:41

在安装了 VS2015 Update-3 和 NTVS 1.2 时,只需将TypeScript Editor设置为文件扩展名jsx的默认编辑器就对我有用

1) 打开工具>选项>文本编辑器>文件扩展名

2)在Extension中输入jsx编辑选择TypeScript Editor,点击Apply。

在此处输入图片说明

您可以使用工具>选项>文本编辑器>typescript来处理制表位和格式
2021-05-25 01:20:41
虽然它没有提供智能感知
2021-05-26 01:20:41
+1 用于使用 NTVS。当我最初发布我对这个问题的回答时,我尝试使用它,但当时他们对 JSX 的支持并不好。现在 NTVS 使用 Salsa 引擎,使用 NTVS 可能比修改外部工具更容易(也更明智)。
2021-06-03 01:20:41
格式化很烂。当我自动格式化我的 jsx 文档时,所有的缩进都消失了。我最终得到了一个无法读取的平面文件
2021-06-05 01:20:41

编辑:Visuals Studio 15 更名为 Visual Studio 2017:您可以在此处获取 RC:https : //www.visualstudio.com/vs/visual-studio-2017-rc/

未来解决方案:

Visual Studio“15”预览版 2 支持开箱即用的 JSX en React。您可以启用与 VS Code 相同的 (Salsa) Javascript 服务库。

这里是发行说明:https : //www.visualstudio.com/en-us/news/releasenotes/vs15/vs15-relnotes

萨尔萨舞:https : //github.com/Microsoft/TypeScript/wiki/Using-the-Salsa-Preview-in-Visual-Studio-15-Preview

预览 3 出来了。正确的链接是visualstudio.com/en-us/news/releasenotes/vs15-relnotes
2021-05-26 01:20:41
visual-studio链接不好
2021-06-03 01:20:41

解决方案“3”:

感谢 Adam 在他的回答中的见解,我已经使用babel和它的插件/预设进行了这项工作如果你正在尝试这个,值得先阅读他的回答。

在继续之前,您需要安装nodeJsnpm,并且可能在修改之前备份任何文件。

我在这里使用react , es2015插件和stage1预设,但你可以使用任何你喜欢的插件

  1. Powershell 到 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\External\react-server

  2. 安装以下软件包:

    npm install babel-core --save-dev
    npm install babel-preset-es2015 --save-dev
    npm install babel-preset-react --save-dev
    npm install babel-preset-stage-1 --save-dev
    
  3. 将依赖添加到server.js下面childProcess

    var childProcess = require('child_process'); //already there
    var babel = require('babel-core');
    var es2015 = require('babel-preset-es2015');
    var react = require('babel-preset-react');
    var stage1 = require('babel-preset-stage-1');
    
  4. 替换函数中赋值try{}catch{}部分req.on('end'transformJsxFromPost

    try {
    
        var transformed = 
            babel.transform(
                code, 
                {
                    sourceMaps: true, 
                    presets: [
                        es2015, 
                        react, 
                        stage1
                    ]
                }
            );
    
        result = { 
            elementMappings: []
        }
        //I found it least buggy when returning an empty list of elementMappings
        //but i will leave the code i was using to try and dupe it, or 
        //recreate the elementMappings from react-tools
        //
        // result = { 
            // elementMappings: [{
                // 'start': 1,
                // 'end': transformed.code.length,
                // 'generatedCode': transformed.code
            // }], 
            // map: transformed.map, 
            // code: transformed.code
        // }
    }
    catch (e) {
        //the error that react-tools was returning was slightly different, so
        //map the babel error back to the react-tools error that VS 2015 expects
         result = {
             column: e.loc.column,
             description: e.errorMessage,
             errorMessage: e.message + ".. :-(",
             index: e.pos,
             lineNumber: e.loc.line
         };
    }
    
  5. 重新启动 Visual Studio,关闭并重新打开任何 .jsx 文件并享受 babel 语法高亮:-)

注释
在您启动后给解析器一个启动的机会,当您第一次加载到 .jsx 文件时,visual studio 将执行以下操作:

  1. 创建一个文件夹%localappdata%\Temp\stderr.txt在那里你可以找到一个日志的任何错误和stdout.txt它会告诉你什么样{port}的服务器上运行,并且还记录等信息。
  2. 启动一个 nodeJs 服务器,在localhost:{port}服务器上运行接受 JSX 作为 POST/transformJsxFromPost并将遇到的第一个错误的行号和列号作为 json 对象返回给 Visual Studio

我不得不关闭 jsx 文件的 javascript 智能感知,正如 Adam 在解决方案 1 的回答中所示:

在 Visual Studio 中,转到工具 > 选项 > 文本编辑器 > JavaScript > IntelliSense,然后取消选中显示语法错误框并确定。

关闭 javascript 智能感知后,与 vs 和 babel 一起打包的 react-server 都只返回它们遇到的第一个错误,因此您不应该期望在整个文件中看到所有错误的突出显示,但它们确实显示如果您保持代码无错误,则在您键入时启动。

我想现在剩下要做的就是elementMappings正确地结束 - 解决方案 4 也许?:-)

@MichalCiechan 语法错误表明它正在工作,它是否为您提供了行号和列号?
2021-06-10 01:20:41
意思是说我正在使用 VS2015 Update 2。
2021-06-11 01:20:41
不想为我工作。我收到错误“JSX 解析器:无法与 JSX 解析器通信”。我已经安装了上面列出的四个节点module,但是一旦我尝试将它们中的任何一个导入到server.js脚本中,就会发生错误
2021-06-12 01:20:41
啊好吧,我确实遇到过类似的情况,我认为这是启动和重新启动 vs 和节点服务器的副作用,但它似乎在您修改和发送文本后立即更新
2021-06-13 01:20:41
@MichalCiechan 您是否关闭了底部注释中的 javascript 错误?我只是在我的工作笔记本电脑上设置了它,它仍然显示syntax error在那里,直到我关闭 js 语法检查
2021-06-15 01:20:41

在尝试研究这一点时,我发现了一种在所有版本的 Visual Studio 中处理 jsx 文件的简单方法。它并不完美,但对我有用。

下载最新的 Visual Studio Code [ https://code.visualstudio.com/updates ],然后在您拥有的任何版本的 Visual Studio 中右键单击一个 jsx 文件,然后选择“打开方式...”。选择“添加”并浏览到您最近下载的 Visual Studio Code 并将其设为默认值。

希望能帮助那些担心不得不升级的人。