博客

  • 印刷英语的预测与熵 —— 香农经典论文全译

    印刷英语的预测与熵 —— 香农经典论文全译

    原文:Claude E. Shannon, “Prediction and Entropy of Printed English”, Bell System Technical Journal, Vol. 30, pp. 50–64, January 1951.

    1. 引言

    语言——尤其是印刷英语——在通信理论中占有核心地位。语音、电视和一般通信系统所传输的信息,最终都可以用语言来描述。因此,了解语言的信息特性对于通信理论至关重要。

    本文的目标是估算印刷英语的(entropy)和冗余度(redundancy)。熵度量了每个字母所携带的平均信息量,而冗余度则衡量了语言中”多余”部分的比例——即为了传达给定信息量所需要的额外字母数。

    这个问题可以通过多种方式加以探讨。我们可以将英语视为一个统计过程,通过考察其 n-gram 频率(单字母、双字母、三字母等统计)来估算其熵。或者,我们可以通过人类受试者来预测文本,利用他们掌握的语言统计知识。

    2. 基于单字母频率的熵

    如果英语的 26 个字母加空格(共 27 个字符)是独立且等概率出现的,那么每个字符将携带 log₂ 27 ≈ 4.76 bits 的信息量。然而,英语各字母的出现频率远非均匀分布。

    根据实际印刷英语的单字母频率统计,Shannon 计算出基于独立但不等概率字母的一阶熵近似为:

    H₁ ≈ 4.14 bits/字母

    其中最常见的字母 E 频率约为 13%,而 Z 等罕见字母频率约为 0.1%。这个数字虽然低于均匀分布的 4.76 bits,但仍是熵的上界,因为字母之间的依赖性尚未被考虑。

    3. 基于 digram 和 trigram 统计的熵

    英语不是由独立字母组成的。某些字母对(digrams)出现频率极高(如 TH、HE、AN、IN),而其他组合几乎不出现。这意味着给定前一个字母后,下一个字母的不确定性大大降低。

    Shannon 借助已有的大规模双字母(digram)频率统计表,计算出条件熵:

    H₂ ≈ 3.56 bits/字母

    使用三字母组合(trigram)频率进一步降低:

    H₃ ≈ 3.3 bits/字母

    这些数字给出了熵的逐步收紧的上界。随着考虑的上下文长度增加,熵值应当继续下降,逐渐逼近真实熵。

    4. 基于单词频率的估计

    Shannon 也探讨了基于单词统计的熵估算方法。如果将英语单词(而非字母)视为基本符号,同样可以通过单词频率分布来估算熵。利用单词频率表,他得到了与字母级分析一致的结果。

    单词频率也遵循 Zipf 定律——最常见的 “the” 出现频率远高于罕用词。基于单词的估计进一步确认了英语高冗余度的特性。

    5. 预测实验

    这是本文最具创造性的部分。Shannon 设计了人类预测实验来直接测量英语的熵。

    实验方法如下:

    1. 给受试者一段未知的英语文本
    2. 受试者逐个猜测下一个字母是什么
    3. 如果猜错,告知正确答案,然后继续猜下一个字母
    4. 记录每个字母猜测所需的尝试次数

    关键洞察:受试者在猜测时所犯的错误数,直接反映了字母的不确定性(即局部熵)。如果字母完全可以预测(如 QU 后的字母几乎总是元音),受试者会一次猜中。如果字母高度不确定,则需要多次尝试。

    Shannon 通过数理推导证明,受试者所需猜测次数与熵之间存在数学关系。一种简单的情景是:如果受试者知道真实概率分布并以最优策略猜测,则所需尝试次数为:

    平均尝试次数 ≈ 2^(H) − 1

    6. 预测实验的结果

    通过多次实验,Shannon 得到了印刷英语的熵估计:

    H ≈ 0.6 ~ 1.3 bits/字母

    最优估计值约为:

    H ≈ 1.0 bit/字母

    与均匀分布的 4.76 bits/字母相比,这意味着:

    冗余度 ≈ (4.76 − 1.0) / 4.76 ≈ 75%

    也就是说,印刷英语中大约 75% 的字母是”多余”的——它们并非传递信息所必须,而是由语言的结构和统计规律强加的。理论上,我们可以将英语文本压缩到原大小的四分之一左右,而不损失任何信息。

    7. 上下界

    Shannon 将各种估计方法的结果总结为一组不断收紧的上下界:

    方法 熵估计 (bits/字母) 说明
    均匀分布 4.76 理论最大值
    单字母频率 4.14 上界 (忽略依赖)
    Digram 频率 3.56 上界 (2-gram)
    Trigram 频率 3.3 上界 (3-gram)
    单词频率 ~1.6–2.1 进一步收紧
    人类预测实验 0.6–1.3 最优估计

    8. 讨论与意义

    这项研究具有深远的影响:

    • 数据压缩:75% 的冗余度表明,英语文本理论上的最大压缩比约为 4:1。这为后来的 Huffman 编码、Lempel-Ziv 压缩等算法提供了理论基础。
    • 通信效率:冗余度解释了为什么我们可以在嘈杂的信道中阅读和理解含有拼写错误或遗漏字母的文本——冗余提供了纠错能力。
    • 密码学:语言的冗余是密码分析的核心突破口。高冗余度的语言在加密后仍然保留了统计特征,为破解提供了线索。
    • 自然语言处理:对语言统计规律的系统量化,开启了用概率方法处理语言的范式。

    Shannon 在这篇简短而精美的论文中,将一个看似”无法量化”的问题——语言的预测性和不确定性——转化为可精确测量的科学量,奠定了现代信息论与语言统计学的基石。

    9. 结论

    Shannon 总结道:印刷英语的熵约为 1 bit/字符,冗余度约为 75%。这个数字至今仍在教科书中被广泛引用。论文所开创的人类预测实验方法,也成为信息论中一个经典的思想实验——将不可见的信息量,转化为可见的猜测行为。


    本文根据 Claude E. Shannon 1951 年经典论文 “Prediction and Entropy of Printed English” 翻译整理。

    翻译发布:blog.fennubird.cn | 原文出处:Bell System Technical Journal, Vol. 30, pp. 50–64, 1951

  • Nvidia Vera 芯片:黄仁勋不想让你忽视的 2000 亿美元赌注

    Nvidia Vera 芯片:黄仁勋不想让你忽视的 2000 亿美元赌注

    Nvidia Vera 芯片很少在财报超出预期时成为头条新闻,但它本应如此。周三,Nvidia 公布第一季度营收 816.2 亿美元,高于分析师预期的 788.6 亿美元,并指引第二季度营收为 910 亿美元——远高于华尔街 868.4 亿美元的预测——这些数字一如既往地主宰了整个场面。

    但藏在 CEO 黄仁勋与分析师的电话会议中的,是比又一次季度超预期更具战略意义的东西。黄仁勋告诉分析师,Nvidia 全新的 Vera 中央处理器打开了一个价值 2000 亿美元的市场,而这个市场完全不在该公司此前预测的、2025 至 2027 年间 Blackwell 和 Rubin AI GPU 产品线所能触及的 1 万亿美元市场之内。

    他预计 Vera 芯片的收入在本财年结束前将达到 200 亿美元。「我预计(Vera)将成为第二大」销售额贡献者,黄仁勋在电话会议中表示。

    这不是一个脚注,而是一条第二战线。

    Vera 芯片与推理业务转型

    Nvidia 需要开辟第二战线的原因很简单:它最大的客户正在建立自己的战线。谷歌、亚马逊和微软——预计今年将合计向 AI 基础设施投入超过 7000 亿美元,较 2025 年的约 4000 亿美元大幅增长——同时也在为运行 AI 模型注入资金开发定制芯片。英特尔和 AMD 也在将 CPU 宣传为推理工作负载的可靠选择。

    芯片行业的叙事已经从「谁能训练出最大的模型」转向了「谁能以最便宜、最快的方式提供服务」。推理正是 Nvidia GPU 统治地位最脆弱的地方。训练大型模型仍然是 Nvidia 的稳固地盘,但推理——大规模、实时地生成答案——正日益成为谷歌 TPU 系列、亚马逊 Trainium 等定制芯片发力的领域。

    Nvidia 的答案就是 Vera。这款芯片部分采用了来自 Groq 的技术——Groq 是一家专注于推理的初创公司,Nvidia 在一笔据报道价值约 170 亿美元的授权交易中获得了其技术——正是瞄准了这类工作负载。完整的 Vera Rubin 平台将 Vera CPU 与 Rubin GPU 结合在一起,计划于今年晚些时候推出。

    供应已成为制约因素

    黄仁勋坦率地指出了一个难题:供应。「我的判断是,在 Vera Rubin 整个生命周期内,我们都将面临供应紧张的局面,」他在电话会议中说道。对于一款 Nvidia 定位为主要增长支柱的产品来说,这是一个意味深长的表态。为了抢在供应中断之前做好准备,Nvidia 正在供应链上投入巨资。该公司披露,其第一季度供应承诺已升至 1190 亿美元,高于上一季度的 952 亿美元,这一显著增长既反映了对需求的信心,也反映出对全球内存芯片紧缺的忧虑。

    Nvidia 还宣布了一项 800 亿美元的股票回购计划,并将季度现金股息从每股 1 美分提高至 25 美分,这些举措传递出财务方面的信心,尽管黄仁勋同时警示了供应收紧的风险。

    投资者关心的问题

    尽管业绩超预期,Nvidia 股价在财报发布后的盘后交易中仍下跌了 1.6%。eMarketer 分析师 Jacob Bourne 概括了市场情绪:「Nvidia 又一次实现超预期,但到了此刻,这基本上已经被市场定价计入,因为它已经连续一个又一个季度超预期。悬而未决的问题是,它能否说服投资者 AI 建设热潮在 2027 和 2028 年仍具有持续性,尤其是在叙事转向推理工作负载以及来自谷歌、亚马逊、AMD 和英特尔等竞争对手的芯片挑战之际。」

    黄仁勋用他自己的数据进行了回应。他指出,一个日益增长的 AI 专属云客户细分市场,其支出现已与超大规模云服务商大致持平,但季度环比增长速度更快。「我们的增长速度应该会超过超大规模云服务商的资本支出增速,」他说道。

    Vera 芯片是这一论点的核心。至于供应链是否配合,则完全是另一个问题了。

    (图片来源:Nvidia Newsroom

    原文:Nvidia’s Vera chip is the US$200 billion bet Jensen Huang doesn’t want you to overlook

  • MySQL 8.4 忘记root密码怎么办

    MySQL 8.4 忘记root密码怎么办

    一次真实的排错记录:从各种报错到最终解决,涵盖 MySQL 8.0 与旧版本的核心差异

    前言

    如果你还在使用 UPDATE user SET password=PASSWORD('123456')... 这种老掉牙的命令来修改 MySQL 8.0 的密码,那这篇文章就是为你准备的。

    本文记录了我在 MySQL 8.4.8 上忘记密码后的完整排错过程,遇到的每一个错误都有对应的解决方案。

    环境说明

    • MySQL 版本:8.4.8 (Linux/Ubuntu)
    • 操作系统:Ubuntu 24.04+
    • 问题:root 密码遗忘,且错误地配置了 mysql_native_password 插件

    常见错误速查表

    错误信息原因解决方案
    ERROR 1064...syntax...PASSWORD('123456')MySQL 8 已移除 PASSWORD() 函数使用 ALTER USER 语法
    ERROR 1396 (HY000): Operation ALTER USER failed--skip-grant-tables 模式下未刷新权限先执行 FLUSH PRIVILEGES;
    ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded用户被错误配置为使用未加载的认证插件修改 plugin 为 caching_sha2_password
    ERROR 1819 (HY000): Your password does not satisfy...密码强度不符合 MySQL 8 的策略使用强密码或临时调低策略

    完整解决步骤

    第一步:停止 MySQL 服务

    sudo systemctl stop mysql

    第二步:以跳过权限表模式启动

    找到你的mysqld配置文件 一般在/etc/mysql/下面
    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    
    # mysqld.conf
    [mysqld]
    skip-grant-tables 
    
    # 启动服务
    sudo systemctl start mysql

    第三步:免密码登录

    # 输入任意密码
    mysql -uroot -p

    第四步:修复用户认证插件并清空密码

    -- 必须最先执行,否则无法修改用户表
    FLUSH PRIVILEGES;
    
    -- 查看当前 root 用户状态
    SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User='root';
    -- 我这里错误的修改了插件所以需要这样执行
    -- 修复:将 plugin 改为 MySQL 8 默认的 caching_sha2_password,并清空密码
    UPDATE mysql.user SET plugin='caching_sha2_password', authentication_string='' WHERE User='root';
    
    -- 一般执行
    UPDATE mysql.user SET authentication_string='' WHERE User='root'
    
    -- 再次刷新权限
    FLUSH PRIVILEGES;
    
    -- 退出
    EXIT;

    第五步:正常重启 MySQL

    sudo systemctl start mysql

    第六步:用空密码登录并设置新密码

    mysql -uroot -p
    -- 设置新密码(MySQL 8 会自动使用 caching_sha2_password)
    -- 注意你的root的host是不是`localhost`我的是`%`
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    
    -- 退出
    EXIT;

    第七步:还原配置文件并登录

    # 去掉skip-grant-tables后
    sudo systemctl restart mysql
    
    mysql -uroot -p
  • TypeScript原生版来了!Go语言重构,性能提升10倍

    TypeScript原生版来了!Go语言重构,性能提升10倍

    微软近日发布了 TypeScript 原生预览版。这个版本用 Go 语言重新写了编译器。性能提升了 10 倍!

    这不是简单的优化。这是一次彻底的重构。微软团队把整个 TypeScript 编译器都用 Go 重写了。

    什么是 TypeScript 原生版?

    TypeScript 原生版是微软的新项目。他们把原来用 JavaScript 写的编译器,改成了用 Go 语言写。

    为什么要这么做?原因很简单:

    • 速度更快:Go 是编译型语言,运行速度比 JavaScript 快很多
    • 并行处理:Go 天生支持并发,可以同时处理多个任务
    • 内存共享:新版本可以更好地利用内存

    结果就是:编译速度提升了 10 倍!

    性能到底有多强?

    微软用 Sentry 项目做了测试。这个项目有 9000 多个文件,100 多万行 TypeScript 代码。

    原版 TypeScript 5.8

    • 编译时间:72.81 秒
    • 内存使用:3.3GB

    新版 TypeScript 原生版

    • 编译时间:约 7 秒
    • 内存使用:3.9GB

    你没看错,从 72 秒到 7 秒!这就是 10 倍的性能提升。

    对于大型项目来说,这个改进太重要了。以前编译一次要等一分多钟,现在只要几秒钟。

    如何使用?

    安装编译器

    现在就可以试用了。在你的项目里运行:

    npm install -D @typescript/native-preview

    然后用 tsgo 命令代替 tsc

    npx tsgo --project ./src/tsconfig.json

    VS Code 扩展

    微软还发布了 VS Code 扩展。你可以在扩展市场搜索 “TypeScript (Native Preview)”。

    安装后需要手动开启:

    1. 打开命令面板
    2. 运行 “TypeScript Native Preview: Enable (Experimental)”

    或者在设置里开启:

    "typescript.experimental.useTsgo"true

    新功能支持

    SX 支持

    最新版本已经支持 JSX 了。React 开发者可以放心使用。

    JavaScript 支持

    TypeScript 原生版也支持检查 JavaScript 文件。它会读取 JSDoc 注释来做类型检查。

    编辑器功能

    目前支持的功能:

    • ✅ 错误检查
    • ✅ 跳转定义
    • ✅ 悬停提示
    • ✅ 代码补全
    • ❌ 自动导入(开发中)
    • ❌ 查找引用(开发中)
    • ❌ 重命名(开发中)

    注意事项

    这还是预览版,有一些限制:

    模块解析

    如果你用的是老的模块解析方式,可能会遇到错误。建议改成:

    {
        "compilerOptions": {
            "module": "preserve",
            "moduleResolution": "bundler"
        }
    }

    或者:

    {
        "compilerOptions": {
            "module": "nodenext"
        }
    }

    暂不支持的功能

    • --build 模式
    • --declaration 生成声明文件
    • 一些老的编译目标

    技术细节

    为什么选择 Go?

    微软选择 Go 语言有几个原因:

    1. 性能好:Go 是编译型语言,运行速度快
    2. 并发强:Go 的 goroutine 让并行处理变得简单
    3. 内存安全:Go 有垃圾回收,不容易出现内存问题
    4. 生态好:Go 有很多成熟的工具和库

    架构改进

    新版本不只是换了语言。微软还重新设计了架构:

    • 并行解析:可以同时解析多个文件
    • 增量编译:只重新编译改动的部分
    • 内存优化:更好的内存管理

    API 兼容性

    微软知道很多工具依赖 TypeScript API。所以他们开发了兼容层。

    新版本提供了 IPC 接口。其他工具可以通过进程间通信来使用 TypeScript。

    他们还用 Rust 写了一个 Node.js 模块,让 JavaScript 代码可以同步调用新的编译器。

    对开发者的影响

    大型项目的福音

    如果你的项目很大,编译时间很长,这个更新对你来说是巨大的好消息。

    想象一下:

    • 以前编译要等 2 分钟,现在只要 10 秒
    • 以前保存文件后要等很久才能看到错误,现在几乎是实时的
    • CI/CD 流水线会快很多

    开发体验提升

    更快的编译意味着:

    • 更快的热重载
    • 更快的错误反馈
    • 更流畅的开发体验

    对工具链的影响

    很多工具都依赖 TypeScript:

    • Webpack
    • Vite
    • ESLint
    • Prettier

    这些工具都会从性能提升中受益。

    未来规划

    微软的计划是:

    1. 2025 年内:完善所有主要功能
    2. TypeScript 7.0:正式版本会包含原生编译器
    3. 逐步迁移:最终 tsgo 会变成 tsc

    开发路线图

    短期目标:

    • 完善 --build 模式
    • 支持声明文件生成
    • 完善编辑器功能

    长期目标:

    • 完全替代现有编译器
    • 保持 API 兼容性
    • 提供迁移工具

    社区反应

    开发者们对这个消息很兴奋:

    “终于不用等编译了!”

    “10 倍性能提升,这太疯狂了!”

    “大型项目的救星!”

    当然也有一些担心:

    • API 兼容性问题
    • 生态系统适配
    • 学习成本

    但总体来说,社区反应很积极。

    总结

    TypeScript 原生版是一个重大突破。10 倍的性能提升不是小改进,而是质的飞跃。

    虽然还是预览版,但已经可以在很多项目中使用了。如果你的项目编译慢,强烈建议试试。

    这个改进对整个前端生态都有积极影响。它证明了:

    • 性能优化还有很大空间
    • 选择合适的技术栈很重要
    • 大公司愿意投入资源做基础设施

    未来几个月,我们会看到更多功能完善。到 TypeScript 7.0 正式发布时,这将成为所有 TypeScript 开发者的标配。

    前端开发的新时代来了!

    参考资料:

    • Microsoft DevBlogs – Announcing TypeScript Native Previews

    文章来源: 公众号Nodejs技术栈

  • 鸿蒙,首款PC,告别Windows?

    鸿蒙,首款PC,告别Windows?

    5月8号上午,华为召开了鸿蒙电脑技术与生态沟通会,首次亮相了鸿蒙PC,正式发布需要等到5月19日。鸿蒙系统的进展是比较迅速的,2015年开始立项,2019年1.0版本正式发布,2021年搭载到手机,2023年全面转向鸿蒙应用生态的建设,并推出纯血鸿蒙预览版,2024年纯血鸿蒙正式发布。我们看一下鸿蒙PC的整体轮廓,主要是操作系统。从界面设计上来看,像是Windows11和MacOS的合体,底部的任务栏包括开始菜单居中这些设计和Windows11类似;动画的设计效果是MacOS的Dock风格。一些图标卡片组件之类的设计有点像MacOS的风格,也和手机平板差不多。

    从官方展示的效果来看,效果还是不错的。

    据官方介绍,鸿蒙PC搭载了 HarmonyOS 5,从内核开始重构操作系统。鸿蒙电脑搭载方舟图形引擎,基于人因的窗口排序绘制,焦点窗口保证高帧率,高负载稳定流畅,窗口多开轻松应对。全场景互联基于分布式软总线,实现跨设备的无缝协同

    大家比较关心的可能是,它好不好用?

    据官方介绍,目前鸿蒙电脑应用已覆盖多个垂域,满足基本办公及核心场景。其中:通用办公领域已拥有 QQ、WPS、钉钉等应用;影音娱乐领域已拥有腾讯视频、QQ 音乐、央视频、酷狗音乐等应用;游戏领域已拥有《三国杀》《苍翼:混沌效应》等。官方数据,已有300多款融合应用完成适配,年底完成2000+。不过,不支持侧载。

    看上去是轻度办公可用,游戏之类的貌似不太行。

    硬件方面,据爆料出来的信息看,处理器采用的是麒麟X90,华为海思自研。

    手机版的时候,就总有朋友喜欢讨论鸿蒙是不是安卓套壳之类的话题,这重要吗?这不重要!基于开源的内核还是完全重构的,都不重要,重要的是要实现自主可控。毕竟已经迈出了第一步,这都是值得肯定的。不过,要承认目前依然处于0到1的早期阶段,PC系统相对于手机系统推广的难度更大了,想要撼动Windows的绝对领导地位,保守的说10年内几乎无可能,苹果够厉害吧,依然不能动摇,从1到100还有更长的路要走,直白点说,早期的产品用起来很难用是不可避免的,会有大量的问题满足不了你的需求,路要一步一步走,上来就直接替代也不现实。适配大量的生态软件绝非一朝一夕能实现的,尤其是后来者,并且用户学习成本也会陡增,一般都会安于现状,不太会去强行改变现有的成熟方式。就拿微软来说,当年发布Windows8,把开始菜单改动较大,就造成了大量用户的不适应,最后以失败告终。

    大量顶级的工业生产软件目前全都是基于Windows的,更何况要从一个成熟的生态转向另一个早期的生态,所以未来的挑战依然非常艰巨,不过好在已经从0到1,万事开头难。

    关关难过关关过,前路漫漫亦灿灿。

    文章来自:脚本之家

  • Vue3 官方宣布淘汰 Axios,拥抱新趋势

    Vue3 官方宣布淘汰 Axios,拥抱新趋势

    过去十年,Axios 凭借其简洁的API设计和浏览器/Node.js双环境支持,成为前端开发者的首选请求库。但随着现代前端框架的演进和工程化需求的升级,Alova.js 以更轻量、更智能、更符合现代开发范式的姿态登场

    Axios的四大时代痛点

    1. 冗余的适配逻辑

    // Axios的通用配置(但实际你可能只用浏览器端)
    axios.create({ adapter: isNode ? nodeAdapter : xhrAdapter })

    2. 弱TypeScript支持

    // Axios需要手动定义响应类型
    interface Response<T> { data: T }
    axios.get<Response<User>>('/api/user'// 仍需手动解构data

    3. 过度封装的反模式

    // 层层拦截器叠加导致调试困难
    axios.interceptors.request.use(config => {
      // 权限校验拦截器
    })
    axios.interceptors.response.use(response => {
      // 全局错误处理拦截器
    })

    4. 生态割裂

    需要额外引入第三方库实现缓存、队列等高级功能,增加维护成本

    Alova.js 的核心优势

    1. 极致的轻量与性能

    • Tree-shaking优化:仅打包使用到的功能模块
    • 零依赖:基础包仅 4KB(Axios 12KB)

    2. 智能请求管理(开箱即用)

    // 一个配置实现请求竞态取消+重复请求合并+错误重试
    const { data } = useRequest(userInfoAPI, {
      abortOnUnmount: true,    // 组件卸载自动取消请求
      dedupe: true,            // 自动合并重复请求
      retry: 3                 // 自动重试3次
    })

    3. 声明式编程范式

    与 React/Vue 深度集成,提供Hooks风格API:

    // Vue3示例:自动管理loading/error状态
    const { 
      data, 
      loading, 
      error, 
      send: fetchUser 
    } = useRequest(() => userAPI.get({ id: 1 }))

    4. 多场景解决方案内置

    • SSR友好:服务端渲染直出数据
    • 文件分片上传:内置进度监听和暂停恢复
    • 数据缓存:支持内存/SessionStorage多级缓存策略

    实战迁移指南

    1. 基础请求改造

    Axios:

    axios.get('/api/user', { params: { id: 1 } })
      .then(res => console.log(res.data))

    Alova:

    // 定义API模块(享受类型提示)
    const userAPI = {
      get: (id) => alova.Get('/api/user', { params: { id } })
    }
    
    // 发起请求(自动推导user类型!)
    const { data: user } = useRequest(userAPI.get(1))

    2. 复杂拦截器迁移

    Axios的混乱拦截:

    // 请求拦截
    axios.interceptors.request.use(config => {
      config.headers.token = localStorage.getItem('token')
      return config
    })
    
    // 响应拦截
    axios.interceptors.response.use(
      response => response.data,
      error => Promise.reject(error.response)
    )

    Alova的优雅中间件:

    // 全局统一逻辑(类型安全!)
    const alova = createAlova({
      beforeRequest: (method) => {
        method.config.headers.token = localStorage.getItem('token')
      },
      responded: (response) => response.json() // 自动解析JSON
    })

    迁移成本高?Alova给你保底方案

    // 兼容模式:在Alova中使用Axios适配器
    import { axiosAdapter } from '@alova/adapter-axios'
    
    const alova = createAlova({
      requestAdapter: axiosAdapter(axios)
    })
  • 现代 React 开发必备的 13 个神库,路由、UI 组件库、拖拽、虚拟列表都齐了

    现代 React 开发必备的 13 个神库,路由、UI 组件库、拖拽、虚拟列表都齐了

    成为一个现代的 React 开发者,不仅需要理解 React 的核心概念,还需要对整个 React 生态系统了如指掌。所以今天和大家来分享一下这篇 13 Must Know Libraries for a React Developer,看看正在使用 React 开发的你,是不是都使用过这些流行的库了?~

    学习常用的库相关的知识,可以大大简化你的开发过程。

    即使你没有具体用过,你也至少应该知道它们的存在以及它们解决的问题。

    这里列出了作为 React 开发者应该了解的 13 个优秀的 React 库。

    1. TanStack Query

    TanStack Query

    TanStack Query是 React 中的一个开源数据 Fetch 库,由Tanner Linsley开发。它在NPM上有 170 多万次周下载量,在GitHub上有 3.5 万+stars(2023 年 8 月数据)。

    React 没有官方的数据 Fetch 方式。开发者可以自由创造各种数据 Fetch 方法。大多数时候,都会用到 useEffect 和 useState 钩子,或者一些通用的状态管理库。

    TanStack Query 为我们在 React 应用程序中提供了一种标准的获取数据的方式,并帮助我们避免编写复杂的逻辑,减少代码行数,使我们的代码更易维护,使我们的应用程序更快。

    它有很多神奇的特性,可以让 React 中的数据 Fetch 和开发体验很丝滑。这些功能包括自动缓存、自动重新 Fetch、滚动恢复、Render-as-you-fetch 等。

    2. Redux

    Redux

    Redux是 JavaScript 中的一个开源状态管理库。它在 GitHub 上有超过 58K stars,在 NPM 上有超过 780 万次周下载量(2023 年 8 月数据)。

    根据 Redux 的官方文档,Redux 是一个可预测的 JavaScript 应用程序状态容器。它可以帮助你编写在不同环境(客户端、服务器和原生应用程序)下表现一致、可运行的应用程序,并且这些应用程序很容易测试。不仅如此,它还提供了非常好的开发体验,比如与时间穿梭调试器相结合的实时代码编辑。(来源: Redux)

    Redux 的特性

    • 可预测的 – 帮助你编写在不同环境下表现一致、易于测试的应用程序。
    • 集中式的 – 帮助你集中管理应用程序状态。
    • 可调试的 – 有自己的 DevTools,可以轻松跟踪应用程序状态的时间线。
    • 灵活的 – Redux 可与任何 UI 层一起使用,并且有大量的插件来满足你的需求。(来源: Redux)

    Redux 是 React 中最受欢迎的状态管理库之一,可以帮你更轻松地构建大规模的工业级应用程序。

    3. MUI

    MUI

    MUI Core 是一个 React 样式库,可以帮助你很快构建漂亮的 UI。 MUI Core 包含 4 个用于更快构建和交付 UI 的基础库:

    • Material UI: Material UI 是一个实现了 Google Material Design 的 React UI 组件库。(来源: Material UI)
    • Joy UI: Joy UI 是一个使用 React 构建的漂亮设计的 UI 组件库,旨在为开发过程带来乐趣。(来源: Joy UI)
    • Base UI: MUI Base 是一个 headless(“unstyled”)React UI 组件和底层钩子的库。(来源: Base UI)
    • MUI System: MUI System 是一组 CSS 实用程序的集合,用于使用 MUI 组件库快速布局自定义设计。 (来源: MUI System)

    凭借在GitHub上的 88K stars(2023 年 8 月数据)和每周NPM上的 290 万次下载量(2023 年 8 月数据),MUI 是世界上最受欢迎的 React UI 库之一。

    4. React Bootstrap

    React Bootstrap

    React Bootstrap 是我们老朋友 Bootstrap 在 React 中的重构版本。它是一个独立的 Bootstrap 组件的 UI 库,不依赖于 bootstrap.js 或 jQuery。

    React Bootstrap 提供了一个组件库,这些组件具有易于使用的功能、状态管理和默认可访问性,使其成为开始构建应用程序 UI 的不错选择。

    它在GitHub上有超过 21K stars,在NPM上有超过 240 万次周下载量(2023 年 8 月数据)。

    5. React DND

    React DND

    现代 React 应用程序很少简单。几乎所有的工业级应用程序都有某种形式的拖放功能。

    React DND是一个帮助你构建基于拖放功能的 React 应用程序的库。为此,它使用了HTML5 拖放 API。

    这个库使用起来相当简单,在实际应用中有许多有趣和创新的用例。它在GitHub上拥有超过 19K stars,在NPM上拥有超过 180 万次周下载量(2023 年 8 月数据)。

    6. SWR

    SWR

    Vercel 的SWR是我们列表中的第二个数据 Fetch 库,是 React Query 之外的又一个不错的选择。

    SWR 库比 React Query 小得多,更简单,但提供了许多神奇的功能,如可重用的数据 Fetch、Suspense、分页、内置缓存等等。

    它在GitHub上拥有超过 27K stars,在NPM上拥有超过 120 万次周下载量(2023 年 8 月数据)。

    7. React Hook Form

    React Hook Form

    当涉及到 React 中的表单构建时,React Hook Form是王者。它是一个高性能的、轻量的库。没有任何依赖,可以通过减少代码、隔离重新渲染、更快的挂载等来提高应用程序性能。

    根据 React Hook Form 的 GitHub Readme,它具有以下特性:

    • 考虑了性能、用户体验和开发者体验而构建
    • 采用原生 HTML 表单验证
    • 与 UI 库无缝集成
    • 小巧轻量,无任何依赖
    • 支持 Yup、Zod、Superstruct、Joi、Vest、class-validator、io-ts、nope 等验证库以及自定义验证

    该项目在GitHub上拥有超过 36K stars,在NPM上拥有超过 340 万次周下载量(2023 年 8 月数据)。在下次用 React 构建表单之前,一定要看看这个库。

    8. Recharts

    Recharts

    Recharts是一个使用 React 和 D3 构建的开源图表库。它轻量、基于 React 组件、支持原生 SVG,并且可以轻松地在 React 应用里添加图表。

    它提供了 11 种内置的图表组件,包括 AreaChart、BarChart、LineChart、PieChart 等。

    这个库在GitHub上拥有超过 20K stars,在NPM上拥有超过 130 万次周下载量(2023 年 8 月数据)。

    9. React Router

    React Router

    React Router是在 React 应用中实现路由的最流行的库。它在GitHub上拥有超过 50K stars,在NPM上拥有超过 1000 万次周下载量,且由同一团队开发,也是流行的 React 框架 Remix 背后的团队。

    它是一个轻量级、功能齐全的 React 路由库。React Router 可在 React 支持的任何地方运行;在 Web 上、服务器上(使用 node.js)和在 React Native 上。(来源: React Router GitHub)

    React Router 被许多顶尖公司的开发团队使用,如微软、Netflix、Twitter、Discord 等。

    10. Blueprint

    BluePrint

    Blueprint是一个基于 React 的 Web UI 工具包。它针对构建在现代浏览器(包括 IE11)中运行的复杂、数据密集型桌面应用进行了优化。(来源: Blueprint GitHub)

    Blueprint 有 7 个不同的 npm 软件包:

    • blueprintjs/core – 核心包,包含 30 多个组件,用于处理应用的基本 UI。
    • blueprintjs/datetime – 帮助在 React 中与日期和时间进行交互。
    • blueprintjs/icons – 提供超过 300 个图标。
    • blueprintjs/popover2 – blueprintjs/core 的 Popover 和 Tooltip 组件的继承组件。
    • blueprintjs/select – 在应用中支持单选或多选的 Select 组件。
    • blueprintjs/table – 交互式表格组件。
    • blueprintjs/timezone – 帮助应用处理不同时区。

    Blueprint 在GitHub上拥有超过 20K stars(2023 年 8 月数据)。

    11. React Virtualized

    React Virtualized

    React Virtualized是一个虚拟列表库,帮助你在 React 中高效处理大型列表和表格数据的库。它在GitHub上拥有超过 25K stars,在NPM上拥有超过 250 万次周下载量(2023 年 8 月数据)。

    如果你的应用中使用了大量数据,这个库将非常有用。

    12. React Suite

    React Suite

    React Suite是一个企业系统产品的 React 组件库集合。这是一个设计缜密并且对开发者友好的 UI 框架。(来源: React Suite GitHub)

    这是一个与众不同的 UI 库。每个组件都经过精心设计,可以极大地提升应用的美观度,赋予它卓越的质感。

    这个库提供了通用的 UI 组件,如 Button、Drawer、Pagination、Loader 等,设计和深度都比大多数 UI 组件库要出色得多。

    它在GitHub上拥有超过 7K stars,在NPM上拥有超过 6 万次周下载量(2023 年 8 月数据)。

    13. TailwindCSS

    Tailwind CSS

    TailwindCSS是一个工具类优先的 CSS 框架,用于快速设计网站样式。它不是一个 React 库,而是一个 CSS 样式框架,在 React 开发者中用于样式化应用程序的最受欢迎选项之一。

    通过flexpt-4text-center等实用程序类,Tailwind 可以非常容易地构建 UI。每个类在赋值给特定的 JSX 元素后会激活预定义的 CSS 值。

    例如,如果将flextext-center 的类名分配给 div,该元素将变成一个弹性元素、文字居中对齐。

    它在GitHub上拥有超过 71K stars,在NPM上拥有超过 600 万次周下载量(2023 年 8 月数据)。

    总结

    不用学习所有这些库,才能在 React 中高效工作。因为其中的一些目的是相同的。例如,MUI、React Bootstrap 和 React Suite 都是 UI 组件库。

    将时间花在学习不同目的的库上。例如,构建一个使用 React Suite 的 UI、React Router 的路由、React Query 获取数据和 Recharts 渲染图表的 React 应用程序,这样才能最大化的提高学习效率。


    来源:稀土掘金

  • 服务器重启后PM2里进程丢失?

    服务器重启后PM2里进程丢失?

    服务器重启后,发现PM2 ls 命令中的进程全部丢失,怎么保证以后重启不丢失呢?

    • 使用pm2 start启动您的应用程序
    • 设置开机启动pm2,注意,会返回一段命令需要手动执行
    • 执行上个步骤返回的命令
    • 使用save保存您当前的进程列表
    • 验证结果
    # 1.使用pm2 start启动您的应用程序
    pm2 start
    # 2. 设置开机启动pm2,注意,会返回一段命令需要手动执行
    pm2 startup
    # 3. 返回的大概长这样 sudo env PATH=$PATH:/www/server/nodejs/vxx/bin
    # /www/server/nodejs/vxx/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu  执行它
    # 4. 使用save保存您当前的进程列表
    pm2 save

    重启服务器后 使用pm2 ls命令查看是否恢复了您的进程。

    启动应用并设置startup
    保存进程 重启服务器测试一下

  • WordPress中的wp-config.php做什么的

    WordPress中的wp-config.php做什么的

    “wp-config.php”文件是每个自托管 WordPress 网站的重要组成部分。它包含重要的设置,帮助 WordPress 连接到您的数据库并顺利运行。

    此文件不包含在 WordPress 的默认下载中。它会在您输入数据库详细信息时在安装过程中自动创建。

    如果此文件中的信息不正确,您的网站将无法连接到数据库。这时,您可能会看到令人恐惧的“建立数据库连接时出错”消息。

    除了数据库详细信息外,此文件还可能包含调试、安全密钥、内存限制等设置。我们将在本文后面介绍这些内容。

    大多数人不需要经常修改 wp-config.php 文件。但了解它的工作原理以及如何安全地编辑它,可以让您更好地控制您的 WordPress 网站。

    如果您读到这里,可能已经准备好进行更改了。我们将引导您了解如何以最安全的方式编辑此文件,而不会造成任何问题。

    开始编辑这个文件前请先备份!

  • 认识WordPress目录结构

    认识WordPress目录结构

    您想了解 WordPress 的文件和目录结构吗?

    所有 WordPress 核心文件、主题、插件以及用户上传内容都存储在您的网站托管服务器上。

    在本入门指南中,我们将为您详解 WordPress 的文件和目录结构体系。

    WordPress file and directory structure explained for beginners

    为什么你需要了解和学习WordPress目录结构

    大多数用户其实无需了解WordPress的文件目录结构也能顺利运营网站。不过,掌握这些知识就像获得了一把”万能钥匙”,能让你自己解决很多常见的WordPress故障。

    本指南将带你解锁以下技能:

    • 认识主要文件与文件夹
    • 了解WordPress是如何存储你的图片与媒体文件
    • 了解WordPress把你的图片和媒体文件存到哪里了
    • WordPress的配置文件在哪里

    这些信息还可以帮助您了解 WordPress 的后台工作原理以及应该备份哪些 WordPress 文件。

    话虽如此,让我们来看看 WordPress 的文件和目录结构。

    访问 WordPress 文件和目录

    您的 WordPress 文件和目录存储在您的服务器上。您可以使用 FTP 客户端访问这些文件。请参阅我们的指南,了解如何使用 FTP 上传 WordPress 文件,获取详细说明。

    FTP 的一个更简单的替代方案是大多数 WordPress 托管控制面板内置的文件管理器应用程序。

    File manager app in hosting control panel

    一旦您使用 FTP 或文件管理器连接到 WordPress 网站,您将看到如下所示的文件和目录结构:

    WordPress files and folders

    在根文件夹中,您将看到 WordPress 的核心文件和文件夹。这些文件和文件夹用于运行您的 WordPress 网站。

    除了 .htaccess 和 wp-config.php 文件外,您不应自行编辑其他文件。

    以下是您在 WordPress 网站根目录中看到的 WordPress 核心文件和文件夹的列表。

    • wp-admin [文件夹]
    • wp-content [文件夹]
    • wp-includes [文件夹]
    • index.php
    • license.txt
    • readme.html
    • wp-activate.php
    • wp-blog-header.php
    • wp-comments-post.php
    • wp-config-sample.php
    • wp-cron.php
    • wp-links-opml.php
    • wp-load.php
    • wp-login.php
    • wp-mail.php
    • wp-settings.php
    • wp-signup.php
    • wp-trackback.php
    • xmlrpc.php

    上面的列表没有 .htaccess和wp-config.php两个文件. 因为这两个文件只在WordPress安装以后存在。

    WordPress 配置文件

    您的 WordPress 根目录包含一些特殊的配置文件。这些文件包含您的 自定义的WordPress 网站的设置。

    WordPress configuration files
    • .htaccess – 服务器配置文件,WordPress 使用它来管理永久链接和重定向。
    • wp-config.php – 此文件告诉 WordPress 如何连接到您的数据库。它还为您的 WordPress 网站设置了一些全局设置。
    • index.php – 这个文件是WordPress的入口,当用户请求页面时启动并且初始化所有WP文件。

    有时您可能需要编辑 wp-config.php 或 .htaccess 文件。编辑这两个文件时请务必小心。稍有不慎就可能导致您的网站无法访问。编辑这两个文件时,请务必在进行任何更改之前在计算机上创建备份。

    如果您在根目录中没有看到 .htaccess 文件,请查看我们的指南,了解为什么您在 WordPress 根目录中找不到 .htaccess 文件。

    根据您的 WordPress 网站的设置方式,您的根目录中可能包含或不包含以下文件。

    • robots.txt – 包含搜索引擎爬虫的说明
    • Favicon.ico – WordPress 主机有时会生成一个图标文件。

    在wp-content目录里

    WordPress 将所有上传、插件和主题存储在 wp-content 文件夹中。

    WordPress content folder

    人们通常认为您可以在 wp-content 文件夹中编辑文件和文件夹。然而,这并非完全正确。

    让我们来看看 wp-content 文件夹的内部,了解它的工作原理以及您可以在这里执行的操作。

    Inside wp-content folder

    wp-content 文件夹的内容可能因 WordPress 网站而异。但所有 WordPress 网站通常都包含以下内容:

    • [文件夹] themes
    • [文件夹] plugins
    • [文件夹] uploads
    • index.php

    WordPress 将您的主题文件存储在 /wp-content/themes/ 文件夹中。您可以编辑主题文件,但通常不建议这样做。一旦您将主题更新到较新版本,您的更改将在更新过程中被覆盖。

    这就是为什么建议为 WordPress 主题定制创建子主题。

    您下载并安装到网站上的所有 WordPress 插件都存储在 /wp-content/plugins/ 文件夹中。您不能直接编辑插件文件,除非您自己编写了网站专用的 WordPress 插件。

    在许多 WordPress 教程中,您会看到可以添加到 WordPress 网站的代码片段。您可以将自定义代码添加到 WordPress 网站,方法是将其添加到子主题的 functions.php 文件,或者创建网站专用的插件。

    但是,添加自定义代码最简单、最安全的方法是使用像 WPCode 这样的代码片段插件。有关分步说明,请参阅本指南,了解如何在 WordPress 中轻松添加自定义代码。

    WordPress 将您上传的所有图片和媒体文件存储在 /wp-content/uploads/ 文件夹中。默认情况下,上传文件存储在 /year/month/ 文件夹中。无论何时创建 WordPress 备份,都应包含 uploads 文件夹。

    您可以从 WordPress 核心、主题和已安装插件的来源下载最新版本。但是,如果您丢失了 uploads 文件夹,那么在没有备份的情况下恢复它将非常困难。

    您可能还会在 wp-content 目录中看到其他一些默认文件夹。

    • languages – WordPress 将非英语 WordPress 网站的语言文件存储在此文件夹中。
    • upgrade – 这是 WordPress 升级到新版本时创建的临时文件夹。

    许多 WordPress 插件也可能会在您的 wp-content 文件夹中创建自己的文件夹来存储文件。

    一些 WordPress 插件可能会在 /wp-content/uploads/ 文件夹内创建文件夹来保存用户上传的内容。例如,此演示网站包含由 Smash Balloon 、 WooCommerce 、 SeedProd 和 WPForms 插件创建的文件夹。

    Plugins may create their own folders inside uploads directory

    其中一些文件夹可能包含重要文件。因此,我们建议您备份所有此类文件夹以防万一。

    其他文件夹可能包含您可以安全删除的文件。例如,您的缓存插件(如 WP Rocket)可能会创建文件夹来保存缓存数据。

    好了,希望本文能帮助您了解 WordPress 的文件和目录结构。您可能还想查看我们使用 phpMyAdmin 管理 WordPress 数据库的初学者指南,以及如何在没有任何编码知识的情况下创建自定义 WordPress 主题的教程。