React 新特性

react 17 并没有带来什么新的特性,详情看我的这个文章。但是我最近面试的时候发现了好多同学不知道一些技巧,这里介绍几个虽然很多时候用不上,但是能很好的提升解决疑难问题的能力。

useRef

useRef 是非常常用的属性,在获取 dom 时经常会用到,但是在 function 组件中其实有更加广泛的用法。那就是当成原来 Class 中的 this 来使用。下面的例子可以看的更加清楚:

  1. // class 组件中使用临时变量
  2. class Page extends React.Component {
  3. name: string = '';
  4. componentDidMount() {
  5. this.name = 'qixian';
  6. }
  7. render() {
  8. console.log(this.name);
  9. return <div />;
  10. }
  11. }
  12. // function 组件的同样方式
  13. const Page: React.FC<{}> = () => {
  14. const nameRef = useRef<string>('');
  15. useEffect(() => {
  16. nameRef.current === 'qixian';
  17. }, []);
  18. console.log(nameRef.current);
  19. return <div />;
  20. };

高耗时的 render 性能优化

众所周知 function 组件的会经常执行,每次执行都会产生新的变量,并且销毁上此的变量。我们有时候会这么写

  1. const Page: React.FC<{ list: string[] }> = ({ list }) => {
  2. const [stateList, setStateList] = useState<string[]>([...list]);
  3. useEffect(() => {
  4. query().then((msg) => setStateList([...msg]));
  5. }, []);
  6. const onClick = () => {
  7. console.log('run');
  8. };
  9. return (
  10. <div>
  11. {stateList.map((text) => (
  12. <div>{text}</div>
  13. ))}
  14. </div>
  15. );
  16. };

这样其实有个隐形的性能消耗,每次我们都会执行一遍 [...list],如果数组很大的我们会白白浪费很多性能。我们可以使用 useState 的一个隐含功能来实现。

  1. const [stateList, setStateList] = useState<string[]>(() => [...list]);

同样的 onClick 也会每次都创建,useCallback 就是为了解决这个问题,useMemo 解决变量的重复创建,useCallback 解决 function 的重复创建,

  1. const onClick = useCallback(() => {
  2. console.log('run');
  3. }, []);

useCallback 和 useMemo 非常容易滥用,如果不是数据量巨大的场景,或者明显感觉到卡顿,建议不要轻易使用。

useImperativeHandle

useImperativeHandle 用于设置ref,因为 function 中的 ref 只能流动,不能做修改和继承,所以提供了这样的hoosk, 你可以修改默认的 ref, 并且增加你的自定义方法。

  1. useImperativeHandle(ref, () => ({
  2. ...(checkBoxRef.current || {}),
  3. fetchData: () => fetchData(),
  4. }));

2020 年前端做了什么?

2020 年已经不像 2019 年那样涌现了一大批轮子,更多的就技术的迭代,前端的领域也已经基本确定,今年的 D2 大会也可以看出来,课题比去年的已经相对固化,接下来列举一下今年出现的比较火热的新技术。

WebAssembly

多个浏览器已经达成对初始 WebAssembly 版本的一致意见, WebAssembly 在高性能领域会展示出更多能力。在直播领域就有一个的使用 WebAssembly 解码 H.265, 使用用户的硬件来解码编码大大减少了服务器。

https://www.wasm.com.cn/

Hooks

hooks 提供了新的共享行为方式,成为了新的标准。诞生了很多新的轮子。useSwr 提供了一个新的网络请求方式。
react-use 提供了上百个 hooks,如果有需要的可以直接去抄袭。
image.png

ESM、Bundle 、Bundleless 、Vite 、Snowpack

随着 微软抛弃了 edge,webkit 已经统一前端,现在 esm 的已经默认支持,尤其是开发的时候,前端现在还需要编译吗? 以 vite 为例,1s 就可以冷启动一个项目,而使用传统的方式需要 5s。

交付组周会分享 - 图2

https://segmentfault.com/a/1190000025137845

模块联邦

Webpack5 模块联邦让 Webpack 达到了线上 Runtime 的效果,让代码直接在项目间利用 CDN 直接共享,本地无需编译。bigfish 已经内建了 msfu,支持了常用的库。

image.png

前端安全生产

**
前端的复杂度越来越高已经不是当年的主要画界面,顺便写写简单逻辑,前端的安全生产也别提了上来。

  • 前端版本变更前:静态代码扫描、⾃定义⼯程规范校验、单元测试 ;
  • 前端版本变更中:UI回归测试、迭代变更⻛险评估、灰度监控报告;
  • 前端版本变更后:1 分钟发现问题、5 分钟定位问题、10 分钟修复问题。

其他语言来写 JS 工具

**
esbuild 真的太快了, Go 和 Rust 这种天生高性能的语言相比于 nodejs 实现的性能超过百倍。

image.png
**
https://2ality.com/2020/10/js-plus-other-languages.html