Emotion CSS-in-JS 库中的注释 /** @jsx jsx */ 做了什么?
What does the comment /** @jsx jsx */ do in the Emotion CSS-in-JS library?
这似乎是最佳做法,因为它几乎无处不在。但是,没有任何地方清楚地解释它到底做了什么......
我确实在 docs 中找到了一条评论:
"This comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement"。这是否仅仅意味着它用 Emotion 取代了标准的 React 功能?遗漏 /** @jsx jsx */ 评论有什么后果吗?
情感 jsx
export 允许您将 css
属性放在任何组件上,并自动将其转换为 className 属性。
/** @jsx jsx */
告诉 Babel 调用 jsx
变量而不是你刚刚从 emotion
导入的 React.createElement
这是一个 custom pragma 告诉 jsx 转换器,在这种情况下 babel-plugin-transform-react
使用什么函数将你的 jsx 转换为纯文本 javascript。
一个使用 jsx 的 React 组件,如下所示:
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 传入的 props 或其他数据。
所以这个问题的答案是:
Are there any consequences from leaving out the /** @jsx jsx */
是的。它可能会破坏库的功能。
编辑
这里的 emotion 文档中提到了这一点:https://emotion.sh/docs/css-prop#jsx-pragma
这似乎是最佳做法,因为它几乎无处不在。但是,没有任何地方清楚地解释它到底做了什么......
我确实在 docs 中找到了一条评论: "This comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement"。这是否仅仅意味着它用 Emotion 取代了标准的 React 功能?遗漏 /** @jsx jsx */ 评论有什么后果吗?
情感 jsx
export 允许您将 css
属性放在任何组件上,并自动将其转换为 className 属性。
/** @jsx jsx */
告诉 Babel 调用 jsx
变量而不是你刚刚从 emotion
React.createElement
这是一个 custom pragma 告诉 jsx 转换器,在这种情况下 babel-plugin-transform-react
使用什么函数将你的 jsx 转换为纯文本 javascript。
一个使用 jsx 的 React 组件,如下所示:
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 传入的 props 或其他数据。
所以这个问题的答案是:
Are there any consequences from leaving out the /** @jsx jsx */
是的。它可能会破坏库的功能。
编辑
这里的 emotion 文档中提到了这一点:https://emotion.sh/docs/css-prop#jsx-pragma