Что делает комментарий /** @jsx jsx */ в библиотеке Emotion CSS-in-JS?
Это, кажется, лучшая практика, так как она используется практически везде. Впрочем, нигде четко не объясняется, что именно он делает...
В документах я нашел комментарий, который гласил: "Этот комментарий говорит babel преобразовывать jsx в вызовы функции с именем jsx вместо React.createElement". Означает ли это, что он просто заменяет стандартную функциональность React на Emotion? Есть ли какие-либо последствия, если вы пропустите комментарий /** @jsx jsx */?
2 ответа
Это пользовательская прагма, которая сообщает преобразователь jsx, в данном случае babel-plugin-transform-react
какую функцию использовать для преобразования вашего jsx в обычный javascript.
С сайта React:
Компонент React с использованием jsx, который выглядит следующим образом:
class Hello extends React.Component {
render() {
return <div>Hello {this.props.toWhat}</div>;
}
}
Будет преобразовано в это:
class Hello extends React.Component {
render() {
return React.createElement('div', null, `Hello ${this.props.toWhat}`);
}
}
Но используя эту пользовательскую прагму, скомпилированный js может выглядеть так:
class Hello extends React.Component {
render() {
return jsx('div', null, `Hello ${this.props.toWhat}`);
}
}
Это полезно, потому что jsx
Функция может каким-то образом включить функциональность используемой вами библиотеки, изменяя или иным образом используя реквизиты или другие данные, передаваемые из jsx.
Поэтому для ответа на этот вопрос:
Есть ли какие-либо последствия от пропуска /** @jsx jsx */
Да. Это, вероятно, нарушит функциональность библиотеки.
РЕДАКТИРОВАТЬ
Это упоминается в документах по эмоциям здесь: https://emotion.sh/docs/css-prop
Эмоция jsx
экспорт позволяет поставить css
prop для любого компонента и автоматически преобразовать его в className.
/** @jsx jsx */
говорит Бабелу позвонить jsx
переменная вместо React.createElement
, который вы только что привезли из эмоций