О фрагментах React
При написании в React вам необходимо иметь родительский элемент, охватывающий ваши HTML-элементы. В результате без использования фрагментов вы завершаете свой HTML-код вокруг тегов <div> ... your HTML ...</div>
.
Эти теги не только семантически несущественны, но они также раздувают ваше веб-приложение бесполезной разметкой, и, поскольку производительность веб-сайта гибнет от тысячи сокращений, эти дополнительные <div></div>
теги могут в конечном итоге негативно повлиять на скорость отклика приложения, если их сложить вместе.
Реагировать на фрагменты представляет собой тег, позволяющий заменять пустые элементы <div></div>
на <React.Fragment>
или сокращенно <> ...your html... </>
.
Тег <> </>
fragment при компиляции не оставляет никаких посторонних элементов div в вашем приложении, в то же время удовлетворяя требованиям React по заключению ваших HTML-элементов в родительский тег.
Эта проблема
В зависимости от конфигурации кода Visual Studio, подсветка синтаксиса React Fragment может выглядеть некорректной. Вот мои версии стека:
// Visual Studio Version: Version: 1.39.2 Commit: 6ab598523be7a800d7f3eb4d92d7ab9a66069390 Date: 2019–10–15T15:33:00.827Z
…
// The stack used for compilation as it appears in package.json.
“@babel/core”: “7.4.4”,
“@babel/preset-react”: “7.0.0”,
“@babel/preset-typescript”: “7.3.3”,
“babel-loader”: “8.0.6”,
“webpack”: “4.39.3”,
"react": "^16.8.6",
Исследование
- Вопрос о переполнении стека с жалобой на сбой компиляции: https://stackoverflow.com/questions/48316365/react-fragment-shorthand-failing-to-compile
- О поддержке фрагментов в React.js: https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
- О поддержке синтаксиса фрагментов в Visual Studio: https://code.visualstudio.com/updates/v1_19#_jsx-fragment-syntax
Разбивка проблемы:
- Согласно обновлению кода Visual Studio с ноября 2017 (версия 1.19) синтаксис фрагмента
<>...</>
поддерживается в VSC, поэтому моя версия VSC (1.39, 2019) должен поддерживать синтаксис и не вызывать проблем. - Синтаксис фрагментов поддерживается в React с версии 16.2 (2017), а я использую 16.8, поэтому версия React должна быть проблемой.
- Проблема в том, что по умолчанию подсветка синтаксиса не работает в Visual Studio Code.
- В примечаниях к выпуску для VSC версии 1.19 прямо указано, что TypeScript поддерживает синтаксис фрагментов. Однако нет упоминания о каком-либо другом языке, поддерживающем синтаксис фрагментов?
- Мой VSC настроен на автоматическое определение используемого языка и устанавливает для моих
*.jsx
файлов значениеJavascript (Babel)
. - При ручном изменении языка файла, над которым я работаю,
Javascript React
по-прежнему отображается неправильная подсветка синтаксиса.
Исправление:
- При ручном изменении языка Visual Studio Code на
Typescript React
проблема с подсветкой синтаксиса устраняется.
Примечания:
- Компиляция приложения с использованием Webpack - ›Babel -› React была успешной, даже несмотря на то, что подсветка синтаксиса была отключена в VSC, что указывает на то, что проблема не в настройке Webpack / Babel и, вероятно, больше в VSC.
Скриншоты
Неработающий синтаксис фрагмента. Обратите внимание на то, что закрывающий </>
фрагмент красный на </
и желтый на >
, что указывает на отсутствие закрывающего тега. Обратите внимание, что язык в нижней части редактора установлен на Javascript (Babel)
.
Фиксированный синтаксис. Обратите внимание на цвета в редакторе: export default *
больше не желтый, что означает, что тега больше нет (по крайней мере, в глазах редактора кода). Опять же, это было исправлено путем установки языка в нижней части редактора VSC на Typescript React.
.
Обратите внимание, что я использую Typescript React, хотя мой файл технически не является Typescript - не оканчивается на .tsx
.
Я не знаю, есть ли способ заставить синтаксис фрагментов работать с языком, установленным как Javascript
, но это решение явно решает мои проблемы, поэтому я оставлю все как есть.
Надеюсь, это было полезно для всех, кто мог столкнуться с этой проблемой, спасибо за чтение!