# qreact
**Repository Path**: solocoding/qreact
## Basic Information
- **Project Name**: qreact
- **Description**: QReact是去哪儿网YMFE团队推出的100%兼容官方React的迷你框架
- **Primary Language**: JavaScript
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-07-09
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 简介
QReact 是去哪儿网推出一个迷你 React 框架,让 React 在业务线上更具通用价值。众所周知,React 一直存在体积过大的诟病,集成了许多在线上环境不需要功能。YMFE 团队在熟读其源码的基础上,去芜存精,重新实现了 React 所有公开接口,体积只有 React 的约三分之一,从而解决它在移动端上加载过慢的问题。由于没有使用高级 API,因此只需在 webpack ,uglify 上修改配置,便能运用于 IE8 上,从而解决 PC 端同学使用 React 的问题。
对比 `preact/react-lite`,QReact 的优势在于事件系统更为完善,更具扩展性。像 `mouseenter/mouseleave`,`focus/blur` 等不冒泡的事件,`preact` 存在暇疵。
QReact 也实现了官方 `react/lib` 下的许多模块,这些模块可能被 RN 引用,这也为 QReact 支持三端合一的 QRN-WEB 做技术支撑。
- QReact 与 React 完全兼容,具有高度一致的 API 和行为。
- QReact 包含了 `react` 及 `react-dom` 的全部功能,同时有着更小的体积(`minified: 24KB gzipped : 10KB`),作为对比, `react@15.6.1` + `react-dom@15.6.1` 的体积则大了很多(`minified: 42.5KB + 182KB = 224.5KB gzipped: 9.1KB + 46.1KB = 55.2KB`)。
- QReact 支持 IE 6 - IE 8,详细信息请[参见使用](https://qreact.ymfe.org/usage.html)中的“在 IE 6 - IE 8 及以下使用”。
- 为了减小体积___没有___实现 `React.PropTypes`,但这并不意味着代码中使用了 `PropTypes` 就会报错,只是不起作用而已。
## 如何使用
**完整文档请前往[官网](https://qreact.ymfe.org)查看。**
### 注意
如果引用了 `create-react-class` 或者 `prop-types` 库,则需要配置别名让其指向 QReact 的 `createClass` 和 `PropTypes`。具体参见下面的配置中的 `alias` 部分。
### 在 ykit 中使用
如果使用 ykit 构建项目,可以在 `modifyWebpackConfig` 中配置 `alias` 来使用 `qreact` 替换 `react` 和 `react-dom`:
```javascript
module.exports = {
/*
...
*/
config: {
modifyWebpackConfig: function(baseConfig) {
// 其他 webpack 配置
baseConfig.resolve = {
alias: {
'react': 'qreact',
'react-dom': 'qreact',
// 若要兼容 IE 请使用以下配置
// 'react': 'qreact/dist/ReactIE',
// 'react-dom': 'qreact/dist/ReactIE',
// 如果引用了 prop-types 或 create-react-class
// 需要添加如下别名
'prop-types': 'qreact/lib/ReactPropTypes',
'create-react-class': 'qreact/lib/createClass'
}
}
return baseConfig;
}
},
/*
...
*/
};
```
### 在 webpack 中使用
如果使用 webpack 构建项目,可以通过配置 `webpack` 的 `alias` 来使用 `qreact` 替换 `react` 和 `react-dom`:
```javascript
module.exports = {
/*
...
*/
resolve: {
alias: {
'react': 'qreact',
'react-dom': 'qreact',
// 若要兼容 IE 请使用以下配置
// 'react: 'qreact/dist/ReactIE',
// 'react-dom': 'qreact/dist/ReactIE'
// 如果引用了 prop-types 或 create-react-class
// 需要添加如下别名
'prop-types': 'qreact/lib/ReactPropTypes',
'create-react-class': 'qreact/lib/createClass'
}
}
/*
...
*/
};
```
### 在 script 标签中使用
如果是直接使用 `script` 标签引入,那么可以去掉 `react` 和 `react-dom` 使用 `qreact` 取代之:
```diff
-
-
+
```
```javascript
module.exports = {
/*
...
*/
// 将 qreact 从打包的 js 文件中抽出
externals: {
'react': 'React',
'react-dom': 'ReactDOM'
}
/*
...
*/
};
```
### 在 IE 6 - IE 8 中使用
在 IE 6 - IE 8 中使用需要注意以下几个问题:
- `ykit.js` 中的 `alias` 字段配置需要指向 `qreact/dist/ReactIE` 而不是 `qreact`。
- 如果项目直接或间接(比如 `CSSTransitionGroup`)中用到了 `requestAnimatioin` 的话,需要单独引入 `requestAnimatioin` 的 polyfill。
- `.babelrc` 中需要在 `plugins` 中添加 `add-module-exports`。
```javascript
{
"plugins": [
"transform-export-extensions",
// babel@6 不再以 commonJS 方式输出模块
// 而在入口文件中中必须以 require 方式引入模块
// 否则无法正常渲染
// 详细信息请查看 https://github.com/59naga/babel-plugin-add-module-exports
"add-module-exports"
],
"presets": [
"es2015",
"react"
]
}
```
- 入口文件不能使用 `import` 方式引入包或者组件,且需要引入 `es5-shim` 和 `es5-sham`。
```javascript
// 引入 shim 解决 IE 8 下 Object.defineProperty 的问题
require('es5-shim');
require('es5-shim/es5-sham');
// 入口文件处不可用 import 引入模块,其他页面不受影响
// 因为 babel 把 import 编译成了 Object.defineProperty
// 而 IE8 中没有这个方法,上方引入的 shim 解决了这个问题
const React = require('react');
const ReactDOM = require('react-dom');
const Hello = require('./component/Hello');
ReactDOM.render(
,
document.getElementById('app')
);
```
## 组件规范
为了减少常见的编码错误,请尽量遵循[编码规范](https://qreact.ymfe.org/standard.html)。
## 鸣谢
QReact 基于开源项目 [developit preact@7.1.0](https://github.com/developit/preact/tree/7.1.0/) [developit preact-compat@3.14.1](https://github.com/developit/preact-compat/tree/3.14.1) 及 [Facebook React@v15.3.1](https://github.com/facebook/react/tree/v15.3.1)。
QReact 中包括 Virtual DOM 以及 diff 机制等核心部分基于 Preact,通过修改数据结构及 diff 逻辑进一步减小与原生 React 的差异。
此外,QReact 使用 React 的原生事件系统替换了 Preact 的事件绑定。