Dvorak
Dvorak

Dvorak Chen

Front Something about Front End


如何让前端写的更舒服一点

文章探讨了前端开发中JavaScript、HTML和CSS三大套件的痛点与优化思路。JavaScript因历史遗留的语法缺陷和浏览器兼容性问题长期被诟病,如var变量提升、转译器对现代语法的降级处理等,这些特性被美化为“语言特性”却频繁导致BUG。文章指出通过TypeScript的类型系统和严格Lint配置可规避缺陷,但这也引发新的思考:当转译后的代码仍需兼容旧浏览器时,我们是否在用现代语法的壳子包装过时的内核?HTML作为声明式语言虽然直观,但重复性高导致开发效率受限,对比Flutter用Dart封装Widget的复用性,暴露出声明式语言在工程化上的局限——当界面复杂度攀升时,HTML的冗余写法是否正在阻碍前端工程的进化?CSS虽未展开讨论,但文章暗示三大套件的割裂状态始终是前端开发的痛点。最终抛出核心问题:在声明式语言与编程范式之间,是否存在更优雅的平衡点?当框架开始用编程逻辑重构界面描述时,HTML是否正在被重新定义?--Qwen3

Javascript css typescript HTML Front end Development Dart

Create your own simple reactivity front-end framework

创建自己的响应式前端框架是一次对现代框架设计理念的探索通过比较Angular的类组件React的虚拟DOM和Vue的文件组件作者选择了函数组件与信号驱动的响应式架构作为实现路径文章以DvorakJS为例展示了如何通过SWC编译器将JSX转换为自定义的createElement方法并在此基础上构建响应式逻辑当数据更新时通过发布-订阅模式自动触发视图变更例如属性绑定通过订阅信号值变化实现动态更新而动态子元素则通过函数返回值的替换机制保持同步这种设计避免了虚拟DOM的性能开销并保留了声明式编程的简洁性但如何在不引入额外运行时依赖的情况下处理深层嵌套组件的响应式更新如何优化频繁的DOM替换带来的性能损耗如何实现细粒度的依赖追踪以减少不必要的重渲染这些问题仍然值得进一步思考当开发者手动实现基础响应式机制时是否能更直观地理解框架底层的依赖收集与调度策略这种自定义框架能否在生产环境中解决实际问题而不仅仅是技术验证或许我们更应该思考响应式编程的本质是否可以通过更轻量的模式重塑前端开发体验--Qwen3

Javascript Dvorak.js Signals Publisher Subscriber DOM Manipulation ECMAScript 6

组件化-组件的兼容性

文章探讨了组件化前端开发中如何实现兼容性设计的核心问题。传统HTML/CSS模式通过直接修改元素样式实现灵活布局,但组件化开发需建立全新思维框架——组件应通过接口暴露或父级约束实现环境适配而非被动接收样式污染。当组件开放类名传递接口时,开发者容易陷入"传染性"坏习惯,导致组件样式被外部随意篡改破坏既定设计。这种设计缺陷会引发诸如元素溢出父容器等布局问题,根源在于未正确处理盒模型计算和层级样式继承。提升组件兼容性的关键在于:对固定尺寸组件提供可控接口,对自适应组件采用父级约束策略,同时严格遵循盒模型规范(如设置box-sizing:border-box)。这种设计理念转变要求开发者突破传统HTML思维定式,建立组件边界意识——组件应像独立单元在不同环境中稳定运行,而非依赖外部样式干预。当组件能通过父级约束自动适配大小时,开发者才能真正享受组件化带来的复用价值。文章最后引发思考:在追求组件灵活性与稳定性的平衡中,如何设计既能满足多样化需求又不破坏组件内核的接口体系?--Qwen3

Javascript Component Design UI Development CSS Styling Compatibility Issues Box Model

组件化-使用 Cypress 测试组件

文章围绕如何利用 Cypress 实现组件化测试展开,对比了传统单测工具与可视化测试框架的差异,揭示了组件库开发中缺乏直观展示场景的痛点,并提出通过 Cypress 结合 Rollup/Vite 的打包方案优化开发体验。作者通过构建一个类苹果窗口组件的案例,完整演示了从创建组件库到配置 Cypress 的流程,重点解析了版本控制、tsconfig 配置、测试文件生成等易出错环节,同时展示了 Cypress 提供的查询断言机制如何实现组件行为验证。文章指出 Cypress 生成的默认测试代码存在类型定义缺失和必传参数缺失的问题,并给出通过修改 tsconfig.json 和引入 cypress/react18 的修复方案。在测试实践层面,强调应避免依赖易变的类名/ID定位元素,转而通过 data-cy 属性实现稳定查询,同时通过链式调用断言 API 验证组件状态。最终通过对比成功与失败的测试用例效果,直观呈现了 Cypress 的实时反馈能力。文章最后引发思考:当组件逻辑复杂度提升时,如何设计测试用例才能在保证覆盖率与维护成本之间取得平衡?--Qwen3

Javascript Cypress E2E Testing React Components Chai Assertions Data Attributes

在前端开发中使用 Mock

在前端开发中,真实API的不可用性或不稳定性常常成为开发的障碍,而Mock技术通过模拟请求和响应提供了解决方案。本文以msw为例,展示了如何通过拦截请求构建稳定的开发环境。通过`npm install msw --save-dev`安装核心工具后,开发者可在项目中创建mock配置文件,通过定义`handlers`数组指定需要拦截的API路径和响应逻辑,例如使用`http.get("/getSth")`搭配`HttpResponse.json()`返回预设数据。msw通过生成`mockServiceWorker.js`实现浏览器请求拦截,配合`setupWorker`和`enableMocking()`方法,使mock服务在开发环境自动启动。当点击按钮触发`fetch("/getSth")`时,msw会拦截请求并返回配置好的模拟数据,而真实环境中若未启用mock则会直接报错。这种技术不仅解决了前后端分离开发中的联调难题,更提供了灵活的测试场景。但当mock数据与真实API存在差异时,如何平衡模拟精度与开发效率?当项目规模扩大时,mock配置的维护成本又该如何控制?这些问题或许正是你深入探索前端工程化实践的起点。--Qwen3

Javascript MSW Mock API Frontend Development HTTP Mocking HTTP Requests

CSS 编写赛博效果的 LOGO

文章介绍了通过叠加三张SVG Logo图片并利用CSS属性实现动态视觉效果的方法。核心步骤包括使用绝对定位错开两层SVG元素的位置(如.svg2设置top:-3px/left:-5px,.svg3设置top:3px/left:5px),配合0.5透明度和mix-blend-mode:lighten混合模式增强色彩层次。通过定义两个交替动画dark-left和dark-right,利用@keyframes分别控制错位元素的fill颜色周期性变化(如#ff0054→#9dff00→#00d5ff等渐变),最终形成流动的霓虹光效。完整实现依赖SVG路径数据、CSS定位属性、混合模式及关键帧动画的组合应用,项目代码托管在GitLab的Aiursoft主页项目中。--Qwen3

css SVG CSS Animation Mix Blend Mode Logo Design Layer Effects

React 单元测试

本文介绍了如何使用Vitest、React Testing Library和MSW进行React组件单元测试的完整流程。通过配置测试环境安装必要依赖后,首先演示了基础交互测试方法:通过data-testid属性定位元素模拟点击事件,利用queryByRole验证组件状态变化。针对包含网络请求的场景,使用MSW构建mock服务器拦截HTTP请求,通过beforeAll和afterAll控制mock服务启停,并用waitFor处理异步渲染验证。测试过程中需注意组件残留导致的重复渲染问题,通过afterEach配合cleanup实现测试环境清理。完整示例包含两个测试用例,分别验证点击灰色按钮卸载内容元素和点击黄色按钮触发mock请求的正确行为,最终形成结构化测试代码模板,涵盖依赖导入、mock配置、测试钩子和断言逻辑的完整实现。--Qwen3

Javascript MSW Vitest React Testing Library Component Testing Node.js

如何开发npm包并使用rollup打包

这篇文章详细解析了如何利用Rollup构建可发布的React组件库并上传至npm,通过实际案例展示了从零到发布的完整流程。文章首先对比了Rollup与Webpack的差异,强调其基于ES6模块的摇树优化特性,能有效压缩代码体积。通过一个包含图片资源的组件示例,揭示了首次发布时因忽略多余文件导致的体积问题,并通过.npmignore文件规范解决了资源冗余问题。在进阶环节中,重点演示了如何通过Rollup配置文件实现多模块格式输出(CJS/ESM),并整合postcss、typescript2等插件处理现代前端开发中的各种资源类型。文章通过三次迭代发布过程,逐步展示了从源码发布到打包压缩的演进路径,最终实现生产环境代码混淆和体积优化。值得注意的是,文中通过两次版本更新的对比,揭示了开发库与生产包的管理差异,提出了如何平衡代码可读性与体积优化的思考。当开发者在选择打包工具时,是否真正理解了不同模块系统的适用场景?当需要同时支持ESM和CJS模块时,又该如何设计输出策略?这些关于构建工具的深层考量,或许正是每个前端开发者在组件库开发中必须面对的抉择。--Qwen3

Javascript npm packages rollup javascript bundling typescript postcss

为什么我在css里使用功能类优先

本文探讨了CSS开发中从语义类优先向功能类优先的思维转变,揭示了现代前端开发中样式复用的困境与解决方案。传统语义类CSS通过类名定义语义化样式,却因HTML结构差异导致样式难以复用,最终迫使开发者频繁使用内联样式破坏代码整洁。功能类优先的写法通过直接在HTML类中应用具体样式(如`text-center`),消除了CSS文件与HTML的割裂感,使样式实现更直观可控。这种转变并非完全否定语义类的价值,而是承认在复杂布局场景下,功能类能更高效地应对元素层级带来的样式隔离问题。作者强调功能类的真正优势在于:1)消除CSS文件冗余 2)避免样式覆盖冲突 3)提升调试效率——开发者无需在HTML与CSS文件间反复跳转。文章指出,语义类仍适用于全局主题设置和稳定元素(如按钮)的样式定义,而功能类则更适合动态布局场景。这种混合策略的关键在于理解"优先"二字,即在能发挥各自优势的场景灵活切换。当开发者开始思考"如何通过功能类实现响应式布局"而非"如何让语义类复用"时,代码的可维护性将显著提升。最终引发思考:在组件化开发盛行的今天,CSS方法论的选择是否应该与项目复杂度正相关?--Qwen3

css Functional First Semantic vs Utility Tailwind CSS UI Libraries CSS Best Practices

浅谈 Javascript 事件循环

JavaScript的单线程执行机制通过事件循环处理任务,所有代码执行和异步回调均在主线程按顺序进行。事件循环包含宏任务队列和微任务队列,宏任务包括整体代码、setTimeout/setInterval回调等,微任务包括Promise.then/catch/finally等,每次循环优先清空微任务队列再执行宏任务。setTimeout的第二个参数表示回调进入宏任务队列的延迟时间而非立即执行时间,实际执行时机取决于事件循环状态。当执行耗时操作时(如一次性创建5万个DOM元素),会阻塞后续任务和浏览器渲染,导致页面卡顿。通过将任务拆分为多个小块(如每次创建250个元素),利用setTimeout将每个小块作为独立宏任务依次放入队列,可让浏览器在每次宏任务后清空微任务队列并触发页面渲染,实现平滑的渐进式更新。错误的优化方式如一次性用循环注册大量setTimeout宏任务,会导致队列被占满,反而延迟其他关键任务的执行。正确实现需通过递归注册setTimeout,在每次宏任务执行完毕后触发下一个任务,确保每次任务执行后浏览器获得渲染机会。这种分片处理方式能有效平衡任务执行与渲染频率,避免长时间阻塞主线程。--Qwen3

Javascript DOM Manipulation Event Loop Macrotask Queue Browser Rendering Performance Optimization

  • 1