脚本宝典收集整理的这篇文章主要介绍了基于 react, redux 最佳实践构建的 2048,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
前段时间 React license 的问题闹的沸沸扬扬,搞得 React 社区人心惶惶,好在最终 React 团队听取了社区意见把 license 换成了 MIT。不管 React license 如何,React 都是一个值得好好学习的优秀视图库。
本项目算不上什么大型项目,但依然按照大型项目的标准采用前端流行的最佳实践来打造一个有良好代码质量,高性能,高可维护性,模块化的应用。本项目是基于 react, redux 构建的 2048,此外也使用了近两年优秀的开源工具来提高代码质量,包括 eslint,stylelint,prettier 等等,以及 travis,codecov 等持续集成,持续部署等服务来保障代码质量和提高开发效率。
项目地址,喜欢的话 github 点个 star 支持下吧?
预览
桌面端
移动端
特性
响应式
自适应桌面和移动平台不同分辨率和尺寸,支持移动平台浏览器触控操作。下面的动图模拟了不同分辨率下的显示效果。实现方式主要是把 css 单位从 px 换成了 vw 和 rem ,各元素的尺寸是按照分辨率来进行缩放的。css 媒体查询到移动浏览器的话,调整部分组件的位置,隐藏部分不重要的组件,使页面更加紧凑。
数据持久化
网页应用最怕断电和离线,第一个问题通过 Store.subscribe
订阅 redux 状态更新,把状态序列化到 localStorage
储存,即使刷新,断电,程序奔溃再次打开仍然是最新的状态,第二个问题借助 chrome 的 PWA 技术,即使断开网络仍然可以访问缓存的资源文件。
Redux 状态
redux 是一个可预测的 JS 状态管理容器,结合 Redux DevTools extension 扩展可以很方便的进行应用状态穿梭,对辅助开发和debug大有裨益。不仅可以查看 redux 保存的状态,还可以随时回到到过去某个时刻的状态就像时间穿梭机一样,也看得到 redux 每次 action 的触发,以及每次触发造成的状态改动。
评论系统
借助 github issue api,使用 github 账号登录之后以回复 issue 的方式留言。留言支持 markdown 格式,和 github issue 体验类似。
PWA
在支持 PWA 技术的浏览器上(比如较新的 chrome)打开页面会自动询问你添加到屏幕,添加过程就像原生应用的安装一样。应用添加之后就可以像原生应用一样离线操作,也可以卸载应用。下图演示了 PWA 在 chrome 上面的添加过程,添加完成之后桌面会出现添加的应用,即便关闭所有网络仍然可以像原生应用一样正常操作。
i18n
应用支持多语言,且自动适配浏览器语言设置。目前检测到浏览器支持中文优先使用中文,否则默认使用英文显示。需要更多语言支持,编辑 src/utils/i18n.js
的 data
对象,添加对应语言文字即可。
react 最佳实践
@H_537_126@import React from "react";
import PropTypes from "prop-types";
import styles from "./tips.scss";
export default function Tips({ title, content }) {
return (
<div classname={styles.tips}>
<p className={styles.title}>{title}</p>
<p className={styles.content}>{content}</p>
</div>
);
}
Tips.propTypes = {
title: PropTypes.string.isRequired,
content: PropTypes.string.isRequired
};
shouldcomponentUpdate
方法),需要组件保存自己的状态,或者用 refs 操作 DOM,你就需要一个有状态组件,采用 es6 class 继承 React.COMponent 的写法。组件示例: import React from "react";
import PropTypes from "prop-types";
import classnames from "classnames";
import styles from "./cell.scss";
import { isObjEqual } from "../../utils/helpers";
export default class Cell extends React.Component {
static propTypes = {
value: PropTypes.number.isRequired
};
shouldComponentUpdate(nextProps, nextState) {
return (
!isObjEqual(nextProps, this.props) || !isObjEqual(nextState, this.state)
);
}
render() {
const { props: { value } } = this;
const color = `color-${value}`;
return (
<td>
<div
className={classnames([styles.cell, { [styles[color]]: !!value }])}
>
<div className={styles.number}>{value || null}</div>
</div>
</td>
);
}
}
constructor(...args) {
super(...args);
this.handleMoveUp = this.handleMoveUp.bind(this);
this.handleMoveDown = this.handleMoveDown.bind(this);
this.handleMoveLeft = this.handleMoveLeft.bind(this);
this.handleMoveRight = this.handleMoveRight.bind(this);
this.handleKeyUp = this.handleKeyUp.bind(this);
this.handleSpeakerClick = this.handleSpeakerClick.bind(this);
this.handleUndo = this.handleUndo.bind(this);
}
Button.propTypes = {
children: PropTypes.oneofType([PropTypes.node]),
onClick: PropTypes.func,
size: PropTypes.oneOf(["lg", "md", "sm", "xs"]),
type: PropTypes.oneOf([
"default",
"Primary",
"warn",
"danger",
"success",
"royal"
]).isRequired
};
Button.defaultProps = {
children: "",
onClick() {},
size: "md",
};
shouldComponentUpdate
方法;以组件 Row 示例: // 如果该行没有格子需要刷新也没有组件自己的状态刷新,
// 则该组件不执行 render 方法,
// 避免每次别的行数据刷新也跟着重新渲染。
shouldComponentUpdate(nextProps, nextState) {
return (
!isObjEqual(nextProps, this.props) || !isObjEqual(nextState, this.state)
);
}
本项目是基于 FaceBook 官方出品的 create-react-app 脚手架搭建的,reject 后做了适当修改以适配项目需求。
sass-loader
到 scss 规则下面最下面即可。配置代码
import
该包时直接从全局变量获取。剥离后打包的 js 文件大小从 278kb 减小到 164 kb。src, 项目源代码大部分都在这里,主要是 react 组件 js 代码 和 scss 样式代码。次级目录包含了 jest 单元测试代码,测试代码尽量和源代码挨着,以方便编写。
index.js
里面,同时该目录包含该组件用到样式的 scss 文件,尽量一个目录包含该组件所需的所有代码避免污染其他代码,提高组件复用性。components
类似,但因为是 smart 组件,所以这里的组件可以操作 redux 的数据,不用太考虑复用性。store.subscribe
订阅应用状态更新,序列化状态存到 localStorage
。因为配置文件用了 es6+ 语法所以要求 node 的版本大于 6.10,同时建议使用 yarn 来管理依赖包。fork 项目之后可以按如下命令操作。
npm i -g yarn # 安装 yarn
git clone git@github.com:<你的名字>/React-2048-game.git
cd React-2048-game
yarn # 安装依赖包
yarn start # 开启调试模式,启动后自动打开浏览器 http://localhost:3000
yarn test # 自动测试
yarn build # 打包代码
package.json
的 stylelint.rules
。以上是脚本宝典为你收集整理的基于 react, redux 最佳实践构建的 2048全部内容,希望文章能够帮你解决基于 react, redux 最佳实践构建的 2048所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。