能否不使用JSX开发React?能否在React中使用Preact/Inferno等库?
关于React相关疑问的解答
1. 能不能不用JSX写React?
完全可以。JSX本质只是React官方提供的语法糖,最终会被Babel这类工具编译成React.createElement()(React 17+则是jsx()函数)的调用。
比如你写的JSX代码:
<div className="greeting">Hello React</div>
编译后会变成:
React.createElement('div', { className: 'greeting' }, 'Hello React');
你完全可以直接写原生JavaScript代码,用React.createElement构建组件树,甚至用函数式组件返回这类调用结果,完全不依赖JSX。不过JSX的优势是结构直观、和HTML接近,维护起来更方便,所以大部分项目会选择使用,但不用也完全没问题。
2. 能不能用简单函数替代,或者在React项目里用Preact/Inferno?
简单函数的方式
当然可以,而且这是现在React的推荐写法。函数式组件本身就是普通的JavaScript函数,只要返回React元素(不管是JSX编译后的结果,还是直接用createElement生成的)就行,配合Hooks可以实现所有类组件能做的逻辑。比如一个最简单的函数式组件:
function Greeting() { return React.createElement('div', null, 'Hello from function component'); }
关于Preact/Inferno的使用
首先要明确:Preact和Inferno是独立的React替代库,它们不是React的“插件”或“子库”,不能直接在React项目里混用这两个库的核心代码。不过:
- Preact提供了
preact/compat包,这个包实现了和React几乎一致的API(包括ReactDOM、Hooks等),可以让原本用React写的代码直接在Preact项目中运行,甚至你可以把项目的依赖从React换成Preact+compat,代码几乎不用改。 - Inferno也有类似的兼容层(
inferno-compat),同样可以兼容React的API,让React代码在Inferno环境运行。
但反过来,React本身并没有提供对Preact/Inferno组件的兼容支持,你不能直接在React项目里导入Preact的组件来使用。
关于“React库可兼容Preact、Inferno”的结论
这个结论不准确。正确的逻辑是:Preact和Inferno为了降低迁移成本,提供了兼容React API的适配层,让它们可以运行React编写的代码;而React本身并没有内置对这两个库的兼容能力,无法直接使用Preact/Inferno的组件或核心功能。
内容的提问来源于stack exchange,提问作者Amir Asgari
相关产品推荐
相关产品推荐

