Выделение синтаксиса Visual Studio 2015 JSX/ES2015

Как я могу получить правильную подсветку синтаксиса в Visual Studio 2015 для JSX с кодом ES2015?

Код ES2015

Он отлично работает, если я удалю ключевые слова import и export: Без импорта/экспорта

Я просто обновился до Visual Studio 2015 Enterprise Update 1, но он все равно остается тем же.

Ответ 1

ОБНОВЛЕНИЕ (2017-02)

Node Инструменты для Visual Studio (NTVS) используют механизм анализа Salsa с версии v1.2, а использование NTVS, скорее всего, является наименьшим сопротивлением для поддержки JSX.

https://github.com/Microsoft/nodejstools

Прочтите (и подтвердите) этот ответ для более подробной информации: fooobar.com/questions/96381/...


ОРИГИНАЛЬНЫЙ ОТВЕТ

Я столкнулся с той же проблемой и нашел два решения: один с использованием ReSharper и один модифицирующий внешние веб-инструменты Visual Studio.

РЕШЕНИЕ 1

В ReSharper 10:

  • откройте диалоговое окно Параметры
  • Редактирование кодa > JavaScript > Инспекции выберите ECMAScript 6 на уровне на уровне JavaScript.
  • убедитесь, что выбран синтаксис Включить JSX в .JS файлах (при условии, что вы используете синтаксис JSX).
  • вам также необходимо отключить синтаксические ошибки javascript в Visual Studio следующим образом:
    • перейти к Инструменты > Параметры > Текстовый редактоp > JavaScript > IntelliSense
    • снимите флажок Показать синтаксические ошибки и нажмите ОК.
  • перезагрузить решение VS

После перезагрузки решения красные squigglies исчезли для меня. Однако подсветка синтаксиса для JSX не работает. Начальный сегмент любых элементов, объявляемых в функции render, не имеет правильной раскраски - но это легко игнорировать.

Я должен также упомянуть, что для файлов javascript требуется расширение .js. Если вы дадите им расширение .jsx, вы получите красные squigglies в своем первом заявлении на импорт. Сообщение об ошибке будет JSX Parser: illegal import declaration. (Это можно устранить, используя решение № 2 ниже)

ОБНОВЛЕНИЕ: благодаря @SntsDev для этого обходного пути Существует способ избежать наименования файлов .jsx как .js:

  • в Visual Studio перейдите к Функции > Текстовый редактоp > Расширение файла
  • добавьте jsx и назначьте его Редактору JavaScript

РЕШЕНИЕ 2

Любопытство стало лучше меня, и я хотел исследовать, было ли решение без решения ReSharper. Visual Studio использует локально управляемый сервер node с именем react-server для синтаксического разбора JSX. Этот модуль можно найти здесь:

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.js или react-commands.js из вышеупомянутых папок (ов), есть функция с именем transformJsxFromPost или transformJsx. Этот метод содержит следующую строку: var transformed = reactTools.transformWithDetails(code, { elementMap: true });. Это ссылка на модуль react-tools (https://www.npmjs.com/package/react-tools), который имеет больше возможностей для разбора ES6.

Таким образом:

  • замените эту строку:

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

  • со следующим:

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

    Обратите внимание на добавление флагов --es6module и --harmony, которые инструктируют react-tools обрабатывать входящий код как ES6.

  • отключить синтаксические ошибки javascript в Visual Studio следующим образом:

    • в Visual Studio перейдите к Инструменты > Параметры > Текстовый редактоp > JavaScript > IntelliSense
    • снимите флажок Показать синтаксические ошибки и нажмите ОК
  • ВАЖНО: перезапустите Visual Studio. Ваши файлы .jsx с кодом ES6 больше не должны иметь красных squiggles на вашем коде ES6.


ПРИМЕЧАНИЯ:

  • Я не знаю, повлияет ли изменение, указанное в РЕШЕНИИ 2, на файл server.js на код, отличный от ES6. Поэтому реализуйте на свой страх и риск.
  • Кроме того, это вполне возможно/вероятно, ваши изменения могут быть перезаписаны с последующим обновлением в Visual Studio.
  • Было бы здорово/забавно заменить использование react-tools внутри react-server с помощью Babel CLI. ОБНОВЛЕНИЕ: Благодаря @NickDewitt, похоже, он смог выполнить эту работу: fooobar.com/questions/96381/...

Ответ 2

В VS2015 Update-3 и NTVS 1.2, просто установив TypeScript Редактор в качестве редактора по умолчанию для расширения файла jsx помогло.

1) Откройте Инструменты > Параметры > Текстовый редактоp > Расширение файла.

2) Введите jsx в Extension, выберите TypeScript Редактор в качестве редактора и нажмите "Применить".

введите описание изображения здесь

Ответ 3

ИЗМЕНИТЬ: Visuals studio 15 переименовывается в Visual Studio 2017: вы можете получить RC здесь: https://www.visualstudio.com/vs/visual-studio-2017-rc/

Будущее решение:

Visual Studio "15" Preview 2 поддерживает JSX en React из коробки. Вы можете включить ту же самую (Salsa) Javascript Service, такую ​​как VS Code.

Здесь примечания к выпуску: 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

Ответ 4

РЕШЕНИЕ '3':

Благодаря проницательности Адама в его ответе, я получил эту работу с babel, и это плагины/пресеты. Сначала стоит прочитать его ответ, если вы пытаетесь это сделать.

Вам нужно nodeJs и npm установленный перед тем, как идти дальше, и, возможно, создайте резервные копии любых файлов, прежде чем изменять их.

Я использую react, es2015 плагины с stage1 пресеты здесь, но вы можете использовать любые plugins вам нравится

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

  • Установите следующие пакеты:

    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
    
  • Добавьте зависимости < <22 > ниже 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');
    
  • Замените раздел 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
         };
    }
    
  • Перезапустите визуальную студию, закройте и заново откройте любые .jsx файлы и получите подсветку синтаксиса babel: -)

Примечания
Дайте синтаксическому анализатору шанс зайти после того, как вы начнете, визуальная студия выполнит следующее при загрузке в файл .jsx в первый раз:

  • Создайте папку в %localappdata%\Temp\ с помощью stderr.txt, где вы можете найти журнал ошибок и stdout.txt, который расскажет вам, что {port} сервер работает, а также записывает другую информацию.
  • Запустите сервер nodeJs, работающий на localhost:{port}, который принимает JSX как POST на /transformJsxFromPost и возвращает номер строки и номер столбца первой ошибки, с которой он сталкивается как объект json для визуальной студии

Мне пришлось отключить javascript intellisense для jsx файлов, как Адам показывает в решении 1 в своем ответе:

В Visual Studio откройте "Инструменты" > "Параметры" > "Текстовый редактор" > "JavaScript" > IntelliSense, затем снимите флажок "Показать синтаксические ошибки" и "ОК".

Если javascript intellisense выключен, как реагирующий сервер, так и упакованный с vs и babel, так как я его заменяю, они возвращают только первую ошибку, с которой они сталкиваются, поэтому вы не должны ожидать выделения всех ошибок в вашем файле, но они появляются, когда вы печатаете, если вы сохраняете код без ошибок.

Я думаю, теперь все осталось сделать, чтобы получить elementMappings по правильному пути - возможно, решение 4?: -)

Ответ 5

Во время исследования я понял простой способ работы с файлами jsx во всех версиях Visual Studio. Это не идеально, но работает для меня.

Загрузите последний код Visual Studio [https://code.visualstudio.com/updates], затем щелкните правой кнопкой мыши файл jsx в любой версии Visual Studio и выберите "Открыть с...'. Выберите" Добавить" и просмотрите недавно загруженный код Visual Studio и сделайте это по умолчанию.

Надеюсь, что это поможет людям беспокоиться о необходимости обновления.

Ответ 6

Он упоминается в комментариях выше @TheQuickBrownFox, но скрыт по умолчанию (необходимо развернуть все, чтобы увидеть его), поэтому резюмируя, что я сделал, чтобы исправить проблему в последнем обновлении сообщества Visual Studio 2015 3:

100% от Решение 1 от Адама Вебера: fooobar.com/info/96381/... (установка Уровень языка JavaScript) в ReSharper до ECMAScript 2016 и установите флажок Включить JSX... в том же окне + отключить Показать синтаксис ошибки в опциях VS JavaScript IntelliSense)

Решение 2 от Адама Вебера: fooobar.com/info/96381/..., но слегка изменено; целевой файл, в который вы должны заменить:

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

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

действительно здесь: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Web\External\vs-task-server\react-commands.js

перезапустите VS, и все готово.