avatar
Articles
170
Categories
9

Home
Categories
Salute Those Who Gaze At The Stars
Home
Categories

Salute Those Who Gaze At The Stars

React系列:第十一回(fiber最终版)
Created2024-05-16|React系列
本文介绍my_react的最终版在前作的基础上,新增了diff差异标记及commit阶段的全量更新。完整代码如下,不赘述了。 let nextUnitOfWork = null; let wipRoot = null; let currentRoot = null; // 新增:保存已提交的旧 Fiber 树(current 树) let deletions = []; // 新增:保存需要删除的 Fiber 节点 // 1. 标记类型常量(精简版) const Placement = 'PLACEMENT'; // 新增节点 const Update = 'UPDATE'; // 属性更新 const Deletion = 'DELETION'; // 删除节点 // 创建文本节点 Fiber const createTextNode = (child) => ({ type: 'text', props: { nodeValue: child, children: [] } }); // 创建元素 Fi ...
React系列:第十回(commit+Reconciliation)
Created2024-05-15|React系列
本文将介绍隔离fiber两个阶段:Reconciliation、Commit前文的瑕疵在上一篇文章中,我们介绍了基于fiber架构及requestIdleCallback,实现react快速渲染的demo.但是存在一点问题。仔细观察下面的代码: const performUnitOfWork = (fiber) => { console.log('<<<<<<<<<<<<<<<<performUnitOfWork>>>>>>>>>>>>>') console.log('fiber>>>', fiber) if (!fiber.dom) { fiber.dom = createDom(fiber) } if (fiber.parent) { fiber.parent.dom.appendChild(fiber.dom) } const elements = fiber?.props?.children ...
CSS系列:目下大前端样式的终极解决方案
Created2024-05-06|前端剑气双修
本文主要介绍tailwind,这个在我看来,能够解决目前前端领域中,各种样式问题的终极解决方案,的库。 前端跟css相关的几个典型场景:移动端适配、页面换肤。相信做过的同学,无一不疯狂的掉过头发。倒不是说因为这个有多难,而是很烦,很杂。研发和产品互掐的重灾区。一套代码多端适用,确实很美好,但是这就要求项目从一开始就要严格关注到这个问题,以便后期的适配。 最近在帮一家海外的公司做项目时,发现他们的项目大量使用tailwind。更让我惊讶的是,他们的项目中,所使用到的组件,全部都是自己的开发人员自己实现的,搭配tailwind,对设计图的还原度,无限接近百分百,让我叹为观止。在接触他们之前的职业生涯中,基本上都是做的toB的业务,重逻辑功能的实现,至于ui,只要不是难看到人神共愤,基本上就可以了。接触了toC的业务之后突然发现,专业的前端,除了具备技术技能,还需要锻炼自身的美感。 tailwind这个库方便在哪? 极大的简化了css相关的代码 完美解决各端适配的问题举例: 在tailwind的配置文件中设定好自身需要的几种端的大小 screens: { xs: '300p ...
React系列:第九回(concurrentmode、fiber)
Created2024-04-23|React系列
本文介绍,react快速渲染的基石:concurrentmode、fiber上一代版本存在的问题在第一回中,我们通过手撕myCreateElement和myRender实现了基本的功能,但是仔细观察下之前写的render,是否存在什么问题? const myRender = (element, container) => { const dom = element.type === 'text'? document.createTextNode(element.props.nodeValue): document.createElement(element.type) Object.keys(element.props).filter((item) => item !== 'children').forEach((item) => dom[item] = element.props[item]) element?.props?.children?.forEach((child) => myRender(child, dom)) container.append ...
发布自己的npm包
Created2024-04-22|前端剑气双修
本文主要提一下,往公网上发布自己的npm包,大概的流程。目前的公司,稍微正经点的,都会有贴合自身业务的一套组件库,封装成所谓的“SDK层”,这样能够极大的减少前端项目的代码量。当然,这需要业务自身足够的稳定,否则,懂得都懂。 1. github创建一个仓库,npm初始化一下,完善包的一些必要字段。2. 假如自己想要复用的代码3. 登陆发布npm login npm publish 具体操作参考下面文章,写的非常详细 https://juejin.cn/post/7039140144250617887 整个流程还是很简单的,当然在实操过程中碰到一个小问题。npm login 没有出现 username,反而是跳转到了cnpm注册...,解决方案:npm config set registry https://registry.npmjs.org/ 更新包的版本// patch:补丁号,修复bug,小变动,如 v1.0.0->v1.0.1 npm version patch // minor:次版本号,增加新功能,如 v1.0.0->v1.1.0 npm version minor ...
CSS系列:渐进式展示文本效果的实现
Created2024-04-22|前端剑气双修
本文主要介绍一下渐进式的展示文本效果实现先给一张最终效果图: 这个效果的实现,主要是借助animate和framer-motion库的几个钩子函数useTransform、useMotionValue。 1. html部分return <motion.h2 className={className}>{displayText}</motion.h2>; 2. useTransform、useMotionValue// text为props传入的值 const textIndex = useMotionValue(0); const baseText = useTransform(textIndex, () => text); const rounded = useTransform(count, (latest) => Math.round(latest)); const displayText = useTransform( rounded, (latest) => `${baseText.get().slice(0, ...
Webpack系列:第八回
Created2024-04-15|前端剑气双修
本文简单聊聊webpack同vite的差异众所周知,webpack是大部分项目的标配,而vite,更是后起之秀。原因在于vite的极速开发体验,一个字儿:快。vite是怎么做到的呢?Webpack 是 “先打包再干活”,Vite 是 “边干活边打包”——Vite 快的本质,是跳过了 “全量打包” 的冗余步骤,只在需要时才处理文件。 前者全量打包,后者按需编译,没有打包。vite利用浏览器能直接识别 ES Module(import/export)的特性,启动时只搭好服务器,不碰任何文件。浏览器要哪个文件,Vite 才去编译哪个,相当于 “按需开工”,启动速度自然秒级。注意,在开发环境下,vite是没有打包的动作的,这里的编译指的是把 “浏览器不认识的文件” 转成 “浏览器能认识的文件”,比如 TS→JS、Vue 组件→JS+CSS、Sass→CSS)。在生产环境中才会用rollup去打包 编译工具的不同。前者用的babel,后者用的esbuild(go),比 JS 快 10-100 倍 热更新。一旦代码改动,前者会编译打包变动部分,后者也是编译变化的那部分,但是没有打包的动 ...
Webpack系列:第七回
Created2024-04-15|前端剑气双修
本文杂记,记录一些webpack使用过程中碰到的奇奇怪怪的问题和知识点 react18初始化项目时,没有webpack默认是隐藏的,仔细观察可以发现,项目如下方式启动 "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "analyze": "source-map-explorer 'build/static/js/*.js'" }, 此时需要暴露: npm run eject Sourcemap(源映射)是一种文件,用于将编译后的代码映射回原始源代码。说白了就是在开发模式时,在浏览器中调试代码时,看到的是源码而不是杂乱无章的变异之后的代码
React系列:第八回(createElement、render)
Created2024-04-14|React系列
本文开始,我们将用几篇文章记录下,我们的my_react的实现逻辑。类似于vue的学习过程,我们将尝试手写react的重要组成部分,以便更为彻底的理解其底层实现。涉及的内容包括:createElement、render、cocurrent mode、fiber、render commit、reconcilliation及function components。本文介绍createElement和render。 渲染整体逻辑const content = React.createElement( 'div', { title: 'title', id: 'id', }, '川崎重工' ) console.log('content>>>', content) const root = ReactDOM.createRoot( document.getElementById('root') ); root.render(content) 从上面代码不难看出,通过调用createElement,会生成一种dom的数据 ...
区块链文档0
Created2024-04-11|前端剑气双修
本系列文章,将围绕实践中的项目,用于记录开发过程中,遇到的那些个事儿本项目也是一个极具挑战性的任务:基于opensuim开发一套前端代码编辑器,没错,就是要把vscode搬到页面上。我们的最终目的, 是为区块链开发者提供一整套在线敲代码的集成环境,渐进式提供各种链。 在正式内容开始前,先见到介绍些区块链相关的背景知识。 1.什么是区块链?区块链最好的解释就是一个公共数据库公链:任何人都可以参与的区块链,如比特币和以太坊。联盟链:需要得到许可的参与者才能加入的区块链,如R3 Corda和Hyperledger Fabric。私有链:仅允许特定组织或个人参与的区块链。 去中心化是基于P2P网络的,没有一台机器作为中心化的服务器的功能,网络中的每一台电脑都是平等的,任何一台掉线、宕机,都不会影响整个网络继续运行。 定量法币通常与背后的黄金或者所谓的GDP挂钩,算是相对固定(经济低迷时的过量发行暂且别考虑了)。加密货币,可以算作绝对的固定数量,或者少量的增发(可以弥补一些丢失的币等),防止通货膨胀。 加密 上面就是加密货币的三个典型特征,第一点借助p2p网络实现没问题,但是后面的二三两点存 ...
1…456…17
avatar
Miles | Isshin
Articles
170
Categories
9
Follow Me
Announcement
変わらない闘志,折れない魂
Recent Post
第一回引言:从“对话”到“推理”的范式转变2026-05-14
SPA发版后偶发白屏:场景、根因与治理方案2026-05-09
从“不存在”的重复请求,聊到 Web 存储的深坑2026-04-23
未来已来-论ai时代的最佳编程实践2026-04-16
现代单页应用(SPA)中微信授权登录的高可用架构实现2026-04-16
Categories
  • AI4
  • IC系列4
  • Miscellany8
  • React系列11
  • 前端剑气双修71
  • 图形化开发31
  • 性能的考量12
  • 语言1
Info
Article :
170
UV :
PV :
Last Push :
©2020 - 2026 By Miles | Isshin
Framework Hexo|Theme Butterfly