React进阶之前端业务Hooks库(一)

server/2025/2/22 1:12:52/

前端业务Hooks库

  • 项目结构
    • 实现useToggle
      • useToggle/index.ts
      • 单测
        • packages/hooks/src/\_test_/index.test.ts
        • packages/hooks/src/useToggle/\_tests_/index.test.ts
  • 打包实现
    • gulp打包
      • gulpfiles.js
      • 根目录/gulpfile.js
    • webpack打包
      • webpack.config.js
      • packages/hooks/package.json
    • 使用encode-bundle打包
    • hooks下的gulpfile打包
      • packages/hooks/gulpfile.js
      • packages/hooks/metadata.json

初始化安装和打包
pnpm run init
启动本地doc
pnpm run dev
针对文档站的打包,会成一个dist
pnpm run build:doc

项目结构

中间生成的文件:

  • .umi 本地dev启动的能力
  • .umi-production 要打包的内容

其他文件

  • dist 打包后的产物

项目初始化过程中,依赖了编码项目工程化,encode-fe-lint,初始化了代码的规范,做到了一个脚手架cli的能力
例如:

  1. 创建demo

pnpm init

  1. 安装包

npx encode-fe-lint -h

走到了cli的能力中

  1. 初始化

npx encode-fe-lint init

  1. 选择
    在这里插入图片描述
    安装好后,就会注入这两个能力
    scan:代码扫描
    fix:代码修复
    在这里插入图片描述
    • .vscode
      • settings.json:初始化会把定义的规范和内容通过eslint插件能力告诉用户可以基于这部分安装
        在这里插入图片描述
        将这些都配置好

这个encode-fe-lint插件的思路:
根目录下创建encode-fe-lint.config.js文件:指定的文件目录读取的功能

再回到项目目录上:

  • config 借助dumi的配置,存放的是配置文件
    • config.ts 配置化表达路由,表达文档功能
      • extraBabelPlugins:
        • babel-plugin-import:dumi基于webpack来做的,编辑器使用的是babel做的
          • libraryName: ‘@alifd/next’,主题包使用的是阿里系的alifd/next
        • fusion
      • alias:别名,之后要在doc文档中,文档站中创建demo需要从encodeHooks中取,需要从alias目录指向去引
      • resolve:文档站要读取文档内容包含的信息是什么
      • links:刚使用@alifd/next导出主题包,这里可以通过cdn的方式引入主题包
      • navs 对应的导航栏
      • menus 对应的菜单

搭建站点:
react 用的是 dumi 来搭建,初始化配置 dumi config
Vue就是vuePress,针对vue2场景下用到的,像vue-cli这个网站就是用的vuePress来做的
vite使用的是vitePress搭建站点的
国外:React做的更多一些,dumi,docusaurs做站点

  • tsconfig.json
    • encodeHooks/encode-hooks 使用tspath,在这里定义,方便对应的文档站,方便这部分代码入口保持一致
  • docs:
    • index.md 官网的模板,markdown的形式展示文档的内容
    • guide
      • index.md 一些说明,测试的使用
  • packages
    • hooks 在实际的开发中,hook只是提供了一部分的内容,除了hooks还有components,utils,plugins,apis等这些都能做导出的方法去引用
  • public 头部信息,logo图片等静态资源
  • .babelrc 使用babel作react代码运行环境,
    • “presets”: [[“@babel/env”], “@babel/react”] 通过这个可以运行react代码了,babel是一个树状的结构
  • gulpfile.js 打包工具,通过gulp和webpack分别实现commonJS和esmodule以及对应的umd的效果
  • jest.config.js 单测的配置能力,通过jest方式在整个应用中运行的一个测试,运行pnpm run test
    • transform:针对.tsx文件都会经过ts-jest和tsconfig来解析
  • jest.setup.js:会在初始化的时候加入,针对HTMLElement整个类型上注入了全屏相关的方法
  • package.json
    • preinstall:限制pnpm安装 或者在 packageManager 限制pnpm版本
    • init:安装依赖并且执行build打包
    • build:pnpm的方式,因为是monorepo的项目,通过外部统一管理包的方式,其实执行的是packages包下的每个包中packages.json的build指令 pnpm -r 递归
    • dev:dumi的dev
    • clean-dist: rimraf包能够删除当前 packages 的hooks下的dist,es,lib,node_modules这些
    • test:执行的是jest,pnpm run test
    • coveralls:单测覆盖率,走的是jest.config.js文件,从单测配置文件中读取,collectCoverageFrom这个配置覆盖的文件
    • pub:发包,打包好后进行单个包的publish,
    • pub:beta 发布beta包打上tag标识
    • files:最终发布在docs中的内容
    • encode-fe-lint-scan
    • encode-fe-lint-fix:通过encode-fe-lint工具自定义注入到scripts中
  • pnpm-workspace.yml:可以看出是monorepo多包管理工具,有时候也会这样写:packages: - ‘apps/*',就在packages下或者apps下目录进行多个包的工具的管理
  • tsconfig.json:jsx:react环境,target:最后生成es5代码,exclude:过滤无用的内容
  • tsconfig.pro.json:tsconfig做根目录,它就能做子应用通过extends去注入,这里是把exclude注入到tsconfig.json文件中,并且对tsconfig.json文件进行覆盖
  • webpack.common.js:打包成umd,产物内容是production生产环境的内容,将react剔除出去当作外部的包的方式去引用

实现useToggle

先弄清这两点:

  1. 自定义hooks该实现的能力是什么
  2. 如何去打包构建,怎样进行自定义指令hook的封装

请添加图片描述

  • packages
    • hooks
      • src
        • useToggle
          • index.ts 完整代码的入口
          • index.md 作为dumi消费的内容,这里通过 <code>引用到对应的demo
          • demo 引用的例子
          • _test_ 对应的单测
      • package.json:files:最终发到npm包上的内容

useToggle切换

  1. useToggle() default params to false,不传参则置为false
  2. useToggle(a,b)

useToggle/index.ts

import { useState, useMemo } from 'react';export interface Action<T>{setLeft: () => void,setRight: () => void,set: (value: T) => void,    toggle: () => void
}// 1. useToggle() default params to false,不传参则置为false
function useToggle<T=boolean>():[boolean,Action<T>]// 2. useToggle(a) 有一个参数的情况
function useToggle<T>(defaultValue:T):[T,Action<T>]// 2. useToggle(a,b) 有两个参数的情况
function useToggle<T,U>(defaultValue:T,reverseValue:U):[T|U,Action<T|U>]function useToggle<D, R>(defaultValue = false as D, reverseValue?: R) {const [state, setState] = useState<D | R>(defaultValue);const actions = useMemo(() => {const reverseValueOrigin = reverseValue ? reverseValue : !defaultValue as D | R;; const setLeft = () => setState(defaultValue);const setRight = () => setState(reverseValueOrigin);const set = (value: D | R) => setState(value);const toggle = () => setState((s) => (s === defaultValue ? reverseValueOrigin : defaultValue));return {setLeft,setRight,set,toggle}}, []);return [state, actions]
}

单测

packages/hooks/src/_test_/index.test.ts
import * as

http://www.ppmy.cn/server/169711.html

相关文章

tailwindcss 前端 css 框架 无需写css 快速构建页面

版本&#xff1a;VUE3 TS 框架 vite 文章中使用tailwindcss 版本&#xff1a; ^3.4.17 简介&#xff1a; Tailwind CSS 一个CSS 框架&#xff0c;提供组件化的样式&#xff0c;直接在HTML 中编写样式&#xff0c;无需额外自定义CSS &#xff0c;快速&#xff01; 简洁&#…

网络安全的坚固盾牌· FireEye

FireEye 网络安全的核心是多向量虚拟执行 &#xff08;MVX&#xff09; 和智能驱动分析 &#xff08;IDA&#xff09; 技术。MVX 是一种无特征码的动态分析引擎&#xff0c;可检查可疑的网络流量&#xff0c;以识别逃避传统基于签名和策略的防御的攻击。IDA 是上下文动态规则引…

【Python爬虫(13)】解锁动态网页爬取:从原理到实战

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

python入门笔记5-集合与字典

元组 Python 的元组&#xff08;tuple&#xff0c;简写为tup&#xff09;与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号​()​&#xff0c;列表使用方括号​[]​。 好处就是节省内存。 集合 集合是无序、不重复元素的容器。 用 {} 或 set() 创建…

ref() 和 reactive()响应性 浅解

文章目录 1. ref() 和 reactive() 的区别2. 解构 详解2.1. 什么是解构2.2. 解构避免丢失响应性的办法2.2.1. 解决方案&#xff1a;toRefs() 保持响应性2.2.2. 解决方案&#xff1a; toRef()保持响应性 3. 最佳实践 在 Vue 3 中&#xff0c;ref() 和 reactive() 都是用于响应式数…

iOS 中使用 FFmpeg 进行音视频处理

在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …

拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!

2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号&#xff1a;AI将掀起工业革命级增长&#xff0c;量子计算突破引爆材料科学革命&#xff0c;游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点&#xff0c;揭示科技巨头的未来十年…

el-message自定义HTML包含按钮点击事件

关键代码 ElMessage({dangerouslyUseHTMLString: true,message: <span>请先维护供暖季信息</span> <el-button click${{go}} type"success" size"small" id"message-button">立即设置</el-button>,type: "error…