自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序员成长指北

一个有趣的且乐于分享的人.专注 完整的 Node.js 技术栈分享,从 JavaScript 到 Node.js;再到后端数据库,祝您成为优秀的高级 Node.js 工程师.座右铭:今天未完成的,明天更不会完成.

  • 博客(3042)
  • 收藏
  • 关注

转载 前端关于单点登录的知识

作者:An_an16347原文:https://juejin.im/post/6844903664264413198什么是单点登录单点登录(Single Sign On),简称为 SSO...

2020-08-24 08:32:50 1579

转载 轻松理解JS中的面向对象,顺便搞懂prototype和__proto__

作者:蒋鹏飞链接:https://juejin.im/post/5e50e5b16fb9a07c9a1959af这篇文章主要讲一下JS中面向对象以及 __proto__,ptototyp...

2020-08-23 14:24:28 530

转载 前端模块化:CommonJS,AMD,CMD,ES6 学习

作者 | subwaydown地址 |https://juejin.im/post/6844903576309858318模块化的开发方式可以提高代码复用率,方便进行代码的管理。通常一...

2020-08-22 11:30:00 410

转载 (有趣问答)2019年nodejs凉了吗?凉到什么程度了?

今天在下于知乎上看到一个有趣的问题,叫「2019年nodejs凉了吗?凉到什么程度了?」问题挺耸人听闻的,但其实是一个很普适性的问题,对于大部分语言和框架的使用者来说都值得借鉴。这个问题...

2020-08-21 08:36:14 1254

原创 vue中8种组件通信方式, 值得收藏!

之前写了一篇关于vue面试总结的文章, 有不少网友提出组件之间通信方式还有很多, 这篇文章便是专门总结组件之间通信的vue是数据驱动视图更新的框架, 所以对于vue来说组件间的数据通信非常重要,那么组件之间如何进行数据通信的呢?首先我们需要知道在vue中组件之间存在什么样的关系, 才更容易理解他们的通信方式, 就好像过年回家,坐着一屋子的陌生人,相互之间怎么称呼,这时就需要先知道自己和他们...

2019-11-28 16:53:48 4310 3

原创 消息队列Rabbitmq,在Node.js中的应用

为什么写这篇文章 现在的面试要求越来越高了,打开看了看几个 BOSS 招聘 Node.js 全栈开发的,其中都有一条“了解 消息队列,并在项目中应用过”,呜呜呜 后端开发者应该都知道消息队列,但是一些前端开发者可能知道的并不多,但是你们可能好奇抢票,商品秒杀等功能是如何实现的,其实没有多么高大上,看了消息队列就知道了。 文章导图(你能学到)什么是消息队列“消息队列...

2019-11-26 09:05:34 7584 3

原创 Node.js中的执行顺序(微任务与事件循环)

提出问题在理解node.js的异步的时候有一些不懂的地方,使用node.js的开发者一定都知道它是单线程的,异步不阻塞且高并发的一门语言,但是node.js在实现异步的时候,两个异步任务开启了,是就是谁快就谁先完成这么简单,还是说异步任务最后也会有一个先后执行顺序?对于一个单线程的的异步语言它是怎么实现高并发的呢?好接下来我们就带着这两个问题来真正的理解node.js中的异步(微任务与事件循环...

2019-04-28 22:05:50 6375 2

原创 超详细的redis学习(1)-入门篇

什么是Redis基本概念redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库(非关系性数据库)。redis的优势速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)支持丰富数据类型,支持string,list,set,sorted set,hash支持事务,操作都是原子性...

2018-09-12 15:11:01 24878 2

原创 javascript之原型链详解

对象着手在谈原型链之前,先了解对象,万物皆对象。所有引用类型(函数,数组,对象)都拥有proto属性(隐式原型)所有函数拥有prototype属性(显式原型)(仅限函数)原型对象:拥有prototype属性的对象,在定义函数时就被创建prototype与proto两个概念prototype:此属性只有构造函数才有,它指向的是当前构造函数的原型对象。proto:此...

2018-09-07 17:06:41 653

原创 javascript中的闭包这一篇就够了

什么是闭包 维基百科中的概念在计算机科学中,闭包(也称词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一起,这个引用环境是一个存储该函数每个非局部变量(也叫自由变量)的表。闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,仍可访问非本地变量 学术上闭包是指在 JavaScript 中,内部函数总是可以访问其所在的外部函数中声明的参...

2018-09-06 18:08:48 1019

原创 LayoutParams基本使用

LayoutParams是什么?LayoutParams主要保存了一个View的布局参数,因此可以使用LayoutParams来改变布局参数从而达到View位置的效果,一般在自定义View的时候使用。LayoutParams怎么用?如果父控件是LinearLayout,需要使用LinearLayout.LayoutParams 代码如下:LinearLayout.La...

2018-08-05 23:17:31 9764

原创 回调地狱解决方案之Promise

Node.js异步控制之Promise为什么出现Promise在javascript开发过程中,代码是单线程执行的,同步操作,彼此之间不会等待,这可以说是它的优势,但是也有它的弊端,如一些网络操作,浏览器事件,文件等操作等,都必须异步执行,针对这些情况,起初的操作都是使用回调函数实现。实现方式如下(虚拟代码):function One(callback) { if ...

2018-07-29 15:56:07 1069

原创 async和await的讲解

async和await的讲解声明async函数的几个方法//普通的函数声明async function A(){}//声明一个函数表达式let A=async function(){}//async形式的箭头函数let A=async ()=>{}初识async和awaitasync与await实例应用,基础代码 控制器调用与serv...

2018-07-29 12:29:06 34726 1

原创 开发过程中的系统通知与推送的全面讲解

前言:在我们的软件开发中,系统通知和推送是必不可少的一部分,本篇文章将针对Android端和服务端分别讲解如何完整的实现一个系统通知与推送的功能 ,文章更注重逻辑、思想,不会讲那些基本极光sdk集成内容,如果需要请直接去极光推送官网查看文档。学前准备Android - 了解广播的基本使用,创建广播的几种方式 - ActivityManage和packpageManage的区别...

2018-07-24 10:22:23 5138

原创 解决Gradle:download特别慢或卡主不动的问题

解决Gradle:download特别慢或卡主不动的问题Gradle 在project创建的时候的时候会出现connect refused:connect或者卡在building gradle download https:等情况。 大多数的原因是因为我们Google对我们国内网络的限制: 解决办法:使用阿里云的国内镜像仓库地址,就可以快速的下载需要的文件修改项目根目录下的文件 build.gr

2017-06-10 21:14:34 20574 3

原创 Native与html5交互入门篇

Native与html5交互目前主流的移动端开发是混合开发Hybrid 先说一下什么是Hybrid APP,它指的是半原半Web的混合类App,需要下载安装,看上去类似Native App,但只有很少的UI Web View,它极力打造类似原生的App。 学习Native和html5交互,我们要学两点: 1、怎么把一个html5界面当作控件一样显示在界面中。 2、怎么和html5进行数据交互

2017-06-04 20:16:02 1322

转载 为什么语义 HTML 仍然重要?

搜索引擎、无障碍工具、人工智能代理以及基于任务的系统都依赖于结构化信号——有时是显式的,有时是启发式的。即使你的 JavaScript 代码出错,或者你的样式表无法加载,又或者你的布局在特殊情况下的屏幕上崩溃了——语义化的 HTML 意味着仍然有可用的内容。如果你的 DOM 很混乱,或者你的组件在树上上下下地泄漏样式和依赖关系,那么它就会适得其反——导致布局跳转、渲染错误或焦点状态损坏。如果您的内容被一连串非语义化的包装器缠住,或者容器继承了意外的样式或依赖项,那么容器的包容性就会变得不可靠。

2025-09-12 11:50:35 7

转载 tailwindcss 究竟比 unocss 快多少?

无论是前端社区里大大小小的 UI 组件库,还是各种脚手架、模版项目,AI 生成的代码,大多数都优先支持 tailwindcss。测试环境保持一致,依旧还是我的老伙计 **MacBook M1 Pro (2021)**(想换新的 M4 Pro了)这次测试,我还是沿用了去年的基准用例,不过加了更多场景。,几乎可以无缝接入整个生态,不用自己花太多心思去适配。所以,如果你项目需要稳定的生态支持、丰富的组件库,”要简洁很多,特别适合喜欢 HTML 语义化的人。= 灵活度第一,适合“想自己捏规则”的场景。

2025-09-11 11:50:47 19

转载 分享 9个 使用promises的技巧

如果输入数组中的任何 Promise 状态变为 fulfilled,则返回的实例将变为 fulfilled 状态并返回第一个 fulfilled 的 Promise 的值。如果全部被拒绝,那么最终的状态就为拒绝。此代码不断创建和解析 Promises,实现一个简单的 FIFO 队列,以确保只有一个任务可以访问共享资源。在多线程环境中,可以使用 Promises 实现简单的异步锁,从而确保一次只有一个任务可以访问共享资源。执行不会失败,它返回一个与输入数组中每个 Promise 实例的状态相对应的数组。

2025-09-09 12:04:55 26

转载 WebRTC实现网页直播

WebRTC(Web 实时通信)是一种使 Web 应用程序和站点能够捕获和选择性地流式传输音频或视频媒体,以及在浏览器之间交换任意数据的而无需中间件的技术。WebRTC 的 “点对点” 只限于音视频流,而双方建立这个“点对点”通道需要先互相“介绍自己”,这个介绍过程就是 信令(Signaling),而 信令服务器 就是“介绍人”。SDP是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等。B端(观众),点到点直连。注1:RTMP实时消息协议,一种将视频/音频数据从主播端推送到服务器的协议。

2025-09-08 11:48:52 26

转载 使用 Cursor 不会这个超牛 MCP 还没用过吧!

每个库的文档页面会显示 “总令牌数”“代码片段数量”“最后更新时间”,并按 “主题” 分类展示代码片段(如 React 的 “ Hooks”“Routing” 主题),每个片段包含标题、描述、来源链接、编程语言,便于精准复制;生成新库的代码却无法运行、指定用最新版本 API 却得到旧版实现?其实,问题的根源在于大模型的 “知识截止日期”,而解决这一痛点的关键,就藏在。:在顶部搜索框输入库名(如 “Next.js”“FastAPI”),即可找到对应库的最新文档,支持按 “更新时间”“代码片段数量” 筛选;

2025-09-05 11:50:18 70

转载 轻松在网页中集成专业思维导图功能 - Mind Elixir

如果你在使用过程中遇到问题,或者有更好的想法和建议,可以在评论区分享,也欢迎在。在你的项目里用上思维导图之后,最常见的需求便是监听事件了,你需要监听各种节点操作,然后对用户操作做出响应。无论是构建知识管理平台、在线教育网站,还是协作工具,集成思维导图功能都能显著提升用户体验,让复杂信息的展示和交互变得更加直观高效。中,你可以用思维导图来展示文章的知识结构、制作交互式的学习笔记,这样的功能不仅能让内容更加生动有趣,还能显著提升博客的专业度。之后,如果你发现展开收缩的按钮位置不对,可以通过 CSS 进行微调。

2025-09-04 12:00:01 35

转载 为什么 Chrome DevTools 不够用 —— 分析终端用户性能

浏览器中的所有工作都必须在 16 毫秒内完成,才能使页面体验达到每秒 60 帧,这意味着你的应用代码要和垃圾回收、浏览器的渲染流程(渲染 / 布局、绘制、合成)争夺这 16 毫秒的时间。在 Palette,我们的一些大客户(用户数超过 1 亿)启用该功能后,也没有报告性能下降的问题。因为在生产环境中看不到 JavaScript 的真实执行情况,Facebook 的一个团队在 2021 年 9 月决定尝试解决这个问题,开展了一次在生产环境中分析 JavaScript 执行性能的实验。

2025-09-03 11:54:15 48

转载 大模型应用中,前端绕不开的 SSE

开头的行用于指定消息的 ID,用于区分不同的消息。客户端可以通过 eventSource.lastEventId 获取最后收到的消息 ID,当需要断线重连时,请求会自动发送 Last-Event-ID 头,服务器可以用它来续传消息。这个库,它是一个完整的实现,可以自动处理断线重连,支持自定义请求头等等,其原理和我们刚刚的示例代码差别不大。的自动重连机制实现的,这是一个非常简单的机制,在连接错误断开的情况下,浏览器会自动重新发起请求。开头的行会被当作注释,服务器可以用它发送调试信息,但客户端会忽略这些行。

2025-09-01 11:50:45 53

转载 你的H5页面在折叠屏上适配了吗?

通过优化现有的flexible.js+postcss-px-to-rem方案,成功兼容了折叠屏,提升了用户体验。通过flexible.js + postcss-px-to-rem插件将设计稿中的px单位转换为rem单位,基于视口宽度进行动态计算;:postcss-px-to-rem在代码编译阶段处理,最终生成的CSS文件中已经是rem单位,无运行时计算开销。目的是展开状态后,字体大小和折叠状态下保持一致(非放大),首先需要了解折叠状态时,手机的屏幕宽度数据。可减少HTTP请求,降低代码复杂度和特殊处理。

2025-08-28 11:51:45 78

转载 纯前端实现图片伪3D视差效果

我们可借助计算着色器强大的并行计算能力,对复杂的 3D 计算任务进行高效处理,进一步提升计算性能,为网页端 3D 交互开辟更多可能性,打造更加流畅、逼真的 3D 交互场景。获取到当前深度图坐标的深度信息,由于颜色越浅数值越大,要对深度值进行反转,比对此时光线的z轴是否大于深度的反转值,如果满足条件则挑出循环,取此时光线坐标图片的颜色。即偏移值大于深度值,但二者的差值大于阈值的时候,回退一步光线,并将步进值再除以2,可以显著提升采样的精度。在这样的背景下,利用2D图片实现伪3D的效果,就展现出独特的价值。

2025-08-27 11:01:58 50

转载 还在用html2canvas?介绍一个比它快100倍的截图神器!

但问题来了——市面上的截图工具,比如 html2canvas,虽然用得多,却有一个致命缺陷:慢!普通截图动辄 1 秒以上,大一点的 DOM,甚至能直接卡到怀疑人生,用户体验一言难尽。开发中生成海报并保存到, 是非常常见的需求,以前使用html2canvas,也要写不少代码, 还要处理图片失真等问题, 使用snapDOM,真的一行代码能搞定。原理: 通过遍历 DOM,把每个节点的样式(宽高、字体、背景、阴影、图片等)计算出来,然后在。复杂 DOM 时计算量极大,比如渐变、阴影、字体渲染都会消耗 CPU。

2025-08-26 11:50:49 55

转载 如何使用Cursor同时开发多项目?

高效组织复杂项目,并且可以使用完整的上下文去开发全栈项目,大大提升跨项目开发效率。在日常开发中,我们经常需要同时处理多个关联项目(如前端、后端、公共组件库),在不同窗口间切换不仅低效,上下文不完善,还容易出错。(多个工作区)功能,能让你在一个窗口中高效管理多个项目。:在资源管理器中快速区分项目功能、版本或环境,尤其适合微服务架构中包含多个相似名称项目的场景。文件提交到团队共享仓库(可单独创建一个配置仓库,或放在主项目仓库中),查看搜索结果中是否包含无需显示的文件,再针对性添加排除规则。

2025-08-25 11:50:05 338

转载 面试官灵魂拷问:接口在 Postman 测试很快,页面加载咋就慢?

排查接口在页面加载慢的问题,可以先看 TTFB 和 Download 阶段:TTFB 高多半是后端或网络瓶颈,Download 高则可能是响应体过大或压缩缺失。在跨域请求时,如果带了自定义请求头或者使用了不属于“简单请求”的 Content-Type,就会触发 预检请求(OPTIONS),额外增加一次 RTT。总结经验:Postman 调用接口快而页面加载慢,常见原因是浏览器额外开销,例如 CORS 预检、Cookie 过大、JS 计算和第三方脚本渲染,这类情况占大多数。接口本身的设计也直接影响性能。

2025-08-21 11:52:23 73

转载 一个有趣的拼音神器:pinyin-match

在长文档、知识库、甚至整个应用里,Ctrl + F 的搜索功能也能支持拼音。中文转拼音:把候选中文转换成拼音(考虑多音字,例如“曾”可以是 ceng 也可以是 zeng)再也不用担心输不出生僻字。只要几行代码,你的搜索功能就能秒升级 —— 从“只能搜中文”,变成“中拼混合全能搜”。平时微信用得比较多的小伙伴, 你是否发现微信里使用拼音是可以搜索到对应的中文昵称的。的模糊搜索,支持全拼、缩写、混合输入,还能定位匹配位置,方便做高亮显示。这样一来,哪怕用户输入的拼音不完整、夹杂缩写,也能很聪明地匹配成功。

2025-08-20 11:50:39 69

转载 面试官:如何减少页面卡顿?

通过把方法传递给_setTimeout_,也就等同于重新创建了一个新的任务,延迟了回调的执行,而且使用该方法,_即便是将delay时间设定成0,也是有效的_。使用以上一个或多个方法,就能够将应用中的任务进行管理,根据用户需要调整优先级,同时能保证相对不那么重要的工作得以继续执行,这样给创造更好的用户体验,网站响应更快,使用更令人愉悦。使用scheduler.yield的好处是不中断,也就意味着如果是在一连串任务中yield,那么从yield的时间点开始,其他编排好的任务的执行会继续。

2025-08-19 11:50:11 39

转载 分享一款 AI 自动生成流程图的工具

你只需要输入一段自然语言(如技术说明、操作流程、文章内容),它就能从中提取出关键步骤,自动绘制出结构化的流程图。传统的方式不仅费时费力,还容易遗漏步骤。每种风格都可以一键切换,并支持导出为图片或 SVG,用于写文档、做 PPT、嵌入网页等场景。Napkin AI 就像一个智能的图形小助手,你负责写字,它负责帮你画图。,只需要贴上一段文字,它就能自动帮你生成逻辑清晰、风格美观的流程图!5. 你可以继续编辑、拖拽、删除,或者切换不同的流程图风格。从文字自动生成流程图,只是 AI + 文档 的一个缩影。

2025-08-18 14:00:24 154

转载 Node.js中构建可用的 MCP 服务器:从入门到实战

MCP 登场:一座通用桥梁 MCP 提供了一个单一的协议(基于 HTTP 或 SSE 的 JSON-RPC 2.0),任何 LLM 客户端都可以使用它来调用你服务器的工具和资源。MCP,全称 Model Context Protocol,是一套基于 JSON-RPC 2.0 的统一协议,用于让 LLM 和外部系统交互。现在我们将构建一个完整的 Express 服务器,通过可流式 HTTP 暴露我们的 MCP 端点。然而,截至 2025 年中,MCP 的高级 SDK 不会将原始 HTTP 注入到高级的。

2025-08-15 14:03:56 143

原创 Vue3 开发全套组合拳,神器一次看全!

它延续了 Element UI 在国内的高人气和完善的桌面端组件体系,提供了丰富的基础组件和业务组件,适合中后台管理系统的快速搭建。文档设计简洁直观,组件演示与代码示例并排展示,便于查阅与使用。electron-vite 帮你把 Vite 的极速构建、热更新体验带到桌面端开发,同时保留 Electron 的原生 API 能力,让你既能写前端页面,也能调用系统功能。它提供了丰富的高质量 UI 组件,内置响应式布局系统、国际化支持,以及完善的 TypeScript 类型定义,非常适合构建中大型企业级应用。

2025-08-14 17:35:24 1031

原创 3 条规则,带你吃透 TypeScript 高级类型

else,你就能理解 TypeScript 的条件类型。当条件类型的参数是裸类型(naked type)时,TypeScript 会对联合类型逐个分发处理。不少小伙伴反馈说,学习了很多Typescript 高级类型, 但是看到一堆的尖括号、问号、冒号、「我不知道这个类型具体是什么,但 TypeScript 你帮我推断出来,并把它存到一个变量里。如果你也曾被 TypeScript 高级类型吓到,希望这篇文章能帮你跨过那道坎。规则 1:条件类型 = 类型层面的 if…一个很典型的应用是过滤联合类型,过滤掉。

2025-08-13 14:27:40 450

原创 只改了模块结构,我让 NestJS API 延迟降低了 40%

去掉循环依赖后,冷启动速度直接提升 **40%**,接口延迟肉眼可见地下降。直到有一天,我发现真正拖慢我项目的,并不是这些“显眼的地方”,而是一个。边界更清晰、导入更简单,自然就不会出现“互相依赖”的死循环。如果你也在优化 NestJS,不妨看看你的模块导入关系。有时候,真正的性能瓶颈,就藏在那些你“习惯了”的结构里。日志里没报错,性能监控也没大问题,但就是“不顺”。:架构优化,不只是让代码更干净,还能让性能飞起来。这种临时补丁,但问题并没有真正解决,只是。如果你经常用它,八成是你的模块设计有问题。

2025-08-12 11:45:36 433

转载 模块联邦(Module Federation)新的微前端方案?

Web Components是一种强大的前端技术,它允许开发者创建封装好的、可重用的自定义元素,这些元素可以在任何HTML文档中使用,就像标准的HTML元素一样。表示当前应用的名字,仅仅是个名字而已,未发现其他作用,在其他的博客中看到有说当消费者引用当前应用暴露的模块时,需要在路径前加上这个名字,但我在实际测试中发现,当。它允许多个独立构建的应用程序。在实际应用中,这两者可以结合使用,利用模块联邦在微前端架构中实现跨应用的模块共享,比如组件库的共享,相比使用。是的,MF 可以作为微前端的另一种实现思路。

2025-08-10 21:18:16 83

转载 告别 window.open,拥抱全新浮窗体验!

确实,在页面内部使用 Modal 组件(例如 antd、Element Plus 等)更适合处理输入、表单、提示等页面交互内容,代码复用度也高。深入了解 Document Picture-in-Picture API,并对比 Modal 的最佳使用场景。当前只能通过字符串方式注入内容,暂不支持直接挂载 Vue/React 组件,但可以用。但现在,一个更现代的 API 出现了——✅ 从技术上说,它本质上是一个轻量、独立的浏览器子窗口,但有专门的样式控制权。,一旦用户切换了标签页、最小化了窗口,就无法再查看。

2025-08-07 14:02:53 87

原创 写稳大型项目的 JS/TS 技巧(下)—— 覆盖并发、缓存等

不会泄漏内存:如果一个对象在程序中没有被任何地方引用,GC 会自动回收它,并通知 FinalizationRegistry 清理对应缓存;非常适合缓存大型对象:比如图表数据、用户行为分析、临时计算结果等,不用担心它们“住进”内存后就再也不走了。你可能已经意识到,这些技巧的真正价值,并不只是“让代码跑得更快”,而是 让代码更稳、更可控、更维护友好。在日常开发中,我们经常会写一些“优雅”的缓存逻辑,但久而久之,这些看似优雅的代码—— 但却让。这样处理后,不论用户上传多少文件,你的请求都有序、可控、不慌不忙。

2025-08-06 12:16:22 674

原创 停止写屎山代码!教你10个JS/TS绝技

下一篇,我们将继续分享剩下的 4 个实战技巧,包括缓存自动清理、并发控制、Promise 可观测状态等内容。免篇幅过长,本期我们先分享前 6 个实战技巧,剩下的 4 个将在下一篇继续带来,记得关注不迷路👇。如果你正在从中级开发者迈向高级工程师,这些技巧不是可选项,而是必须掌握的工具。直接这么请求,多来几个这样的请求,不仅服务器要裂开了,前端内存也要撑爆了。之前看到过这样的代码处理二进制,真的想问一句,你是认真的吗?如果你点头如捣蒜,这篇文章,就是为你写的。千万注意, 别使用字符串拼接处理二进制。

2025-08-05 11:52:06 364

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除