首页 文章 精选 留言 我的

精选列表

搜索[javascript库],共10000篇文章
优秀的个人博客,低调大师

JavaScript 中的 AbortController:如何优雅地取消异步任务

在开发搜索框实时联想、文件上传进度控制或页面切换时中断数据请求等功能时,我们经常需要取消已经发出但不再需要的异步操作。以前用 XMLHttpRequest 可以直接调用 abort(),但换到 fetch 或一些返回 Promise 的异步函数后,取消就变得棘手。很多人在组件卸载后仍收到 setState 警告,或者因为旧请求覆盖新请求导致界面显示错误数据,根源就是没有真正取消异步任务。AbortController 是现代浏览器提供的标准方案,它通过一个信号对象将取消指令传递给 fetch、事件监听甚至自定义异步逻辑。这篇文章会从实际场景出发,讲清楚它的基本用法、如何配合 fetch 取消请求、如何监听取消事件、如何封装可复用的取消逻辑,以及处理超时和多个信号的组合场景。

优秀的个人博客,低调大师

GraalVM 将重点转向 Python/JavaScript 等非 Java 语言

继 2022 年宣布将 GraalVM CE Java 代码捐赠给 OpenJDK之后,Oracle 近期发文宣布,GraalVM 未来将专注于非 Java 语言。 具体来说,与 GraalVM 相关的 Java SE 产品路线图更新如下: GraalVM 团队正在转型,专注于非 Java Graal 语言,包括 GraalPy 和 GraalJS。详情预计将于稍后公布。 GraalVM for JDK 24 是作为 Oracle Java SE 产品组件获得许可和支持的最后一个 GraalVM 版本。需要对旧版 GraalVM 进行进一步更新的客户应通过 Oracle 支持进行下载。 Oracle JDK 24 最后一个包含实验性可选 Graal JIT 的版本。 GraalVM Early Adopter technology(包括 Native Image)即将停止向 Java SE 产品客户提供。OpenJDK 的 Leyden 项目正在进一步推进缩短 Java 程序启动时间、降低峰值性能和减少内存占用的目标,并将其作为 Java 的标准组成部分。 建议对 Java 技术感兴趣的 GraalVM 用户迁移到Oracle JDK或Oracle OpenJDK版本。关注 ahead-of-time performance features 的用户,建议迁移到 Oracle JDK 25,并探索JEP 514(Ahead-of-Time Command-Line Ergonomics)和JEP 515(Ahead-of-Time Method Profiling)的优势。 建议使用 Graal JIT 的 Oracle 客户(无论是在 GraalVM 发行版中还是作为 Oracle JDK 23 和 24 集成的一部分)改用默认的 C2 JIT。 更多详情可查看官方公告。

优秀的个人博客,低调大师

JavaScript性能优化实战:表格控件高效开发指南

引言 在现代Web应用开发中,电子表格功能已成为数据分析、报表展示等场景的核心需求。SpreadJS作为一款高性能的纯前端电子表格控件,能够完美兼容Excel文件格式,支持百万级数据量和复杂公式计算。然而随着数据规模的增长和业务逻辑的复杂化,性能优化成为开发者必须面对的挑战。本文将深入剖析几种SpreadJS性能优化技巧,通过实际案例和代码演示,帮助开发者构建响应迅速、用户体验优异的电子表格应用。 正文 一、渲染优化:Suspend/Resume Paint机制 SpreadJS的默认行为是每次修改后立即重绘界面,这在批量操作时会产生严重的性能损耗。通过使用suspendPaint和resumePaint方法,开发者可以暂时冻结UI渲染,待所有修改完成后再统一刷新。 // 未优化代码(耗时542ms) setSampleData(spread.getActiveSheet(), 10, 10); // 优化后代码(耗时19ms) sheet.suspendPaint(); setSampleData(sheet, 10, 10); sheet.resumePaint(); 实测数据显示,对10x10单元格设置值,优化后性能提升达28倍。此技术特别适用于工作表初始化、批量数据导入等场景。 二、计算优化:延迟公式计算策略 复杂公式的重计算是电子表格的性能瓶颈之一。SpreadJS提供了计算服务的挂起机制: sheet.suspendPaint(); sheet.suspendCalcService(); setDummyFormula(sheet, 10, 10); sheet.resumeCalcService(false); // false表示不立即计算 sheet.resumePaint(); 通过组合使用suspendCalcService和resumeCalcService,公式设置时间从110ms缩减至50-60ms。需注意: 计算服务恢复时建议关闭自动计算 重要公式可手动触发calculate方法 复杂工作簿建议分阶段恢复计算 三、加载优化:智能计算控制技术 大型工作簿加载时,可通过以下配置避免不必要的计算: workbook.fromJSON(jsonData, { doNotRecalculateAfterLoad: true }); workbook.options.calcOnDemand = true; 这两个标志位协同工作: doNotRecalculateAfterLoad:阻止加载时的全局重算 calcOnDemand:改为按需计算当前编辑区域 该方案特别适用于含大量跨表引用公式的工作簿。 四、迭代计算优化策略 循环引用是计算性能的"隐形杀手",优化方案包括: // 限制迭代次数和变化阈值 sheet.iterativeCalculation = true; sheet.iterativeCalculationMaximumIterations = 100; sheet.iterativeCalculationMaximumChange = 0.001; 最佳实践建议: 将循环引用约束在单个工作表 设置合理的收敛条件 避免多层嵌套循环引用 考虑用VBA脚本替代复杂迭代。 五、大数据加载:增量导入技术 传统JSON导入会阻塞UI线程,增量加载提供流畅体验: spread.fromJSON(json, { incrementalLoading: { loading: (progress, args) => { updateProgressBar(progress); }, loaded: () => { showCompletionToast(); } } }); 技术优势: 分片加载避免主线程卡顿 实时进度反馈增强用户体验 内存占用更平稳 支持加载中断恢复。 六、结构化数据:表格与命名范围 命名引用提升代码可读性和性能: // 传统引用 =SUM(A1:A10) - SUM(B1:B10) // 命名范围 =总收入 - 总成本 表格功能自动创建结构化引用: =SUM(销售表[金额]) 优势对比: 技术 可维护性 性能影响 适用场景 单元格引用 差 高 简单公式 命名范围 良 中 关键指标 表格引用 优 低 结构化数据。 七、公式精简策略 无效公式会拖慢整个工作簿,优化方案包括: 识别未使用的公式(如隐藏列、非活跃工作表) 转换为静态值: sheet.setValue(row, col, sheet.getValue(row, col)); 建立公式使用情况监控机制 定期执行"公式瘦身"维护^^(参考内容:方法7实施建议)。 八、批量操作:数组公式应用 传统单元格公式存在重复计算问题: // 低效方式 for(let i=0; i<1000; i++){ sheet.setFormula(i, 0, `=A${i}+B${i}`); } // 高效数组公式 sheet.setArrayFormula(0, 0, 1000, 1, "A1:A1000+B1:B1000"); 性能对比: 传统方式:1000次单独计算 数组公式:1次批量计算 内存节省约70%。 九、条件格式优化技巧 不合理的条件格式会导致指数级计算量: // 低效写法(计算144万次) =ISBLANK(K1200) // 优化方案(计算1次) =ISBLANK(K1) 优化原则: 最小化应用范围 简化判断条件 避免整行/整列引用 优先使用样式而非条件格式。 十、样式系统优化方案 样式处理不当会导致内存泄漏: // 低效方式(创建101个样式对象) for(let row=0; row<=100; row++){ let style = new GC.Spread.Sheets.Style(); style.backColor = "red"; sheet.setStyle(row, 0, style); } // 高效方式(共享1个命名样式) let style = new GC.Spread.Sheets.Style(); style.name = "warning"; style.backColor = "red"; sheet.addNamedStyle("warning"); sheet.setStyleName(0, 0, "warning"); 内存占用对比: 方式 样式对象数 内存占用 setStyle O(n) 高 setStyleName O(1) 低^^(参考内容:方法10实测数据)。 十一、数据操作:批量设置技术 单元格逐个设置效率低下: // 传统方式 for(let row=0; row<100; row++){ for(let col=0; col<10; col++){ sheet.setValue(row, col, data[row][col]); } } // 批量设置 sheet.setArray(0, 0, data); 性能提升关键点: 减少DOM操作次数 降低内存碎片 利用浏览器批处理机制 配合suspendPaint使用效果更佳。 结论 通过本文介绍的11项优化技术,开发者可以全面提升SpreadJS应用的性能表现。关键优化方向包括: 渲染控制:合理使用挂起机制避免无效重绘 计算优化:精确控制公式计算时机和范围 内存管理:共享对象引用减少内存消耗 批量操作:利用原生批量API减少交互开销 实际项目中建议结合性能分析工具(如Chrome DevTools)进行针对性优化,不同场景可组合使用多项技术。当处理10万级数据时,综合优化方案可实现5-10倍的性能提升,为用户提供桌面级电子表格体验。 随着Web技术的不断发展,性能优化将成为前端开发的核心竞争力。掌握这些SpreadJS优化技巧,不仅能够解决当前项目的性能瓶颈,更能为未来复杂应用的开发奠定坚实基础^^(参考内容:各方法综合应用建议)。 AI辅助的数据透视表生成与分析

优秀的个人博客,低调大师

用 HTML 和 JavaScript 实现手写签名的简易方法

前言 今天遇到的场景是这样的:在日常业务流程中,经常需要某一流程环节中相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印出来,但是这样的坏处就是会导致所有的负责人的签名都是一样的,没有美感,为了解决这个问题,一些公司就开始使用手写签名(用鼠标或者是电子笔写出来的签名)代替电子签名,今天本葡萄就为大家简单的介绍下手写签名到底是怎么实现的。话不多说,先上效果图: 看完效果图之后,下面为大家介绍实现的详细过程。 使用Html+JavsScript实现手写签名的添加 1.实现Html界面 <!doctype html> <html> <head> <title>SpreadJS in TypeScript</title> <!--引入在线Excel资源--> <link rel="stylesheet" type="text/css" href="node_modules/@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <link rel="stylesheet" type="text/css" href="node_modules/@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css"> <script src="node_modules/systemjs/dist/system.src.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js" integrity="sha512-3gJwYpMe3QewGELv8k/BX9vcqhryRdzRMxVfq6ngyWXwo03GFEzjsUm8Q7RZcHPHksttq7/GFoxjCVUjkjvPdw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jSignature/2.1.3/jSignature.min.js" integrity="sha512-lZ7GJNAmaXw7L4bCR5ZgLFu12zSkuxHZGPJdIoAqP6lG+4eoSvwbmKvkyfauz8QyyzHGUGVHyoq/W+3gFHCLjA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <!--添加清空和确认功能--> <body> <div id="signArea" style="position: absolute;top:100px;left:200px;visibility:hidden;z-index:100"> <div id="sign" style="height:300px;width:600px;border:1px dashed \#ddd;margin-bottom:10px"></div> <div> <button id="clear">清空</button> <button id="confirm">确认</button> </div> </div> <div id="designer-container" style="width:100%;height:90vh;border:1px solid darkgray"></div> </body> </html> 首先引入需要的在线Excel资源包,然后添加增加清空和确认手写签名两个按钮。 2.手写签名的JavsScript实现方法 (1) 添加手写签名: let config = JSON.parse(JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig)) let customeAddSign = { "text":"添加手写签名", commandName:"customeAddSign", execute:() =\> { if(document.getElementById("signArea")){ document.getElementById("signArea").style.visibility = 'visible' } } } (2) 追加右键自定义菜单: 核心代码: // 追加自定义右键菜单 config.contextMenu.push("customeAddSign") config.commandMap = { customeAddSign } let designer = new GC.Spread.Sheets.Designer.Designer("designer-container",config) let spread = designer.getWorkbook() $("#sign").jSignature({lineWidth:'16',width:'100%',height:'100%'}) document.getElementById("clear").onclick = function(){ $("#sign").jSignature("reset") } document.getElementById("confirm").onclick = function(){ let datapair = "data:" + $("#sign").jSignature("getData") let sheet = spread.getActiveSheet() let row = sheet.getActiveRowIndex() let col = sheet.getActiveColumnIndex() let picture = sheet.shapes.addPictureShape(`${sheet.name()}-${row}-${col}}`, datapair,0,0,100,100); picture.startRow(row) picture.endRow(row + 1) picture.startColumn(col) picture.endColumn(col + 1) picture.startRowOffset(0); picture.startColumnOffset(0); picture.endRowOffset(0); picture.endColumnOffset(0); picture.allowResize(false) picture.allowMove(false) picture.allowRotate(false) $("#sign").jSignature("reset") document.getElementById("signArea").style.visibility = 'hidden' } 这一步的作用是实现在Excel单元格中添加手写签名的功能,右键菜单选择手写签名后会调用对应的签名插件,在签名插件上可以用鼠标进行输入,输入完之后点击确认就会显示在单元格中。 完整代码和在线Demo地址: 相信看到这里,很多小伙伴已经想操作一下了吧,本葡萄也为大家准备了一个自由发挥的平台,点击下方链接便可以跳转到对应的Demo在线地址: https://jscodemine.grapecity.com/share/sXBAh7hZ00SAsemg_1jLbQ/?IsEmbed=false&Theme=Unset&PreviewDirection=0&IsEditorShow=true&IsExplorerShow=true&IsPreviewShow=true&IsConsoleShow=true&IsRunBTNShow=false&IsResetBTNShow=false&IsOpenInCodemineBTNShow=false&PanelWidth=20&PanelWidth=50&PanelWidth=30&defaultOpen=%7B%22OpenedFileName%22%3A%5B%22%2Findex.html%22%5D%2C%22ActiveFile%22%3A%22%2Findex.html%22%7D 扩展链接: Spring Boot框架下实现Excel服务端导入导出 项目实战:在线报价采购系统(React +SpreadJS+Echarts) Svelte 框架结合 SpreadJS 实现纯前端类 Excel 在线报表设计

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册