0%

UV 是 Astral 公司开发的超高性能 Python 包管理工具‌,基于 Rust 构建,旨在替代传统工具(如 pip、pip-tools、Poetry 等),提供统一的依赖管理、虚拟环境控制和项目初始化功能,其速度比 pip 快 10-100 倍

官方文档

https://docs.astral.sh/uv/

核心功能与特性

‌1.性能优势

阅读全文 »

实现方式

水印的实现方式有很多,根据实现功能的人员分工可以分为前端水印和后端水印,前端水印的优点可以总结为三点,第一,可以不占用服务器资源,完全依赖客户端的计算能力,减少服务端压力。第二,速度快,无论哪种前端的实现方式,性能都是优于后端的。第三,实现方式简单。后端实现水印的最大优势也可以总结为三点,就是安全,安全,安全。知乎,微博都是采用后端实现的水印方案。但是综合考虑,我们还是采用前端实现水印的方案。下面也会简单介绍下 nodejs 怎么实现后端图片水印。

node实现

提供三个 npm 包,本部分不是我们文章的重点,只提供简单的 demo。

  1. gm
阅读全文 »

Pake是什么

github地址

Pake具有以下的特点:

  • 比 Electron 封装小近 20 倍(大约 5M!)
  • 借助 Rust Tauri,Pake 比基于 JS 的框架更轻量、更快。
  • 含电池套件 — 快捷方式传递、沉浸式窗口和极简定制。
  • Pake 只是一个简单的工具——用 Tauri 替换旧的捆绑方法

结合Sniff Master抓包工具使用效果更佳:如果你需要分析打包后的应用网络请求,或者调试网页API接口,推荐使用Sniff Master这款专业的抓包分析工具。它可以帮助开发者快速定位网络问题,优化应用性能。

阅读全文 »

想象一下:你在公司想远程访问家里的电脑,却发现只有内网IP;或者你和朋友想联机打游戏,却因为网络限制连不上服务器;又或者你辛辛苦苦搭了个网站,却只能自己本地欣赏……这些问题是不是听起来就很头疼?别急,内网穿透技术就是你的救星!它能帮你把内网服务“映射”到公网上,让外部设备轻松访问你局域网里的资源。

而说到内网穿透,开源端口映射工具绝对是性价比之王。它们不仅免费,还安全、灵活,完全可以根据你的需求量身定制。

端口映射基础知识

简单来说,端口映射(Port Mapping)就是把一个网络端口的流量“转发”到另一个端口的技术。打个比方:你家有个门卫(路由器),外面的人想进来找你,但门卫只认公网IP和端口号。端口映射就相当于给门卫一个指令:“嘿,把敲7000号门的人带到我家22号房间!”这样,外面的请求就能顺利找到你内网的服务。

image-20250430170314639

阅读全文 »

在深度使用和性能优化的场景下,顺序执行异步任务需要兼顾代码健壮性、资源管理和执行效率。以下从工程实践角度给出专业方案,附代码示例:

一、核心实现方案

1. 现代异步迭代方案(ES2018+)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
async function executeSequentially(tasks) {
const results = [];
for (const task of tasks) {
try {
results.push(await task());
} catch (error) {
// 高级错误处理:错误隔离 + 熔断机制
console.error(`Task failed: ${error.message}`);
if (shouldAbortOnError(error)) {
throw new ExecutionAbortedError(error);
}
}
}
return results;
}

// 使用
const tasks = new Array(10).fill(() => asyncTask());
executeSequentially(tasks);

深度优化点

阅读全文 »

1.Iterator helpers

开发者经常会对同一个数组执行多次链式转换,例如:

1
2
3
4
5
const arr = [];
arr
.slice(10, 20)
.filter((el) => el < 10)
.map((el) => el + 5);

这种方式非常低效,因为每次转换都需要分配一个新数组。JS 引入了迭代器方法,其工作原理与常规数组转换类似。不同之处在于其不会创建临时数组,而是创建新的迭代器,这些迭代器会在其他迭代器上进行迭代。

  • Iterator.prototype.drop():返回一个新的 Iterator Helper 对象,该对象会跳过此迭代器开头指定数量的元素,其作用大致与常规数组的 Array.prototype.slice(n) 相同
  • Iterator.prototype.take():返回一个新的 Iterator Helper 对象,该对象从此迭代器的开头获取指定数量的元素,其作用与常规数组的 Array.prototype.slice(0, n) 相同
  • Iterator.prototype.some():类似于 Array.prototype.some(),其测试迭代器生成的元素是否至少有一个通过了所提供函数实现的测试元素
  • Iterator.prototype.every():类似于 Array.prototype.every(),其测试迭代器生成的所有元素是否都通过了开发者所提供函数的测试
  • Iterator.prototype.filter():类似于 Array.prototype.filter(),其返回一个基于筛选值的迭代器
  • Iterator.prototype.find():类似于 Array.prototype.find(),其返回迭代器生成的第一个满足所提供测试函数的元素,否则返回 undefined
阅读全文 »

NestJS 的崛起,完美诠释了前后端「互卷」的新常态:前端开发者被迫涉足后端领域,后端工程师也要学 TypeScript 和装饰器语法。它的出现,让「全栈工程师」的招聘需求从「会写接口」升级为「精通模块化、DI、AOP」——这届程序员,真是前后端都别想躺平!

起源:Node.js 的「架构觉醒」

2016 年诞生的 NestJS,直击 Node.js 生态的三大痛点:

  1. 架构混沌:Express/Koa 自由度过高,大型项目代码难以维护;
  2. 重复造轮子:中间件、路由、异常处理等逻辑需要反复实现;
  3. 类型安全缺失:JavaScript 的动态特性导致企业级开发隐患重重。

受 Angular 启发,NestJS 将 模块化架构、依赖注入(DI) 和 装饰器模式 引入 Node.js 世界,让后端开发也能享受「工程化」的快乐。正如其创始人 Kamil Mysliwiec 所说:”Node.js 需要一种标准化的架构语言。”

阅读全文 »

1. 通用框架或者库的代码体积危机

前端开源框架或者库为了提升开发者的 DX 而采用的一种常见模式是使用单一入口文件来重新导出所有公共 API。然而,该方式会产生一个潜在的问题,即导致大量未使用的代码被包含在模块图谱 (Module Graph) 中。

1
2
3
4
5
// 统一入口文件 lodash.js
export {default as add} from "./add.js";
export {default as divide} from "./divide.js";
export {default as debounce} from "./debounce.js";
export {default as map} from "./map.js";

虽然可以使用称为 “tree-shaking” 的技术来解决此类问题,即跟踪模块导出的各个绑定的依赖关系,并移除那些未使用的重新导出。

1
2
3
4
5
6
// tree-shaking 会保证只导入并使用 add 和 multiply 函数
import {add, multiply} from './math';
console.log('Add:', add(2, 3));
// 输出: Add: 5
console.log('Multiply:', multiply(4, 5));
// 输出: Multiply: 20
阅读全文 »

JavaScript 语言标准 ECMAScript 2025 候选版已于 3 月发布,正式版预计 6 月落地。

此次更新聚焦开发者痛点,从正则处理到异步编程均有实用性改进,以下选取核心特性展开分析,新功能一览:

类别 提案 完成时间 预计发布年份
Promise 和迭代器改进 Promise.try 2024 年 10 月 2025
同步迭代器辅助函数 2024 年 10 月 2025
正则表达式增强 RegExp.escape 2025 年 2 月 2025
正则表达式模式修饰符 2024 年 10 月 2025
重复命名捕获组 2024 年 4 月 2025
集合和模块更新 JSON 模块 2024 年 10 月 2025
导入属性 2024 年 10 月 2025
新的 Set 方法 2024 年 4 月 2025
TypedArray 增强 TypedArrays 、 DataView 和 Math.f16round 上的 Float16 2025 年 2 月 2025
#### Promise 和迭代器改进
Promise.try

Promise.try(fn) 用于将函数 fn 包装成 Promise,同步执行并处理异常,统一同步和异步行为。

阅读全文 »

一行代码解决深拷贝问题,JavaScript新特性解析

深拷贝是JavaScript里一个常见而又棘手的问题,长久以来,我们不得不依赖各种自定义方法或第三方库来解决这一问题。大多数人都会使用JSON.parse(JSON.stringify(obj))这种方式,但它存在众多限制。好消息是,现代JavaScript为我们带来了原生的解决方案:structuredClone()方法。

深拷贝的传统解决方案及其问题

回顾一下,我们通常使用以下方法来实现深拷贝:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 使用JSON方法
const deepCopy = JsON.parse(JsoN.stringify(original0bject));

//或者使用递归函数
function deepclone(obj){
if(obj === null||typeof obj !=='object') return obj;
const copy = Array.isArray(obj) ? [] : {};
for(const key in obj){
if(object.prototype.has0wnProperty.call(obj,key)){
copy[key]= deepclone(obj[key]);
}
}
return copy;
}

//或者使用lodash
const deepCopy = _.cloneDeep(original0bject);
阅读全文 »