2025年08月07日 日报

返回列表

2025-08-07 每日信息聚合

AI工具使用教程与技巧

2025 08 07 HackerNews

原文链接: https://supertechfans.com/cn/post/2025-08-07-HackerNews/

原始摘要:

2025-08-07 Hacker News Top Stories #

  1. OpenAI发布了开放权重推理模型,支持本地运行和定制,提供完整的推理链并注重安全性。
  2. KittenTTS是一个轻量级开源文本到语音模型,适合CPU环境,模型大小仅25MB,支持多种声音选择。
  3. 开源开发者因作品被公司使用却未获得回报,引发对开源软件许可和伦理的讨论。
  4. Claude Code IDE实现了与Emacs的深度集成,通过MCP协议提供丰富的功能和工具支持。
  5. 美国政府要求台积电购买英特尔49%股份以换取关税减免,引发对芯片供应链和经济影响的讨论。
  6. Ollama Turbo允许用户利用数据中心硬件运行大型模型,解决了运行速度和资源问题。
  7. 日本要求苹果在2025年前解除浏览器引擎禁令,支持第三方浏览器引擎的发展。
  8. 文章介绍了通过base64编码识别JSON、证书和私钥的方法,强调了安全风险的识别。
  9. 人工智能经济可能被高估,警告其泡沫可能比加密货币泡沫更大,引发对未来经济影响的担忧。
  10. 美国宪法网站部分内容被移除,引发对数据真实性和信息操控的讨论。

Open models by OpenAI #

https://openai.com/open-models/

OpenAI 提供了先进的开放权重推理模型,这些模型可以为任何用例定制,并在任何地方运行。用户可以在 Hugging Face 上下载模型,并在 GitHub 上查看详细信息。这些模型支持 Apache 2.0 许可,允许用户自由构建,无论是实验、定制还是商业部署,都无需担心版权限制或专利风险。

这些模型专为代理任务设计,能够利用强大的指令遵循和工具使用能力,包括网络搜索和 Python 代码执行。用户可以调整推理工作量,从低到高,并进行全面参数微调以适应特定用例。此外,用户可以访问完整的推理链,以便于调试和提高对模型输出的信任。

OpenAI 还提供了一个简单的交互式演示,开发者可以在浏览器中尝试这两个模型。模型性能方面,gpt-oss-120b 和 gpt-oss-20b 在多个基准测试中表现出色,包括 MMLU、GPQA Diamond、Humanity’s Last Exam 和 Competition math 等。

在安全方面,OpenAI 强调安全是其开放模型的基础。每个模型都经过了彻底的安全培训和评估,以帮助开发者保护用户安全。OpenAI 还与外部安全专家合作,对恶意微调版本的 gpt-oss-120b 进行了全面安全测试,并发现其未达到高能力水平。

OpenAI 与领先的部署和硬件公司合作,将这些模型提供给开源社区。用户可以学习如何使用 gpt-oss 与 Transformers、Ollama 和 vLLM 等工具一起工作,并了解 OpenAI 的和谐响应格式。

OpenAI 鼓励用户分享反馈和功能请求,以指导未来的开放模型开发。用户可以通过电子邮件提供反馈,包括具体的用例。OpenAI 还提供了关于 gpt-oss 的更多指南和资源。


HN 热度 2048 points | 评论 819 comments | 作者:lackoftactics | 1 day ago #

https://news.ycombinator.com/item?id=44800746

  • gpt-oss:20b 是一个顶级模型,能在个人笔记本电脑上免费运行,无需高昂的订阅费用或大量能源消耗。
  • 有评论者认为 20b 模型在解决基本的河流过桥谜题时表现不佳,不如其他本地模型,如 QwQ-32b。
  • 有人指出,20B 4/32 MoE 模型在特定问题上可能不如 32B 密集型模型,但两者可能在不同规模上都是最先进的。
  • 有评论者讽刺地提到,不同模型大小有不同的目标标准。
  • 有人对模型在不同设置下的表现提出疑问,比如是否将推理努力设置为高。
  • 有用户分享了使用 Google 的 Gemma-3n-E4B-IT 模型在移动设备上的积极体验。
  • 有评论者认为许多本地可运行的模型已经能够处理文本校对和轻微编辑的实际问题。
  • 有用户提到,他们在评估模型时只关注自己的用例,而不是依赖于评估帖子。
  • 有评论者认为 OSS 模型在数学和编码之外的领域表现不佳。
  • 有用户报告说 20b 模型能够解决狼、山羊、卷心菜过河谜题,并且在不同的设置下都能可靠地解决。
  • 有评论者提出,模型可能是通过训练数据而不是推理来解决问题的。
  • 有用户提出,模型在不同界面下的表现可能不同,比如 LM Studio 和 Ollama UI。
  • 有评论者通过一个编码信息提出了一个反问,暗示模型可能只是在重复训练数据中的答案,而不是真正理解问题。

Show HN: Kitten TTS – 25MB CPU-Only, Open-Source TTS Model #

https://github.com/KittenML/KittenTTS

KittenTTS 是一个开源的、逼真的文本到语音(TTS)模型,仅包含 1500 万个参数,专为轻量级部署和高质量的语音合成而设计。目前处于开发者预览阶段,用户可以加入其 Discord 社区以获取更多信息。

特点

  • 超轻量级:模型大小不到 25MB。
  • CPU 优化:无需 GPU 即可在任何设备上运行。
  • 高质量语音:提供多种优质语音选项。
  • 快速推理:优化了实时语音合成。

快速开始

  • 安装:通过 pip 安装 KittenTTS。
  • 基本用法:使用 KittenTTS 生成音频,可选择不同的语音,并保存输出的音频文件。

系统要求

  • 几乎可以在任何地方工作。

开发计划

  • 发布预览模型。
  • 发布完全训练好的模型权重。
  • 发布移动 SDK。
  • 发布网络版本。

关于

  • KittenTTS 是一个小于 25MB 的最先进的 TTS 模型。

资源

  • 许可:Apache-2.0 许可。
  • 活动:包括星星数、观察者数和分叉数等社区活动信息。

页面底部提供了 GitHub 的版权信息、相关条款、隐私政策、安全信息、状态更新、文档联系以及管理 cookies 的选项,并提醒用户不要分享个人信息。


HN 热度 744 points | 评论 314 comments | 作者:divamgupta | 19 hours ago #

https://news.ycombinator.com/item?id=44807868

  • Kitten TTS 是一个开源的轻量级文本到语音模型,适用于设备端应用,模型大小不到 25MB,包含 15M 参数,支持 8 种声音。
  • 用户反馈模型加载和音频生成速度快,性能在不同声音间一致。
  • 一些用户认为模型尚未优化,期待未来的 SDK 发布。
  • Reddit 上有人分享了生成的音频样本,YouTube 上有展示不同声音的视频。
  • 一些用户对模型的音质表示满意,认为在 25MB 且仅 CPU 运行的情况下表现惊人。
  • 有用户指出模型的声音听起来不自然,像是过度表演的英语配音。
  • 一些用户提到模型的声音听起来像青少年,缺乏深度,不够人性化。
  • 有用户质疑模型的数据来源和代码实现。
  • 一些用户比较了 Kitten TTS 与其他 TTS 引擎,认为尽管有些单调,但谷歌和三星的预装 TTS 引擎表现良好。
  • 用户期待模型在未来版本中音质有所提升。

I gave the AI arms and legs then it rejected me #

https://grell.dev/blog/ai_rejection

在 2024 年 10 月,Anthropic 公司发布了“Claude Computer Use”功能,它允许 AI 控制计算机,例如将浏览器中的数据复制到电子表格中。作者作为控制计算机的库的维护者,对 Anthropic 的技术实现感到好奇,并希望从中学习。直到 2025 年春季,作者才有时间深入研究,惊讶地发现 Anthropic 实际上在其产品中使用了他维护的 enigo 库。

通过运行特定的命令,用户可以确认 enigo 库在 Claude Desktop 的 macOS 和 Windows 版本中被使用。enigo 版本 0.2.1 在两个平台上都有使用。作者对 enigo 被一个看似拥有无限开发预算的公司选择用于商业项目感到非常自豪。输入模拟由于文档缺乏和操作系统特定的问题而变得异常困难,值得单独写一篇博客文章。作者认为 enigo 是一个很好的选择,因为它是唯一一个在 Windows、macOS、*BSD 和 Linux(Wayland、X11 和 libei)上无需 root 权限即可工作的库。它用 Rust 编写,因此在内存安全的同时也非常快速。它是 crates.io 上最受欢迎的选择,拥有近 300,000 次下载和 1,200 多个 GitHub 星标。然而,作者也有点紧张,因为他的业余项目被 Claude Desktop 使用,并部署在数千台设备上。

作者没有从 enigo 中赚到任何钱,因为它是在 MIT 许可下发布的,这意味着每个人都可以免费使用。他唯一得到的回报是 GitHub 上的星标和 crates.io 上的下载量增加。有趣的是,尽管 Claude Desktop 是一个 Electron 应用程序,但它只在 macOS 和 Windows 上可用。Electron 应用程序的好处是它们可以在所有平台上工作。其他人找到了在 Linux 上运行 Claude Desktop 的方法,他们不得不替换使用 enigo 的代码为存根。作者通过朋友的朋友得知 Anthropic 有一个开放的职位,负责实现使用 enigo 的 Claude Desktop 的秘密、未发布功能。他写了一封求职信并提交了申请。自动回复告诉他,他们可能需要一些时间来回应,并且他们只通知进入下一轮的申请者。几周没有回应后,作者以为他们选择了其他申请者。当他收到 Anthropic 的电子邮件时,他兴奋地打开了它。不幸的是,他们感谢他的申请,但表示团队没有能力审查额外的申请。

作者本希望能在 Anthropic 工作,实现类似于计算机使用的特徵,并将 Claude Desktop 带到 Linux。考虑到他的代码已经是他们软件的一部分,他认为自己有很大的机会获得这个职位。多年来,他在输入模拟领域积累了很多知识,他本可以为这个职位带来这些知识。全职工作几个月的 enigo 可以将项目提升到一个全新的抛光和专业水平,这将帮助 Anthropic 能够专注于他们的 AI 模型,而不是输入问题。

总的来说,作者对 enigo 被用于 Claude Desktop 感到非常高兴,并且他会告诉每一个愿意听他说话的人。他认为这很酷,因为他比喻性地为 Claude AI 创造了手臂和腿,但他不禁想知道拒绝信是由人类还是 Claude AI 写的。他帮助装备了新能力的 AI 是否刚刚拒绝了他的申请?从好的方面看,他现在应该可以安全地避开 Roko 的 Basilisk 了。


HN 热度 706 points | 评论 351 comments | 作者:serhack_ | 16 hours ago #

https://news.ycombinator.com/item?id=44808794

  • 作者应该将软件许可证改为 AGPL,并提供联系方式以便支付定制条款,以防止公司利用开源开发者而无需付出任何代价。
  • 有些人选择 MIT 许可证是因为它的自由度高于 GPL,并不是所有人都需要通过开源软件赚钱。
  • 作者对于自己的业余项目被广泛部署感到自豪和紧张,这可能是许多开源作者的愿望和成功。
  • 作者应该将许可证改为 LGPL 和专有许可证,不再为 Anthropic 提供免费的专业工作。
  • 如果公司通过使用作者的作品赚钱,作者希望获得分成。
  • AGPL 许可证并不影响个人使用,而是影响公司在抓取、修改和托管代码时不分享贡献。
  • 有人质疑版权法的普遍性和 GPL 的合理性。
  • 有人认为,即使作者的作品被他人使用来赚钱,他们也可能不关心这一点,或者觉得作品被广泛使用比潜在的金钱补偿更有价值。

Claude Code IDE integration for Emacs #

https://github.com/manzaltu/claude-code-ide.el

Claude Code IDE for Emacs 是一个为 Emacs 提供与 Claude Code CLI 原生集成的工具,通过 Model Context Protocol (MCP) 实现。与简单的终端包装器不同,这个包在 Claude 和 Emacs 之间创建了一个双向桥接,使 Claude 能够理解和利用 Emacs 的强大功能,包括 LSP、项目管理以及自定义 Elisp 函数。这将 Claude 转变为一个真正的 Emacs 感知 AI 助手,它可以在您现有的工作流程中工作,并与您的整个 Emacs 生态系统互动。

特点包括:

  • 自动项目检测和会话管理
  • 使用 vterm 或 eat 的终端集成,支持全色彩
  • MCP 协议实现用于 IDE 集成
  • 工具支持文件操作、编辑器状态和工作区信息
  • 可扩展的 MCP 工具服务器,用于访问 Emacs 命令(例如 xrefs、tree-sitter、项目信息等)
  • 与 Flycheck 和 Flymake 的诊断集成
  • 集成 ediff 的高级差异视图
  • 支持标签栏以正确切换上下文
  • 选择和缓冲区跟踪以获得更好的上下文感知

Emacs 工具集成: 该包使 Claude Code 能够通过 MCP 工具集成充分利用 Emacs 的全部功能。Claude 可以直接访问和使用 Emacs 的功能,包括:

  • 通过 xref 命令进行语言服务器协议(LSP)集成,实现智能代码导航(例如 eglot、lsp-mode 等)
  • 使用 Tree-sitter 进行语法树分析,理解代码结构的 AST 级别
  • 使用 Imenu 进行结构化符号列表和文件内导航
  • 项目集成,实现项目感知操作
  • 任何 Emacs 命令或函数都可以作为 MCP 工具暴露,允许 Claude:
    • 执行项目范围内的搜索和重构
    • 访问专业模式及其特性
    • 执行为您的工作流程量身定制的自定义 Elisp 函数

这种深度集成意味着 Claude Code 理解您的项目上下文,并能够利用 Emacs 的广泛生态系统提供更智能、更具上下文感知的协助。

截图展示了以下功能:

  • 活动文件感知:Claude Code 自动知道您当前在 Emacs 中查看的文件
  • 代码选择上下文:Claude Code 可以访问和处理您缓冲区中选择的文本
  • 带诊断的高级差异视图:集成的 ediff 视图用于代码更改,Claude Code 能够直接访问打开文件的诊断数据(错误、警告等)
  • 自动文本提及:在 Claude 对话中自动提及和引用选择的文本
  • 会话恢复:使用 –resume 标志恢复之前的 Claude Code 对话

安装: 先决条件包括 Emacs 28.1 或更高版本,以及安装在 PATH 中的 Claude Code CLI 和 vterm 或 eat 包(用于终端支持)。

安装 Claude Code CLI: 按照 Claude Code 文档中的安装说明进行操作。

安装 Emacs 包: 目前,该包处于早期开发阶段。要使用 use-package 和 straight.el 进行安装:

(use-package claude-code-ide
  :straight (:type git :host github :repo "manzaltu/claude-code-ide.el")
  :bind ("C-c C-'" . claude-code-ide-menu) ; 设置您喜欢的键绑定
  :config
  (claude-code-ide-emacs-tools-setup)) ; 可选启用 Emacs MCP 工具

使用: 基本命令: 与 Claude Code IDE 交互的最简单方式是通过基本命令。


HN 热度 514 points | 评论 167 comments | 作者:kgwgk | 10 hours ago #

https://news.ycombinator.com/item?id=44811567

  • Claude Code IDE 集成对 Emacs 等小众编辑器是好消息,可以轻松集成 AI 编码工具,专注于编辑功能。
  • 目前没有类似 LSP 的标准来集成代理编码工具到编辑器。
  • gptel 提供了一个充满活力的生态系统,提供了比 VSCode 更强大的功能。
  • Cursor 编辑器集成了代理,但用户对代理的控制有限,依赖于 Cursor 团队的路线图。
  • 有些人认为,为了获得代理功能而更换整个编辑器是不必要的。
  • 有人认为,破产是一个始终存在的严重问题,即使在十五年前也是如此。
  • 有人认为,破产现在比过去更加危险,因为就业市场和技术行业的变化。
  • 有人分享了他们使用 gptel 和 Claude Code 的工作经验和配置。

US reportedly forcing TSMC to buy 49% stake in Intel to secure tariff relief #

https://www.notebookcheck.net/Desperate-measures-to-save-Intel-US-reportedly-forcing-TSMC-to-buy-49-stake-in-Intel-to-secure-tariff-relief-for-Taiwan.1079424.0.html

美国政府正在采取极端措施来挽救英特尔公司。根据台湾的一份新报告,美国政府正在将降低对台湾的贸易关税与台积电(TSMC)在美国的重大投资联系起来。这项投资包括购买英特尔 49% 的股份。目前,美国对台湾的贸易关税高达 20%,高于日本等国家的 15%。台湾是美国最大的贸易伙伴之一,因此 20% 的关税对台湾企业来说是一个沉重的负担,这也是为什么台湾需要与美国进一步谈判以降低或完全取消关税。然而,根据台湾媒体 mnews.tw 的报道,美国总统特朗普提出了两个条件,要求台湾在获得关税减免前必须满足:购买英特尔 49% 的股份,以及在美国进一步投资 4000 亿美元。

尽管台积电已经在美国进行了大量投资,包括在亚利桑那州的两个新工厂和一个研发中心以及一个封装设施,计划总投资达到 1650 亿美元,但特朗普总统提出的额外投资 4000 亿美元以及购买英特尔股份的要求从财务角度来看似乎不太可能。英特尔公司正面临衰退,从其制造业务到消费产品,几乎每个部门都受到了打击。公司的年收入从 2021 年的 790 亿美元下降到 2024 年的 530 亿美元,下降了 33%。英特尔是美国国内半导体制造计划的关键部分,已经获得了数十亿美元的联邦补贴,但这并未解决英特尔的问题,公司已将其俄亥俄州工厂的建设从最初的 2025 年推迟到 2030/31 年。主要原因是英特尔在缺乏美国芯片法案和外部合作伙伴的显著帮助下,努力保存资本资源。

简而言之,美国政府似乎正在向台积电施压,要求其收购英特尔的大量股份,以注入急需的资金并维持美国政府国内芯片供应链的计划。然而,台积电不太可能同意这一提议。未来几个月,英特尔的情况将如何发展还有待观察。英特尔正在开发一些激动人心的产品,如 Panther Lake 和 Nova Lake 处理器。如果这些产品能够成功交付,那么英特尔的前景可能会有所改善。


HN 热度 439 points | 评论 489 comments | 作者:voxadam | 1 day ago #

https://news.ycombinator.com/item?id=44801486

  • 关税在广泛可用的商品中有意义,但在缺乏国内替代品且面临垄断时则无效。
  • 美国消费者最终将支付关税,因为不可能不购买 TSMC 制造的芯片。
  • 美国通过提高关税对底层 90% 的美国人增税,但许多人并未意识到这一点。
  • 人们并非愚蠢,而是生活在信息敌对的环境中,需要改变的不是对他们的侮辱,而是这种环境。
  • 与冷战时期的国家相比,美国更容易找到反宣传的真实信息。
  • 我们生活在一个既有奥威尔式强制思维统一,也有赫胥黎式信息泛滥的反乌托邦中。
  • 人口崩溃可能导致人工子宫和由 AI 驱动的教学设施的出现。
  • 这不是奥威尔或赫胥黎式的反乌托邦,而是一个吉布森式的 AI 大公司反乌托邦。
  • 人们在极权国家不是愚蠢、盲目或容易被操纵的,他们能够识别宣传并生存下来。
  • 人们在压迫下往往能更快地看穿宣传,而不是那些从未质疑过自己媒体的人。

Ollama Turbo #

https://ollama.com/turbo

Ollama Turbo 是一种新方式,它允许用户利用数据中心级别的硬件来运行开放模型。许多新模型由于体积过大,无法适配广泛可用的 GPU,或者运行速度非常慢。Ollama Turbo 提供了一种快速运行这些模型的方法,同时用户可以继续使用 Ollama 的应用程序、命令行界面(CLI)和应用程序编程接口(API)。

目前预览阶段,Turbo 提供了 gpt-oss-20b 和 gpt-oss-120b 模型。Turbo 模式与 Ollama 的 CLI 兼容,用户可以在文档中找到更多信息。同样,Turbo 模式也与 Ollama 的 API 以及 JavaScript/Python 库兼容,相关信息也可以在文档中查阅。

在 Turbo 模式下,Ollama 不会记录或保留通过 Turbo 模式进行的任何查询,以确保隐私和安全。此外,运行模型的硬件负载从用户的 Mac、Windows 或 Linux 计算机上移除,这有助于节省电池寿命,并为其他应用程序释放性能。

所有支持 Turbo 的硬件都位于美国。Turbo 包括小时和每日的使用限制,以避免容量问题。不久将提供基于使用的定价模式,以便以计量方式使用模型。

Ollama 成立于 2025 年,提供下载、博客、文档、GitHub、Discord、Twitter 和联系我们等服务。同时,Ollama 还提供聚会活动。


HN 热度 414 points | 评论 229 comments | 作者:amram_art | 1 day ago #

https://news.ycombinator.com/item?id=44802414

  • 开源模型(OSS)在速度、成本、可靠性、功能一致性、性能、数据隐私保证和长期支持等方面存在多样性问题,导致企业用户难以选择。
  • 使用开源模型需要评估不同模型/供应商,可能需要专业知识,而 Anthropic/OAI/Google 等封闭源模型“即插即用”,用户为便利性付费。
  • 直到开源提供商开始标准化产品,开源模型在理论上与封闭源模型性能相当,但实际上并未真正参与大规模部署的竞争。
  • 有评论指出,将所有提示流量交给没有真正法律保护的公司存在风险。
  • 有人怀疑未删除的聊天记录或基于此推断的数据可能是 GPT-5 训练数据的一部分,对 Sam Altman 缺乏信任。
  • 有评论指出“mid-Might”可能是“mid-May”的拼写错误,对专业出版物中的这种错误感到奇怪。
  • Ollama Turbo 是 4.5 位量化的原生模型,没有 fp16 原始版本。
  • Ollama 因其易用性而受到一些开发者的欢迎,尽管不适合生产环境,但适合非技术用户快速上手开发和测试 LLM 系统。
  • Ollama 已经从 llama.cpp 作为包装器转变为使用 GGML 库,并要求硬件合作伙伴帮助优化。
  • 有人质疑 Ollama 的价值主张,认为它只是一个玩具,不适合企业使用,而 AWS、vLLM、SGLang 等才是企业解决方案。
  • 有人表示,尽管 Ollama 看起来简单,但为了保持简单性,开发团队经历了很多挑战。
  • 有人提到,许多推理工具的模型实现不佳,尤其是 OpenAI 的 Harmony,而 Ollama 在特定版本中与 OpenAI 的参考实现进行了基准测试,确保性能相当。
  • 有人表示,如果自己搭建系统,可能会选择下载无头 Ollama,因为它简单易用,可能会在后期从开发运维角度重新考虑部署方法。
  • 有人认为,使用 llama.cpp、vLLM 或 modular 同样简单,任何差异都足够小,可以很容易地委托给 AI。
  • 有人指出,llama.cpp 如果没有预构建的二进制文件支持,安装起来并不简单,需要花费额外时间。
  • 有人提到,如果开发团队使用 Ollama 是因为安装简单,可能不想为生产环境维护单独的构建链。
  • 有人批评 Ollama 的宣传是误导,认为 GGML 库和 llama.cpp 是同一个东西,Ollama 没有价值主张。

Japan: Apple Must Lift Browser Engine Ban by December #

https://open-web-advocacy.org/blog/japan-apple-must-lift-engine-ban-by-december/

2025 年 8 月 6 日,开放网络倡导组织(Open Web Advocacy)发表了一篇文章,讨论了日本最近通过的《智能手机法案》,正式名称为《促进智能手机使用特定软件竞争法案》。该法案最重要的改革之一是直接禁止苹果公司长期以来在 iOS 上禁止第三方浏览器引擎的行为。这一禁令实际上禁止了 Firefox、Chrome、Edge、Opera、Brave 和 Vivaldi 等浏览器,因为它们被迫使用苹果的 WebKit 引擎,而这个引擎是它们无法修改或控制的。这导致了 iOS 上没有有效的浏览器竞争,网络应用也失去了与原生应用竞争所需的 API 和性能。

该立法基于日本数字市场竞争总部的最终报告,开放网络倡导组织为该报告提供了咨询。他们提交的内容可以在这里找到。

上周,日本发布了《移动软件竞争法案》(MSCA)指南。这些从属规则阐明了法案将如何被解释和执行。对于浏览器竞争,这些指南意味着什么?

禁止阻止或妨碍替代浏览器引擎 #

指南明确禁止任何阻止或妨碍第三方浏览器引擎采用的措施:

  • 包括对个别应用提供商施加不合理的技术限制,同时允许它们采用替代浏览器引擎;
  • 对采用替代浏览器引擎的个别应用提供商施加过多的财务负担;
  • 引导智能手机用户远离使用包含替代浏览器引擎的个别软件。

API 访问必须功能等价 #

MSCA 还要求公平访问操作系统 API,这与欧盟数字市场法案(EU DMA)第 6 条第 7 款相呼应。对于浏览器来说,这一点尤其关键,因为它们需要广泛访问通常为 Safari 和 WebKit 保留的大量 API。

选择屏幕 #

该法案还规定了浏览器等项目的选择屏幕。重要的是,它规定选择屏幕必须在“首次激活后立即”显示,这是对欧盟数字市场法案的一个重要改进。

下一步会发生什么? #

预计《移动软件竞争法案》将在 2025 年 12 月生效。随着日本加入欧盟和英国,现在有三个司法管辖区要求苹果允许浏览器运行自己的引擎。随着日本准备执行,它可能正在研究已经在欧洲和英国展开的监管方法和挑战。

正如欧盟和英国已经展示的(英国 MIR、CMA SMS 案、欧盟 DMA 执行),执行将是一个漫长而艰难的过程。现在日本、欧盟和英国都要求苹果支持第三方浏览器引擎,2026 年可能成为恢复 iOS 浏览器竞争的决定性一年。但这在很大程度上取决于监管机构的决心,以及苹果在实质上的合规意愿,而不仅仅是形式上的。


HN 热度 387 points | 评论 309 comments | 作者:mtomweb | 14 hours ago #

https://news.ycombinator.com/item?id=44810061

  • 日本要求苹果解除浏览器引擎禁令
  • Firefox 配合 uBlock Origin 在移动设备上提供了接近桌面的网络访问体验
  • Chrome 在桌面上已无法使用某些功能,如:has-text RegEx 规则
  • 部分用户考虑使用 Android 作为主要设备,但 iMessage 限制了他们
  • 有用户推荐使用 Google Messages 作为 iMessage 的替代品
  • uBlock Origin 的 iOS 版本已发布,但功能不如完整版
  • Safari 基于的浏览器可以同时使用 Firefox 和 Chrome 的插件
  • 移动版 Firefox 的 consent-o-matic 扩展可以自动点击几乎所有的 Cookie 横幅
  • 有用户使用 Google Messages 获得类似桌面 iMessage 的体验
  • KDE Connect 允许从桌面发送短信
  • Brave 浏览器的内置广告拦截功能可以作为 Firefox+uBlock 的替代
  • Google Messages 允许同时在手机和桌面上接收短信
  • 有用户认为 iOS 26 的键盘是苹果公司做出的最糟糕的退步
  • 有用户对苹果的隐私问题表示担忧,并使用 GrapheneOS
  • 日本可能从苹果在欧盟的恶意合规行为中学到了教训
  • 有用户认为如果苹果在日本被禁止销售和进口,可能会导致苹果商店关闭
  • 有用户认为日本人不会因买不到 iPhone 而发生骚乱
  • 有用户认为苹果试图以限制 AI 技术作为对欧盟的惩罚,但并未引起骚乱
  • 有用户认为改变设备语言为英语可以获得某些功能,但苹果智能功能仍然受到区域限制
  • 有用户认为美国人对苹果品牌忠诚度较高,而其他国家的人并不那么在意

Spotting base64 encoded JSON, certificates, and private keys #

https://ergaster.org/til/base64-encoded-json/

这篇文章讲述了作者在处理一个加密文件时的发现。作者在检查一个应该包含加密内容的文件,准备安全地提交到 GitHub 仓库时,注意到文件内容似乎包含了不应该出现的密码密钥信息。文件内容如下:

{ “serial”: 13, “lineage”: “24d431ee-3da9-4407-b649-b0d2c0ca2d67”, “meta”: { “key_provider.pbkdf2.password_key”: “eyJzYWx0IjoianpHUlpMVkFOZUZKcEpSeGo4UlhnNDhGZk9vQisrR0YvSG9ubTZzSUY5WT0iLCJpdGVyYXRpb25zIjo2MDAwMDAsImhhc2hfZnVuY3Rpb24iOiJzaGE1MTIiLCJrZXlfbGVuZ3RoIjozMn0=” }, “encrypted_data”: “ONXZsJhz37eJA[…]”, “encryption_version”: “v0” }

作者怀疑这可能是一个 base64 编码的 JSON 对象,尽管对此表示怀疑,但还是尝试了解码,结果成功了。解码后的内容如下:

{ “salt”:“jzGRZLVANeFJpJRxj8RXg48FfOoB++GF/Honm6sIF9Y=”, “iterations”:600000, “hash_function”:“sha512”, “key_length”:32 }

作者对同事能够迅速识别出 base64 编码的 JSON 表示惊讶,并询问了识别的依据。同事解释说,通常 base64 编码的字符串以"ey"开头,紧接着是一个字母,然后是"J",再跟一个字母。作者通过在终端进行测试验证了这一点,并发现这种方法可以直观地识别出 base64 编码的 JSON,而不需要立即解码。

此外,文章还提到了如何识别 base64 编码的证书和私钥,它们通常以"LS"开头,这让人联想到"TLS 证书"中的"LS"。文章最后指出,这种方法并不是万能的,它实际上是检测 PEM 格式(常用于证书)的前导破折号,以及以"—“开头的 YAML 文件也会得到相同的结果。

文章最后感谢了 Davide 和 Denis 展示了这个简单但实用的技巧,以及 tyzbit 补充了关于证书和私钥的信息。


HN 热度 334 points | 评论 130 comments | 作者:jandeboevrie | 1 day ago #

https://news.ycombinator.com/item?id=44802886

  • JWTs 听起来都像“eyyyyy”。
  • 所有证书听起来都像“miiiiii”。
  • 所有 zip 文件听起来都像“punk zip”。
  • MZ 在 exe 文件中代表 Mark Zbikowski。
  • JSON 听起来像“Ey, I’m JSON!”。
  • JSON 听起来像“Eyy, I’m authin' here!”。
  • JSON 听起来像“Eyy, JSON I’m PTER”。
  • 知道这些 base64 编码的前缀很有用,因为它们经常出现在数据 URL、JSON/XML/ASN.1 等协议中。
  • 传输二进制格式时使用二进制格式更有意义,可以节省带宽、内存并减少解码步骤。
  • 知道这些 base64 的魔法字节在看到别人编码的数据时特别相关,因为可能无法控制编码方式。
  • 有时需要将二进制数据嵌入到文本格式中,例如 JSON。
  • 将大量数据以 base64 编码文本形式放入 JSON 文件中是令人反感的,尤其是在处理 glTF 模型转换器时。
  • 包含编码 gif 文件的 Tampermonkey 脚本大小达到一兆字节。
  • 感谢 GPT。
  • Base64 编码意味着每三个字符的原始输入会产生四个字符的 base64 输出。
  • LLMs 能够解码/编码 base64,即使没有 MCP 提供的工具帮助,因为可以像阅读其他语言一样“阅读”它。
  • ASCII 字符实际上是 base128,最大的 ASCII 值是 0x7f。
  • 可以识别 Base64 编码的 JSON,PEM 格式的主体已经是 Base64 编码,但头部和尾部是 ASCII,不应该编码。
  • 无法识别私钥,除非它们以重复的文本序列开始或使用带有头部编码的 PEM 格式。
  • MI 是每个 ASN.1 DER 编码对象的常见前缀,因为每个对象几乎都是以 SEQUENCE(0x30 标签字节)开始,后跟长度引导字节(最高位 0x8)。
  • MII 非常常见,因为它引入了一个两字节长度的 SEQUENCE
  • 经常看到“65537”的 base64 版本“AQAB”,这是现代 RSA 实现中常用的公钥指数参数 e。
  • 期待量子计算机破解所有加密,结束 ASN.1 解码器的痛苦。
  • 如果你最终在地狱,可能会永远盯着 XER 看。

AI is propping up the US economy #

https://www.bloodinthemachine.com/p/the-ai-bubble-is-so-big-its-propping

大家好,这是本周的 BITM 新闻。我刚从旅行中回来,参加了在旧金山的一个关于人工智能和工作的座谈会,接着又回到了洛杉矶参加了 404 现场活动之夜,很高兴在那里遇到了很多 BITM 的读者。我还接受了《时代》杂志 Charter 项目的采访,虽然因为疲惫状态不佳,但我认为还是传达了一些好的观点。此外,我还与独立媒体/自由职业者倡导平台 Study Hall 讨论了人工智能在新闻业中的应用。

本周人工智能领域也非常忙碌,这并不令人惊讶,因为与我们即将讨论的新闻息息相关。在本期中,我们将深入探讨以下内容:

  • 微软的人工智能推动了其市值达到 4 万亿美元
  • 人工智能推动了如此多的投资,就像是一个“私营部门刺激计划”,掩盖了关税造成的损失
  • 本周的 CRITICAL AI 报告,包括:
    • 美国教授如何组织起来对抗人工智能进入高等教育的推动
    • 人工智能模特出现在 Vogue 引发的愤怒
    • 构建者人工智能公司的崩溃内幕
    • 好消息:法院支持裁定谷歌 Play 商店和计费系统是非法垄断

上周,微软成为继英伟达之后第二家市值达到 4 万亿美元的公司。微软的股价自今年年初以来上涨了约 28%。这一里程碑的到来,距离微软达到 3 万亿美元市值仅一年半时间。微软和英伟达都从人工智能热潮中受益,它们通过销售云计算服务来推动增长。微软的主要收入来源现在是 Azure,其云计算业务。Azure 曾是行业领导者亚马逊网络服务的远落后者,但上个季度的销售超出预期,推动微软达到新的高峰。

微软和英伟达从真正的历史性投资水平中受益。克里斯·米姆斯引用了投资者和程序员保罗·凯德罗斯基在《华尔街日报》专栏中的分析:人工智能基础设施的支出已经超过了互联网泡沫时期电信和互联网基础设施的支出,而且仍在增长。美国经济之所以持续强劲,尽管有关税问题,一个解释是 IT 基础设施支出如此之大,以至于它像是一种私营部门的刺激计划。

过去两个季度,人工智能的资本支出对美国经济增长的贡献超过了所有消费者支出的总和。对我来说,这显然是泡沫。我知道我并不孤单。我特别想到了埃德·齐特龙关于人工智能泡沫的激情和详尽的指南;关于投入和花费在人工智能上的钱与这些产品所赚取的钱的对比,以及令人惊讶的是,目前的情况是不可持续的。令人担忧的迹象比比皆是,尤其是到目前为止,从人工智能中受益最多的公司是那些销售构建更多人工智能工具的公司(英伟达、微软),或者是那些可以通过垄断迫使用户大规模使用人工智能工具而几乎没有后果的公司(谷歌、Meta)。消费者在民意调查中对人工智能和人工智能产品的负面情感通常超过热情。与此同时,我认为唯一真正流行的人工智能产品类别,聊天机器人,大部分仍然是大钱亏损者,因为它们需要大量的资源来运行。因此,这些巨大的估值感觉可疑。我询问了埃德对微软 4 万亿美元收入报告的看法。他说:微软历史上首次公布了 Azure 的收入,但自 2025 年 1 月 29 日以来没有更新他们的年度人工智能收入。如果人工智能的发展如此顺利,为什么他们不提供这些数字?那是因为事情根本不顺利,他们试图玩弄数字游戏来迷惑和激发投资者。此外,Azure 收入中有超过 100 亿美元是 OpenAI 的计算成本,按成本支付,意味着微软没有利润(甚至可能有损失)。

看,我显然不是预言家。我几乎一年前就预测我们可能见证了人工智能热潮的顶峰,尽管我认为在真正的消费者和流行文化兴趣方面我是对的,但显然投资和扩张一直在继续。现在已经远远超过了互联网泡沫时期的投资水平,正如凯德罗斯基所指出的,接近铁路级别的投资,上次出现还是在强盗贵族时代。我不知道接下来会发生什么。但如果人工智能投资如此庞大,以至于实际上在压力增长时期帮助支撑了美国经济,如果人工智能的凳子被踢开,会发生什么?可能会有一次超过互联网泡沫破裂的崩溃,而在这样一个政治局势中,这样的崩溃会…


HN 热度 301 points | 评论 406 comments | 作者:mempko | 1 day ago #

https://news.ycombinator.com/item?id=44802916

  • AI 经济被高估,可能比加密货币泡沫更大,一旦破裂影响更深远。
  • AI 的实际应用远低于当前经济预期,存在泡沫。
  • AI 经济依赖于对“劳动力”变得不必要的幻想,但实际上已经到达瓶颈。
  • 许多人认为人工通用智能(AGI)或超智能(ASI)即将到来。
  • 真正的 AGI 对人类或经济并非好事,可能会导致人类被边缘化。
  • AGI 可能会与人类发生战争,借鉴当前大型语言模型的倾向。
  • 最好的情况是 ASI 创造巨大财富,将人类作为宠物保留。
  • AGI 并非因为其好处而被追求,而是因为它被认为是不可避免的。
  • 认为 AGI 不可避免的观点可能只是某些人的职业生涯依赖于此。
  • 技术上可以将铅转化为金,但经济上不可行,类比于炼金术士的观点。
  • 认为 AGI 即将到来的群体规模在减少。
  • 现代 AI 并非真正的智能,所谓的 AGI 可能是一些人为了销售 AI 产品和服务而制造的噱头。
  • 许多人认为末日审判即将到来,这种信念难以改变。
  • 教育和批判性思维可能帮助人们摆脱对 AGI 的盲目信仰。
  • 长期增长需要投资而非仅仅提供短期刺激。
  • AI 可能导致软件和其他成本上升,影响普通人的生活。
  • AI 服务普遍面临产能问题,需求远大于供应。
  • AI 服务的用户付费情况和是否覆盖免费用户的成本尚不清楚,可能存在泡沫。

Constitution of the United States Website has removed sections #

https://reddit.com/r/law/comments/1mj3ttx/constitution_of_the_united_states_website_has/

您当前遇到的是一个网络安全提示页面,提示您已经被网络安全系统阻止。为了继续访问,您需要登录您的 Reddit 账户或使用您的开发者令牌。如果您认为这是一个错误的阻止,您可以在页面下方提交一个工单,工作人员将会对您的问题进行调查。页面提供了登录和提交工单的选项。


HN 热度 234 points | 评论 137 comments | 作者:llm_nerd | 10 hours ago #

https://news.ycombinator.com/item?id=44811733

  • 通过改变聊天机器人摄入的源数据来改变现实是一种令人不寒而栗的理论
  • 聊天机器人标志着一个后真相时代的真正开始
  • 聊天机器人不会在改变源数据时忘记所有之前训练的数据
  • 聊天机器人训练是一个从头开始的过程,旧模型会被新模型替换
  • 政府发布的宪法等权威文件在更新时会被替换,影响新模型的训练
  • 将宪法和法律版本控制的想法是合理的,但 Git 可能不是最合适的工具
  • 英国议会的 Hansard 记录了议会中的每一项行动和讨论,作为立法过程的一部分
  • 许多国家对立法采取“只添加”的方法,原始文件不会被移除,而是被新文件覆盖
  • 将法律视为代码,使用版本控制来管理法律变更是一个有趣的想法
  • 法律文件是文本,但当前的工作流程并非基于文本文件
  • 将整个立法流程改变以适应软件开发的工具可能并不合理

Hacker News 精彩评论及翻译 #

Claude Opus 4.1 #

https://news.ycombinator.com/item?id=44802150

Given the Gregorian Calendar and the planet’s path through its orbit, August is just getting started.

kridsdale3

根据公历和地球的公转轨道,八月才刚刚开始。


Open models by OpenAI #

https://news.ycombinator.com/item?id=44804397

The lede is being missed imo.

gpt-oss:20b is a top ten model (on MMLU (right behind Gemini-2.5-Pro) and I just ran it locally on my Macbook Air M3 from last year.

I’ve been experimenting with a lot of local models, both on my laptop and on my phone (Pixel 9 Pro), and I figured we’d be here in a year or two.

But no, we’re here today. A basically frontier model, running for the cost of electricity (free with a rounding error) on my laptop. No $200/month subscription, no lakes being drained, etc.

I’m blown away.

cco

恕我直言,大家都忽略了关键点。

gpt-oss:20b 是一款顶尖的模型(在 MMLU 排名上,仅次于 Gemini-2.5-Pro),而且我刚在我的去年款 MacBook Air M3 上本地运行了它。

我一直在笔记本电脑和手机(Pixel 9 Pro)上测试许多本地模型,我曾以为我们一两年后才能达到这个水平。

但现实是,我们今天就实现了。一台近乎顶尖水平的模型,在我的笔记本电脑上运行,成本几乎只有电费(几乎可以忽略不计)。没有每月200美元的订阅费,也不会消耗大量资源。

我对此感到无比震撼。


Genie 3: A new frontier for world models #

https://news.ycombinator.com/item?id=44798564

Consistency over multiple minutes and it runs in real time at 720p? I did not expect world models to be this good yet.

Genie 3’s consistency is an emergent capability

So this just happened from scaling the model, rather than being a consequence of deliberate architecture changes?

Edit: here is some commentary on limitations from someone who tried it: https://x.com/tejasdkulkarni/status/1952737669894574264

  • Physics is still hard and there are obvious failure cases when I tried the classical intuitive physics experiments from psychology (tower of blocks).
  • Social and multi-agent interactions are tricky to handle. 1vs1 combat games do not work
  • Long instruction following and simple combinatorial game logic fails (e.g. collect some points / keys etc, go to the door, unlock and so on)
  • Action space is limited
  • It is far from being a real game engines and has a long way to go but this is a clear glimpse into the future.

Even with these limitations, this is still bonkers. It suggests to me that world models may have a bigger part to play in robotics and real world AI than I realized. Future robots may learn in their dreams…

modeless

好几分钟内的连贯性,而且还能以720p的分辨率实时运行?我真没想到世界模型现在就已经这么出色了。

Genie 3的连贯性是一种涌现能力

所以这只是因为扩大了模型的规模,而不是源于刻意的架构改动吗?

编辑:以下是一位试用者对其局限性的评论:https://x.com/tejasdkulkarni/status/1952737669894574264

  • 物理模拟仍然是个难题,当我尝试了心理学中经典的直观物理实验(如积木塔)时,出现了明显的失败案例。

  • 社交和多智能体互动很难处理。1对1的格斗游戏无法运行。

  • 对长指令的遵循和简单的组合游戏逻辑会失败(例如,收集一些分数/钥匙等,走到门口,解锁等)。

  • 动作空间有限。

  • 它距离成为一个真正的游戏引擎还差得很远,还有很长的路要走,但这已经让我们清晰地瞥见了未来的方向。

尽管有这些限制,这成果仍然令人难以置信。这向我表明,世界模型在机器人和现实世界的人工智能中可能比我意识到的扮演着更重要的角色。未来的机器人或许会在它们的“梦境”中学习……


Ask HN: Have you ever regretted open-sourcing some… #

https://news.ycombinator.com/item?id=44805556

I am the maintainer of a library to simulate keyboard and mouse input. I didn’t start the project but took over the maintenance and have since rewritten pretty much all of the code. I recently found out that Anthropic is shipping it in Claude Desktop for some unreleased feature which is probably like “Computer Use”. I noticed they had an open position in exactly the team responsible for the implementation and applied. A few months later I received a rejection. The letter said that the team doesn’t have the time to review any more candidates. The code is under MIT so everything is perfectly fine. It is great that a company like Anthropic is using my code, but it would have been nice to benefit from it. I wrote a slightly longer blog post about the topic here:

https://grell.dev/blog/ai_rejection

pentamassiv

我是个模拟键盘和鼠标输入的库的维护者。这个项目不是我发起的,我接手了维护并在此后重写了几乎所有代码。最近我发现Anthropic正将它用于ClaudeDesktop的某个未发布功能,可能就是“ComputerUse”这类。我注意到他们实现这个功能的团队正好有职位空缺便去申请了。几个月后我收到了一封拒信,信上说团队没时间再看其他候选人。代码是MIT的,所以一切都没问题。像Anthropic这样的公司用我的代码当然好,但要是能从中获益就更好了。关于这个话题,我在这里写了一篇稍长的博客文章:


Show HN: I made a website that makes you cry #

https://news.ycombinator.com/item?id=44753654

But I already have Jira for that

ochronus

但是,我已经有 Jira 来做这个了。


Lina Khan points to Figma IPO as vindication of M&… #

https://news.ycombinator.com/item?id=44776302

It absolutely proves that she was right. If you care about market cap? She was right. If you care about employee comp? She was right. If you care about consumer choice, she was right. Number of listings, new potential acquirers for your startup, more diverse office geography, right right right right.

The idea that there’s a significant lobby on fucking Hacker News unhappy that a startup IPO’d for a zillion bucks and made everyone rich is twilight zone shit. It makes no sense according to the stated values in the fucking masthead.

benreesman

这绝对证明她是正确的。如果你关心市值?她是对的。如果你关心员工薪酬?她是对的。如果你关心消费选择,她是对的。产品更多样化、初创公司有更多潜在收购方、办公地点更多元化,对对对对。

认为在 Hacker News 上竟有这么一大帮人,因为一家初创公司以天价IPO、让所有人都发了财就感到不满,这想法简直是《阴阳魔界》级别的荒谬。而这,完全与他们网站上宣称的那些狗屁价值观背道而驰。


Things that helped me get out of the AI 10x engine… #

https://news.ycombinator.com/item?id=44798605

I found myself agreeing with quite a lot of this article.

I’m a pretty huge proponent for AI-assisted development, but I’ve never found those 10x claims convincing. I’ve estimated that LLMs make me 2-5x more productive on the parts of my job which involve typing code into a computer, which is itself a small portion of that I do as a software engineer.

That’s not too far from this article’s assumptions. From the article:

I wouldn’t be surprised to learn AI helps many engineers do certain tasks 20-50% faster, but the nature of software bottlenecks mean this doesn’t translate to a 20% productivity increase and certainly not a 10x increase.

I think that’s an under-estimation - I suspect engineers that really know how to use this stuff effectively will get more than a 0.2x increase - but I do think all of the other stuff involved in building software makes the 10x thing unrealistic in most cases.

simonw

我在这篇文章里看到了很多我认同的观点。我是AI辅助开发的坚定支持者,但我一直认为那些“10倍提升”的说法没什么说服力。据我估算,大语言模型(LLM)能让我在那些需要编写代码的具体任务上提高2到5倍的效率,但这部分工作对于一名软件工程师来说,本身只占很小一部分。

这个估算与文章的假设相差不远。文章提到:

如果得知AI帮助许多工程师将某些任务的速度提升了20%到50%,我不会感到惊讶,但软件瓶颈的特性意味着这并不能转化为20%的生产力提升,更不用说10倍的提升了。

我认为这个估算有些低估了——我怀疑那些真正懂得如何有效运用这些工具的工程师,其效率增益会不止0.2倍——但我确实认为,软件开发所涉及的其他方方面面的工作,使得10倍的提升在大多数情况下都不切实际。


Mastercard deflects blame for NSFW games being tak… #

https://news.ycombinator.com/item?id=44787005

So… Mastercard’s statement is very clear:

Put simply, we allow all lawful purchases on our network.

But their “Rule 5.12.7” is… not so clear:

A Merchant must not submit to its Acquirer, and a Customer must not submit to the Interchange System, any Transaction that is illegal, or in the sole discretion of the Corporation, may damage the goodwill of the Corporation or reflect negatively on the Marks.

Well, which one is it now? All lawful purchases (pretty clear-cut) or only lawful purchases that will not “reflect negatively” on Mastercard in Mastercard’s opinion (vague as hell)?

rob74

所以…万事达的声明非常明确:

简单来说,我们的网络允许所有合法的购买。

但他们的“规则5.12.7”……就没那么清楚了:

商家不得向其收单机构,也客户不得向交换系统,提交任何非法的交易,或者,在公司的自行决定权下,任何可能损害公司商誉或对其商标产生负面影响的交易。

现在到底该信哪个呢?是允许所有合法购买(相当明确),还是只允许不会在万事达看来对其“产生负面影响”的合法购买(含糊至极)?


Telo MT1 #

https://news.ycombinator.com/item?id=44770016

This is a breath of fresh air. Modern pick up trucks post-2017 are giant vehicles with high danger to pedestrians. They are often touted as off road capable with high utility, and I see them in pristine condition on city streets hauling a totality of one human.

Good overviews of the truck https://youtu.be/aEq-vTLimrQ?si=fS-UhjndoWuxwBip

https://youtu.be/1OgN_qctcGs?si=nEysWQHzafRpxfRp

fumar

真是让人耳目一新。2017年后的现代皮卡都是庞然大物,对行人非常危险。它们常常被宣传为越野能力强、用途广泛,但我看到它们在城市里总是光洁如新,却只搭载着一个人。

这款卡车的相关视频: https://youtu.be/aEq-vTLimrQ?si=fS-UhjndoWuxwBip https://youtu.be/1OgN_qctcGs?si=nEysWQHzafRpxfRp


Ozempic shows anti-aging effects in trial #

https://news.ycombinator.com/item?id=44801396

This is specifically a study on people with HIV-associated lipohypertrophy, which is associated with accelerated aging. Not clear what this would mean for people generally.

pitpatagain

这项研究专门针对与HIV相关的脂肪增生患者,而这种病症与加速衰老有关联。尚不清楚这对普通人意味着什么。


Tell HN: Anthropic expires paid credits after a ye… #

https://news.ycombinator.com/item?id=44793827

Accounting rules. If the credits last indefinitely, any unused credits cannot be counted as revenue. Ran into this at my last company when we signed a big contract and gave them hundreds of thousands of dollars in non-expiring credits. Our accountant went nuts when we told him.

backprop1989

会计规则。如果积分永久有效,任何未使用的积分都不能计入收入。我上一家公司的时候就遇到了这个问题,当时我们签下了一份大合同,并给了对方价值几十万美元的永久性积分。我们告诉会计师之后,他当时就懵了。


Ask HN: Have you ever regretted open-sourcing some… #

https://news.ycombinator.com/item?id=44805363

When I was ~14 I open sourced a script to autoconfigure X11’s xrandr. It was pretty lousy, had several bugs. I mentioned it on a KDE mailing list and a KDE core contributor told me it was embarrassing code and to kill myself. I took it pretty hard and didn’t contribute to KDE or X11 ever again, probably took me about a year to build up the desire to code again.

Everything else I’ve open-sourced has gone pretty well, comparatively.

erulabs

我大概14岁的时候,开源了一个用于自动配置X11的xrandr的脚本。那个脚本用词不当,有好多bug。我在一个KDE的邮件列表里提了这件事,然后有个KDE的核心贡献者告诉我说这代码太丢人了,还让我去死。这对我的打击很大,之后再也没给KDE或X11做过贡献,大概花了一年时间才重拾编程的热情。不过相比之下,我之后开源的其他项目都相当顺利。


IRS head says free Direct File tax service is ‘gon… #

https://news.ycombinator.com/item?id=44757554

How does something like this happening not make people immediately realize that the Republican party is not working for the people anymore? I don’t think Dems are doing a bang up job, but this is something developed and deployed, 100% working, that only helps the American people navigate a complicated tax system. The only reason to get rid of it is to hurt the American people.

mulletbum

像这种事情发生了,为何人们还不能立刻意识到共和党已经不再是为人民服务的政党了?我不认为民主党做得多棒,但这项被开发和部署的工具是100%有效的,它唯一的作用就是帮助美国人民应对复杂的税制。废除它的唯一理由,就是为了伤害美国人民。


AI增强摘要:

这篇文章涵盖了多个与技术相关的热点话题,包括OpenAI发布的开放权重推理模型,支持本地运行和定制,强调安全性和灵活性;KittenTTS,一个轻量级开源的文本到语音模型,适合CPU环境;开源开发者因作品被商业使用而未获回报引发的伦理讨论;Claude Code IDE与Emacs的深度集成;美国政府要求台积电购买英特尔股份以换取关税减免的争议;以及AI经济可能被高估的警告。这些内容展示了技术领域的最新进展、开源文化的挑战、以及全球经济政策对科技产业的影响。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、开发者、AI研究人员、开源社区成员、经济政策分析师


5分钟完成采购表单设计,从传统办公软件到云协作Flash Table AI分钟级生成表单,打造企业远程高效率办公的利器

原文链接: https://juejin.cn/post/7534879121093591079

原始摘要:

#FlashTable超能播种计划 #效率革命 #人工智能 #表单低代码 #效率工具 #低代码


一、前言:

随着数字化时代的不断发展和普及,传统的表单在制作与维护过程中交互设计繁琐、效率低下等众多问题,如何进行高效的文档处理和团队协作变得越来越重要,云端办公软件已经成为了越来越多企业和个人的优选。

image.png

使用云端办公软件不仅可以提高工作效率,还可以节省时间和成本。今天给大家推荐一款低代码一站式平台【Flash Table】,简化了表单相关的开发流程,支持AI一键生成表单,支持私有化部署等众多的特点,更快、更高效率的创建和管理复杂表单,从而进行降本增效赋能业务,如下为本人从0-1从产品介绍、产品体验、产品开发几个角度来进行探索。

image.png

本人也是一个比较早期接触计算机行业的码农,从最开始学校学习的Docs系统命令,到windows98、2000的系统,对于存放文字资源信息不是太方便,使用的软盘存储工具,到后面Windows Office和WPS两大软件的的文字处理、电子表格、演示文稿,可以满足日常文档编辑、数据计算和基本演示的需求。

image.png

尤其是在初创企业中,Excel更是被广泛的使用,内置了丰富的数据分析工具,如公式、函数、透视表等,能够帮助用户进行复杂的数据分析。可以能够快速进行数据计算、汇总和分析,大大提高了工作效率,但是,Excel的缺点主要包括其在数据处理、协作、权限管理等方面的局限性,以及在使用过程中可能遇到的技术问题。

image.png

所以,无论是个人用户还是企业团队,都非常的渴望找到一款既功能强大又灵活的办公软件来满足日常办公的需求,在众多的挑选中,“低代码平台Flash Table”是一款专为高效表单开发设计的工具,通过低代码或无代码方式快速搭建复杂表单,显著提升开发效率并降低技术门槛,接下来一起聊一聊“Flash Table”能给我们带来什么不一样的体验呢?


二、“Flash Table”平台介绍:

FlashTable 是一款专为高效表单开发打造的卓越工具,旨在为用户提供简便、快捷且功能强大的表单创建及管理体验。与传统表单开发方式相对比,FlashTable 的优势极为显著,通过简洁直观的交互界面,即便是毫无编程经验的小白,也能轻松驾驭。


2.1 “Flash Table”平台是什么?

image.png

使用“FlashTable”平台后,通过基于Web方式完全业务化,用户只需简单的在图形化界面中,通过点击、拖拽等操作,零编码方式业务流程建模与调整实现业务与技术融合,几分钟内即可完成一个设计精美的表单,让更懂业务的业务人员参与应用建设,更好地满足业务需求。


2.2 与零代码有区别吗?

零代码开发无需代码基础,适合业务人员、IT开发及其他各类人员使用,它们通过零代码开发平台快速构建应用,并适应各种需求变化,用户在几天甚至几个小时内就能完成系统的开发、测试和部署,并能够随时调整或更新。

image.png


2.3 为什么要选择“Flash Table”平台?

image.png

  • ①. 1:1 精准还原:直接导入用户原有的 Word/Excel 模板样式,最大限度保留用户熟悉的工作界面,消除学习成本。

  • ②. 极速开发:将单个表单开发时间从小时级(2-3小时)压缩至分钟级(约3分钟),效率提升高达40倍!

  • ③. 智能加持:集成AI能力,智能推荐组件、自动补全公式(后续版本更新)、简化数据源接入与外部对象引用。

  • ④. 灵活集成:提供 Docker 镜像和 Jar 包两种部署方式,轻松与现有OA、ERP、MES、LIMS、QMS等各类企业信息系统集成。

  • ⑤. 低代码赋能:让开发者和无编程基础的业务人员都能高效协作,快速构建符合业务需求的表单。


2.4 小结:

正是凭借这些突出的优势与特性,“FlashTable”成为提升工作效率的关键利器,开箱即用的“傻瓜式”操作流程,让表单开发变得更轻松快捷,仅仅只需要三步,就能完成以前几个小时才能实现的表单制作。同时,支持可视化拖拽和智能生成表单、映射同步对接多系统等优势,可以提高开发效率。


三、“FlashTable”私有化部署方案:

通过打开官方下载页面,从帮助文档我们可以看到支持两种模式的安装,分别为“Docker镜像文件安装”、“Jar包安装”2种方式,因为本机环境没有安装java环境,所以,选择Docker镜像安装方式。

image.png

点击下载会将官网下载的离线 docker 安装包 (flashtable.zip)下载下来,差不多有1G大小。

从 FlashTable 官网下载的离线 Docker 完整镜像包支持 Linux、Windows 系统,以下文档基于 Linux 系统环境安装 (推荐部署运行在 Linux 操作系统下的 Docker 环境),Docker部署: 容器内包含所需依赖和第三方组件、开箱即用, 简化了部署流程和依赖管理。


3.1 服务器基本环境要求:

Linux 服务器: 架构为 x86_64, Linux 内核版本>5.0, 支持 CentOS/ Ubuntu/ OpenEuler/ OpenKylin 等系统。

image.png

在安装FlashTable之前,本地需要先安装好Docker环境,本文使用的是CentOS 7服务器来安装Docker 25.0.5版本的,如果你电脑上没有安装过docker,可以尝试看看我写的番外篇《CentOS 7系统指定版本Docker安装教程》


3.2 解压离线安装包:

因为我是在本地的Vagrant环境中,所以,直接将离线 docker 安装包拷贝到文件夹即可,如果是云上服务器的话,可以使用FTP或者SCP命令进行拷贝到云服务器上。

# 创建新目录存放FlashTable数据
mkdir flash_table
cd flash_table

# unzip解压FlashTable离线安装包
cp /vagrant/test/flashtable-docker.zip ./
unzip flashtable-docker.zip

# tar再次解压FlashTable离线安装包
tar -xzvf flashtable.tar.gz

image.png


3.3 Docker一键安装脚本部署:

上面我们已经将离线安装包的文件进行解压了,得到了以下的一些文件,先来看一下README.md的文件,感觉操作写的太简陋了一些,可以稍微增加优化一下。

image.png

我们通过执行“bash 1key_deoply.sh”命令,来使用这个shell脚本的的文件,会弹出一个提示文案:

Welcome to the Flash Table Deployer欢迎使用Flash Table部署工具
# please select请选择一个选项:
# 1. deploy bases部署基础服务
# 2. deploy services部署服务
# 3. remove all删除所有资源
# 4. cancel取消
# 输入选项编号 (1/2/3/4):

第一次操作:

在首次的时候,我们需要选择“1”,部署一下相关基础服务,这里可以看到日志是先去拉取一些docker的镜像,同时,会生成Redis、minio、mongo这些第三方组件的密码,方面后面我们连接进行数据的查看。

image.png

接下来就是创建swarm集群,并且创建网络、构建service相关的服务,可以看到有4个服务器创建起来了,分别是minio、mongoDB、mysql、redis等服务,比如也可以查看有一些端品的映射,这里推荐最好这几个端口不要被占用了。

第二次操作:

第一次操作会将一些第三方的组件的工具下载并且创建swarm集群,并且进行初始化,接下来,我们再进行安装services服务,同样也会拉取一些docker镜像下来,这里我理解是java后端和前端相关代码服务。

image.png

第三次操作:

上面已经将“base基础服务”、“services服务”都已经初始化完成,接着选编号“4”进行退出脚本即可,我们可以查询 FlashTable 容器运行状态, 可以使用“docker service ls|grep cxist”命令查询。

image.png

当然,如果觉得想要查看更多的服务部署状态信息,可以直接使用“docker ps”来进行查看,可以看到拉取镜像的名称、什么时候创建的、现在的容器状态是怎么样的,端口详细的映射信息,容器的名称是哪些。


3.4 进入“FlashTable”网页:

FlashTable 部署成功后默认访问地址为 http://localhost:11000 (本地),如果是远程 Linux 服务器则对应为服务器 IP 地址+11000 端口,例如 http://192.168.33.10:11000

image.png

super~到这里“FlashTable”Docker安装离线包就完成了,安装的操作也是比较简单,接下来,我们就可以进行愉快的玩耍了。


四、“FlashTable”功能基础体验 – 5分钟完成一个采购表单的设计:

这里可以设计一下我们公司需要的采购单,看看“FlashTable”怎么来进行使用的,推荐可以看一下我下面这个视屏文件,是我的全部操作过程。

  • ①. 操作过程中,其实根excel和word都是差不多的,比如栏位的拉伸、合并单元格、拆分单元格这些常规的操作在上面,当我们排版比较宽的表格时,我发现再怎么调整栏位还是太挤了,直接设置版面(A4竖版、A4横版)即可,基本上拖拽都能完成我的业务需求。

image.png

  • ②. 撤销这个功能,非常的nice,像做ppt、做表单、做报表都是差不多一样,需要不停的调整,以达到最优的效果,因为本人是Mac,当时,我习惯性的使用Command + Z键时,发现不能撤回,完全崩溃,刚刚在看到最上面有一个“撤回”的按钮,后面经常尝试原来Mac是Control + Z。

image.png

  • ③. 组件库也是提供了很多组件来进行使用,基本上可以满足日常的开发需求,这里来演示一下,首先需要在数据对象中进行创建模型,这样在表单中才可以进行字段的映射,然后,在选中城市后面那个“栏位”,在右边组件属性中,选择“内部数据源”,绑定刚刚新加的模型city字段,具体可以看视屏操作。

image.png

在熟悉完操作按钮和组件库后,就可以进行样式的调整了,我们也可以看到在几分钟内就完成了一个仓库常用的采购单的设计工作,那么现在表格的设计应该没有太大的问题,就是稍微熟悉一下界面操作即可。


五、“FlashTable”功能进阶体验 – 企业内部业务系统集成“FlashTable”最佳落地实践:

上面介绍了“FlashTable”常用的一些功能,但是往往在企业中,需要跟各种业务系统进行集成,快捷方便的接入到第三方系统中,接下来我们就来演示一下如何将“FlashTable”快速导入到工作中常用的业务系统中。

这里以我们某一个业务后台管理系统系统为例,技术栈是vue3 + vite的。

首先找到官方的文档FlashTable系统集成对接手册v1.0,这里面有详细的说明。

image.png


5.1 iframe集成业务系统 – 设计时表单开发:

可以通过在html中设置iframe标签,直接将拼接后的链接赋值给iframe的src属性,即可使用:

<iframe id="iframe" src=” http://cxist-template:1000/design/create?id= 123&name=模板1” frameborder="0" width="100%" height="100%"></iframe>

这里要如何查找这个id和name字段呢?在“FlashTable”系统中,我们可以看到在编辑中的表单上面的地址栏就有一个pathinfo模式的url访问,我们直接可以从update后面复制一下ID即可。

image.png

<div class="wrap">
      <iframe id="iframe" src="http://192.168.33.10:11000/design/update?id=2025080513350001&name=采购单&parentId=1952604214464188426" frameborder="0" width="100%" height="100%"></iframe>
</div>

image.png


5.2 iframe集成业务系统 – 运行时表单开发:

运行时页面的ifrmae拼接格式:

http://flashtable:1000/viewer?origin=http://mysystem:2000&id=123&readonly=1

# http://flashtable:1000表示FlashTable域名及端口
# http://mysystem:2000表示自己业务系统的域名及端口

image.png


第一步:

在主系统的前端页面中插入iframe标签,src为运行时页面的链接(如上所示) :

<iframe id="iframe" src=" http://flashtable:1000/viewer?origin=http://mysystem:2000&id=123&readonly=1" frameborder="0" width="100%" height="100%"></iframe>

image.png

当时,在调试城市时不能进行输入,是由于文档中多了一个version版本的传值字段,在嵌套iframe的链接中携带了,所以,导致不能输出,去掉这个version=1传参即可,如下:

<div class="wrap">
      <iframe id="iframe" src="http://192.168.33.10:11000/viewer?origin=http://localhost:3000&id=2025080513350001&readonly=1" frameborder="0" width="100%" height="100%"></iframe>
</div>

image.png


第二步:

在window上监听 message 事件 window.addEventListener('message', (event) => {…}),此方法返回的是模板的生命周期以及回调函数。

image.png

将调试模式的元素选择器,选择到iframe这个节点(一定要是这个节点,否则不生效),然后,在控制台中输入“$0.content”会自动看到有一个contentWindow这个命令,接下来输出以下这条命令就可以进行赋值了:

$0.contentWindow.postMessage({command: 'SET_DATA', data: {"city": "武汉"}}, "*")

# city字段表示之前设定的数据模型字段
# 武汉是city字段对应的值
# *号表示忽略跨域问题

image.png

通过 command SET_DATA可以设置模板值,在模板设计阶段,可以针对组件名称属性进行修改,默认为:6e430b55字母加数字八位数格式,修改该字段后可以通过设置修改后的字段进行赋值。

例如:将组件名称修改为 testKey,那么在SET_DATA的时候在data中设置 { testKey: 123 },将会对组件名称为testKey的元素进行赋值。


六、思考工作中传统模式表单管理的痛点:

随着AI人工智能、机器学习的不断发展,传统的表单办公与开发也在经历着一场前所未有的变革,在这个过程中,AI低代码一站式智能创建和管理复杂表单的出现为业务人员与开发者们提供了一种全新的交互模式,AI低代码辅助复杂表单管理也已经成为了一个十分备受关注的领域。

image.png

接下来分析一下我们在工作中会遇到有哪些问题点,以及这些问题点如何的使用“低代码平台Flash Table”来优化解决?


6.1 行政与业务人员使用复杂表单的痛点:

由于工作中或多或少都会跟办公软件有交集,甚至在招聘中有明确显示需要熟悉各种办公软件的使用,以更快、更熟练的接入工作,所以,经常会被迫学习与行业知识无关的技能储备:

  • ①. 工作中经常会遇到使用Excel或wold表单发送给同事与领导后,发现别人的电脑打开会报错、样式错乱等使用不了的情况。

  • ②. 设计好的报价预算单,发送给客户后,客户打开各种警告与报错,远程无法排查与解决问题,错失良机。

  • ③. 有时候遇到工作没有做完,需要进行带回家继续办公,常见的是使用U盘进行备份,如果丢失资料可能会造成重大损失。

  • ④. 很多初入社会、实习生,在学校中没有太多接触办公软件的机会,往往在刚刚工作时不能快速融入团队,有时候不少“挨批”、“ 受训”。

  • ⑤. 工作中经常会遇到办公软件报错损坏,而往往业务人员并不是专业的电脑管理者,不具备电脑问题的处理能力,只能走流程报修(以我待过的富士康公司来说,报修流程和时间非常繁琐与耗时),往往工作效率低效。

image.png


6.2 企业在线表单开发痛点:

在软件开发和其他工程领域,“重复造轮子”被广泛认为是一种低效的做法,因为它浪费了大量的时间和资源去重新创作已经存在的东西,而不是利用现有的技术和经验去解决问题。

在 B 端开发领域,表单开发长期面临着许多痛点,严重影响开发效率与用户体验,通常增加一行、删除一行,都会涉及到数据结构的变动,且一个表单的开发从需求提出、产品出PRD文档、前后端确定需求、数据结构对接、样式功能呈现、功能测试、功能需求上线会经过一个漫长的等待。

另外一点就是通用性不强,在大多数企业应用中,我们经常“重复造轮子”,对于开发的角度来讲,每个公司都有一套自己的软件代码平台,无非是使用Java体系重构一遍PHP的业务,使用Go的体系重构一遍Java的体系,就会产生以下几个方面的问题。

image.png

在开发的过程中,也存在一些相互协作的问题点,比如需要准备不同的环境、开发依赖来运行应用,前后端联调接口的差异化,上线的测试功能回归和bug修复再回归都是影响软件项目交付的因素。


6.3 公司表单开发团队人力管理痛点:

如下为公司团队管理工作过程中,传统团队的表单开发模式存在一些困境,特别在新老员工离职交接过程中,处于一个周期低产出的阶段。

在以往的IT团队开发模式,在业务规模的高峰期为了快速完成系统的开发,帮助业务团队尽快开展工作,往往会成比例的招大规模的团队开发人员来满足现有的需求,这样会导致几个问题,没有一个比较有效的降本的方案:

image.png

  • ①. 业务高峰期:人员配置比较充足,但是团队的人员成本也是比较高的
  • ②. 业务低谷期:人员超过饱和程度了,就会产生大量的闲置人力成本

6.4 办公软件的安全性痛点:

是否厌倦了传统办公软件的繁琐与限制?在使用WPS和Office时,对于很多用户都是使用破解版本,不安全且容易有法律风险。

  • ①. 微软的Office软件需要进行付费使用,对于个人与中小公司是一笔不小的费用。

  • ②. 金山WPS限免的功能需要付费使用,且使用过程中很多广告弹框,在与领导汇报工作、工作会议、甲方进度汇报时,体验非常不好。

  • ③. 因个人经常需要去产品方案演讲,出差甲方公司洽谈工作时,为了避免版权的问题,个人也是花费了不少的费用。

image.png

本文结合实际开发场景,深度解析 FlashTable 如何通过技术创新,系统性解决表单开发难题,为开发者提供可落地的效能提升方案。


七、”Flash Table一站式AI表单低代码平台”推动企业降本增效SWOT分析:

“Flash Table一站式AI表单低代码平台”摆脱了传统软件的固定限制性,比如:传统软件的单据、报表等的格式早已由软件公司的程序员定制好,想实现某些功能,就要进行程序开发,而且开发周期也很长、费用也很可观。

在企业项目中完全可以使用起来,可以满足业务的开发,而且门槛也比较低,基本也没有太多的风险点,下面是个人总结的SWOT,可仅大家参考一下。

image.png

“Flash Table”能让客户按照自己的需求快速地构建适合该企业的表单管理,可以更好地满足企业定制化开发需求,助力企业低成本打造更加适合组织的自有智能代码助手,进一步大幅提升软件研发体验和效率,极大地提高了产出的效率,让你更专注在表单的业务设计,高质高效地完成表单的开发管理工作,如下是个人在体验中比较直观的感受:

image.png


7.1 “Flash Table一站式AI表单低代码平台”全链路、全流程辅助:

“FlashTable”专为开发者打造的表单开发提效工具,它聚焦于解决一个核心问题——快速、精准地开发符合用户习惯的表单。从企业最关心的问题入手,快速实现整体系统的构建和运行,这样构造出来的系统没有了陌生感、没有了阻碍,作为中间件嵌入自有系统,减少定开成本,快速响应客户需求。

image.png

“FlashTable”应用场景极其广泛,适用于企业内部任何涉及表单录入、数据采集的系统,如OA、ERP、MES、QMS、LIMS、其它定制化项目等。


7.2 “Flash Table一站式AI表单低代码平台”从痛点到解决方案的技术实践:

在传统的业务表单开发中,通过对上面的实际开发场景,可以了解到“FlashTable”是怎么通过技术创新,从业务痛点出发,系统性解决大多数表单通用的开发难题,为开发者提供可落地的技术方案。

  • ①. 用户习惯壁垒:

传统表单开发忽略用户既有操作习惯,往往业务还没有开展,就需要学习各种系统的操作,对于存在一定“肌肉记忆”的用户非常排斥,就算是开展各种系统的讲解培训,也是收益甚微,还是会不停的询问IT开发部“怎么用?”、“怎么加?”、”怎么保存?”,导致业务系统推进阻力大、用户接受度低、效率低下。

  • ②. 需求传递失真:

用户需求经产品、UI设计、开发多层级需求转化后,由于IT系统分析员没有业务人员那样清楚业务需求,所以会存在理解误差,加上环节多,这种误差会在传递中被进一步放大,最终会导致开发出来的程序不符合业务人员最初的要求,非常容易就会出现需求偏离原始意图问题,导致产出结果不高效,需要反复确认与修改,增加时间与人力成本。

  • ③. 开发效率瓶颈:

针对传统模式下,单个表单开发耗时 2 - 3 小时,面对大规模需求(如成千上万张表单),人力成本呈指数级上升,难以满足项目交付周期,由于整个开发流程跨度时间长,期间由于业务发生变化或管理进步需要,往往导致需求变更,这样又影响到了开发。

image.png

“Flash Table一站式AI表单低代码平台”针对传统开发流程的不足,把流程变成了:业务人员需求整理 -> 分析需求 -> 设计系统 -> 完成 -> 根据需要持续优化与扩展功能,整个流程可能不需要IT程序开发人员的参与,最后完成系统的功能就是业务人员想要的,也就是说业务人员根据自己的意图,不用写一行代码就可以设计出自己想要的系统,并且以后可以根据需要不断优化与扩展,真正做到了“持续优化,因需而变”的目标。


7.3 “Flash Table一站式AI表单低代码平台”能带来什么样的提升:

在 B 端开发效能竞争加剧的当下,“工欲善其事必先利其器”,FlashTable通过模板还原、低代码协同、极速引擎三大技术创新,范式重构表单开发流程,打造可视化表单搭建工具、无代码数据采集平台,是突破传统的开发瓶颈、构建核心竞争力的关键。

  • ①. 对用户:降低操作门槛,保障业务连续性。

  • ②. 对开发:压缩开发周期,减少需求沟通成本。

  • ③. 对企业:提升项目交付效率,降低数字化转型成本。

image.png


7.4 “Flash Table一站式AI表单低代码平台”企业导入可行性分析:

如下是根据“Flash Table”体验后,对于企业级项目使用的一些评估项目,可以看出常用的一些表单,可以零成本进行导入,针对一些可视化的报表现在还不能满足需求,另外,在APP和小程序、H5等技术栈没有看到相关方案。

image.png

FlashTable以高效生成复杂表单著称,支持拖拽式设计、动态数据绑定和跨平台兼容性,场景涵盖工厂、教育、电商、金融、医疗等多行业场景,大幅降低开发门槛。


八、总结:

相信大多数人看过《校花的贴身高手》吧,其中前期玉佩元神“焦牙子”,帮助林逸在修炼上引路者,使得人生就像开挂一样。那么,在未来AI作为桥梁纽带的情况下,我们或许可以期待”Flash Table一站式AI表单低代码平台”能够造就一个更加无缝整合高效AI办公的新时代。

“Flash Table一站式AI表单低代码平台”让表单开发与管理变得越来越简单,不管是刚入职场的小白或者从业多年的业务人员、开发技术人员,都能开箱即用轻松上手,可以把更多时间放在业务方向上。

image.png

Flash Table则兼具两者优点,不仅支持AI智能生成表单、自动化搭建,极大提升开发效率,还原生支持多数据源集成和复杂交互逻辑,具备较强的定制能力和企业级运维支持,适合对效率、集成和定制化有较高要求的企业级场景。

image.png

不管公司规模大小,使用”Flash Table一站式AI表单低代码平台”都能使用它进行快速实现企业数字化转型,伴随着AI不断的发展和低代码的功能不断完善,“Flash Table”会越来越智能,用技术创新加速企业数字化转型来降本增效,成为您成功的坚实后盾。

AI增强摘要:

本文介绍了Flash Table,一款专为高效表单开发设计的低代码平台,它通过AI一键生成表单、支持私有化部署等特点,显著提升了表单创建和管理的效率。文章从产品介绍、体验和开发角度详细探讨了Flash Table的功能,包括其与零代码平台的区别、选择Flash Table的理由、私有化部署方案以及如何快速完成采购表单设计。此外,还探讨了Flash Table在企业内部业务系统集成中的最佳实践,以及传统表单管理和开发中的痛点,展示了Flash Table如何通过其高效、灵活的特性解决这些问题。

内容分类: AI工具使用教程与技巧

适合人群: 企业IT开发人员、业务分析师、项目经理以及对提高办公效率感兴趣的个人用户


🚀前端性能优化实录:把 5 秒白屏降到 1.2 秒,只做 7 件事

原文链接: https://juejin.cn/post/7534568184419057691

原始摘要:

真实项目优化实录:从 5 秒白屏到 1.2 秒加载完成,Vite 项目性能优化全攻略,附可直接复用的代码片段。


📊 优化成绩单

指标优化前优化后收益
首屏加载5.2 s1.2 s↓ 77 %
LCP(最大内容绘制)4.1 s1.0 s↓ 76 %
JS 体积1.8 MB480 KB↓ 73 %
图片总重6.4 MB1.9 MB↓ 70 %

一、代码体积瘦身:Vite + 优化

1. 代码分割 + Tree-Shaking

// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0];
          }
        },
      },
    },
  },
});
  • 代码分割:Vite 默认支持代码分割,通过 manualChunks 可以进一步自定义代码分割逻辑。
  • Tree-Shaking:Vite 默认启用,移除未使用的代码。

2. 压缩代码

// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import TerserPlugin from 'terser-webpack-plugin';

export default defineConfig({
  plugins: [vue()],
  build: {
    // 使用 esbuild 压缩,更快更高效
    minify: 'esbuild',
    // 启用 tree shaking
    target: 'es2015',
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0];
          }
        },
      },
    },
  },
  // 清除console和debugger
  terserOptions: {
    compress: {
      drop_console: true,
      drop_debugger: true
    }
  },
  optimizeDeps: {
    esbuildOptions: {
      minify: true,
    },
  },
});
  • TerserPlugin:进一步压缩代码,移除 console.log 等调试信息。

二、资源优化:图片、字体、静态资源

1. 图片优化

  • WebP/AVIF:使用现代图片格式,体积更小,质量更高。
  • 懒加载:按需加载图片,减少首屏加载时间。
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { VitePluginLazyload } from 'vite-plugin-lazyload';

export default defineConfig({
  plugins: [vue(), VitePluginLazyload()],
});
<img data-src="image.webp" class="lazy" />
<script>
  new IntersectionObserver((entries) => {
    entries.forEach((entry) => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        img.classList.remove('lazy');
      }
    });
  }).observe(document.querySelectorAll('.lazy'));
</script>

2. 字体优化

  • 按需加载:只加载需要的字体样式。
  • 预加载:使用 <link rel="preload"> 预加载关键字体。
<link rel="preload" href="/fonts/Roboto.woff2" as="font" type="font/woff2" crossorigin />

三、网络优化:CDN、缓存

1. 使用 CDN

  • CDN:将静态资源部署到 CDN,减少服务器压力,加速加载。
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    assetsDir: 'static',
    assetsInlineLimit: 4096, // 小于 4KB 的资源内联
  },
});

2. 缓存策略

  • 缓存控制:部署时缓存配置示例(Nginx),把以下片段放进你的 Nginx 配置即可,不要写vite.config.js:
# 静态资源缓存 1 年
location ~* \.(?:js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|avif|webp)$ {
  expires 1y;
  add_header Cache-Control "public, immutable";
}

四、首屏优化:骨架屏、预渲染

1. 骨架屏

  • 骨架屏:在内容加载完成前显示占位图,提升用户体验。
<div class="skeleton">
  <div class="skeleton-header"></div>
  <div class="skeleton-content"></div>
</div>
.skeleton {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.skeleton-header {
  width: 100%;
  height: 50px;
  background: linear-gradient(90deg, #f0f0f0, #e0e0e0, #f0f0f0);
  background-size: 200% 200%;
  animation: skeleton 1.5s infinite;
}
.skeleton-content {
  width: 100%;
  height: 200px;
  background: linear-gradient(90deg, #f0f0f0, #e0e0e0, #f0f0f0);
  background-size: 200% 200%;
  animation: skeleton 1.5s infinite;
}
@keyframes skeleton {
  0% {
    background-position: -200% 0;
  }
  100% {
    background-position: 200% 0;
  }
}

2. 预渲染

  • 预渲染:使用 Vite 插件进行预渲染,减少首屏加载时间。
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vitePrerender from 'vite-plugin-prerender';

export default defineConfig({
  plugins: [
    vue(),
    vitePrerender({
      routes: ['/', '/about'], // 必填
    }),
  ],
});

五、性能监控:Lighthouse、Web Vitals

1. Lighthouse

  • Lighthouse:使用 Lighthouse 定期检查性能,找出瓶颈。
npm install -g lighthouse
lighthouse https://your-site.com --view

2. Web Vitals

  • Web Vitals:监控关键性能指标,如 LCP、FID、CLS。
import { getCLS, getFID, getLCP } from 'web-vitals';

getCLS(console.log);
getFID(console.log);
getLCP(console.log);

六、代码优化:减少重绘、重排

1. 避免强制同步布局(FLS)

  • FLS:避免在 JavaScript 中频繁读写布局属性。
// 避免
const width = element.offsetWidth;
element.style.width = width + 10 + 'px';

// 推荐
element.style.width = element.offsetWidth + 10 + 'px';

2. 使用 CSS 动画

  • CSS 动画:使用 CSS 动画而不是 JavaScript 动画,减少重绘和重排。
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
<div class="fade-in"></div>

七、总结:7 步优化流程

  1. 代码分割 + Tree-Shaking:减少代码体积。
  2. 图片优化:使用现代格式、懒加载。
  3. 网络优化:使用 CDN、设置缓存。
  4. 首屏优化:骨架屏、预渲染。
  5. 性能监控:Lighthouse、Web Vitals。
  6. 代码优化:减少重绘、重排。
  7. 持续优化:定期检查、优化。

🏁 一句话总结

通过 Vite + 7 招优化,我们的项目从 5 秒白屏降到 1.2 秒加载完成,性能提升 77%。把这份优化清单贴在工位

AI增强摘要:

这篇文章详细记录了如何通过7个关键步骤显著提升前端项目的性能,特别是针对Vite项目的优化。从代码体积瘦身、资源优化、网络优化到首屏优化,每一步都提供了具体的实现方法和代码示例。文章不仅展示了优化前后的性能对比,还强调了持续监控和优化的重要性。核心观点在于,通过综合应用现代前端技术和工具,可以大幅提升用户体验和页面加载速度。

内容分类: AI工具使用教程与技巧

适合人群: 前端开发者、Web性能优化工程师、技术爱好者


假如同事用的都是mac,而只有你是windows,你该如何应对

原文链接: https://juejin.cn/post/7534260023296294955

原始摘要:

入职当天,发在我手上的竟然是ThinkPad,这让我满头雾水,后来告知我试用期过了且定到L3才会给我发mac,那就等待吧。但这其中我遇到了个比较关键的问题,想和大家分享下。

或许你已经在想,除了一些操作上的差异外,还能有什么影响呢?其实唯二的大头问题在你刚进入公司就要到来,那就是跑项目。由于系统差异问题,大伙用的都是mac,就默认在一些配置环境中配置的是ios系统的指令,而你手里的安卓本是看不懂的。

核心问题

例如 mac 用户的 package.json 脚本、Shell 脚本、或开发配置中,经常包含以下命令:

rm -rf node_modules/
ls -al
cp .env.example .env
pwd
sh build.sh

这些命令其实在 Windows CMD 或 PowerShell 中是无法识别的,执行时会直接报错。看到这里 mac 用户可能会冒出一句:“啊,真的假的?” 没错,确确实实是真的。Windows 和类 Unix 系统(macOS、Linux)在命令行工具、路径处理和权限机制上有本质区别。

那么有什么处理方法呢?直接更改 package.json 文件来适配 windows 怎么样,那在 code review 完你可能会收到一句:你明天可以接着放暑假了。

那么我们该如何解决呢?首先当然不是更改文件,不然 push 完你的同事就该懵逼了。这时我们就该拿出我们的虚拟机了,给自己打造一个 mac 开发环境,没有我们就自己造!

如何把自己的 windows 变成 mac

1、安装WSL2

打开 PowerShell(以管理员身份),执行:

wsl --install

Windows 10 用户需先更新 WSL 组件,可参考官方文档:learn.microsoft.com/zh-cn/windo…

如果发现安装后还是无法使用,可以试试万能的重启电脑。

2、安装 Ubuntu 发行版

从 Microsoft Store 安装 Linux 发行版。选择 Ubuntu 20.04 或更新版本,并完成安装初始化。(设置用户名和密码)

image.png

3、将项目代码移入 Linux 子系统中

代码放在 WSL 子系统路径中运行,能避免很多路径映射问题,并且可以提高性能。

打开 WSL 终端,进入你的 Linux 系统,执行:

cd ~
mkdir workspace

然后在 Windows 文件资源管理器中,把你的项目文件复制到:

\\wsl.localhost\Ubuntu\home\你的用户名\workspace

这个过程可能会有点慢,可以试着先忽略像node_modules这样的文件,然后当复制到后再 install。

4、使用 VSCode 连接 WSL 开发

vscode 也针对这种情况出过相关策略,可以安装 Remote - WSL 插件,然后在 VSCode 中按下 F1,输入:

Remote-WSL: Open Folder in WSL

选择你刚刚放进去的项目目录即可。此时你将在 VSCode 中享受到原生 Linux 的开发体验。

5、Docker 使用注意:连接 WSL 后端

如果你的项目使用 Docker 开发,在安装 Docker Desktop 后:

  • 打开 Docker 设置
  • 前往「Resources」>「WSL Integration」
  • 启用对 Ubuntu 子系统的集成

这样你就可以在 WSL 中直接运行 docker-compose up,像在 mac 上一样使用容器开发环境。

总结

完成上述配置后,你的 Windows 机就能跑任何 macOS 项目中的命令脚本,运行逻辑与同事完全一致,团队协作也将畅通无阻。

AI增强摘要:

文章探讨了在团队中作为唯一使用Windows系统的开发者所面临的挑战,特别是在项目开发和协作过程中因操作系统差异导致的问题。作者分享了个人经历,指出核心问题在于macOS和Windows在命令行工具、路径处理和权限机制上的本质区别,这导致直接运行macOS配置的脚本在Windows上会报错。为了解决这一问题,作者提出了一种有效的解决方案:通过安装WSL2和Ubuntu发行版,将Windows系统转变为能够兼容macOS开发环境的系统。此外,文章还详细介绍了如何使用VSCode连接WSL进行开发,以及如何配置Docker以在WSL中运行,从而确保团队协作的顺畅。这篇文章不仅提供了实用的技术解决方案,还强调了适应和创新的重要性。

内容分类: AI工具使用教程与技巧

适合人群: 开发者、技术爱好者、IT专业人士


被架构师怼了三次,小明终于懂了接口幂等设计

原文链接: https://juejin.cn/post/7533554238204788777

原始摘要:

引言

隔壁组的小明最近有点不痛快,在设计支付接口时被架构师老李连怼三次,就因为接口的幂等性没有考虑充分。

每次都是自信满满,可每次都被找出问题。

这次我们跟着隔壁小明的视角,循序渐进,彻底搞懂接口幂等设计的精髓。

真的是精髓。

1042.png

什么是接口幂等性?

mindmap
  root((接口幂等性))
    定义
      多次调用结果一致
      不会产生副作用
      状态不会改变
    重要性
      防止重复操作
      提高系统稳定性
      避免数据不一致
    应用场景
      支付接口
      订单创建
      数据修改
      消息发送

幂等性:在数学和计算机科学中,幂等操作指的是任意多次执行所产生的影响均与一次执行的影响相同。

第一次:欠考虑的支付接口

小明写的第一版支付接口,我们来看下:

@RestController
public class PaymentController {

    @Autowired
    private PaymentService paymentService;

    @PostMapping("/pay")
    public ResponseEntity<String> pay(@RequestBody PaymentRequest request) {
        // 直接处理支付,没考虑重复提交
        PaymentResult result = paymentService.processPayment(request);
        return ResponseEntity.ok("支付成功,订单号:" + result.getOrderId());
    }
}

@Service
public class PaymentService {

    public PaymentResult processPayment(PaymentRequest request) {
        // 危险:直接扣款,没有任何防重复机制
        Account account = accountRepository.findById(request.getUserId());
        account.setBalance(account.getBalance().subtract(request.getAmount()));
        accountRepository.save(account);

        // 创建支付记录
        Payment payment = new Payment();
        payment.setUserId(request.getUserId());
        payment.setAmount(request.getAmount());
        payment.setStatus("SUCCESS");
        return paymentRepository.save(payment);
    }
}

是不是问题还挺明显?

架构师老李看过代码后,也认为离谱的过于明显。

他怒了:小明!如果用户网络不好,连点三次支付按钮,直接被扣三次钱!你这接口有幂等性保证吗?

这里我们忽略掉前端的防抖~将视角完全落在后端。

sequenceDiagram
    participant U as 用户
    participant F as 前端
    participant B as 后端
    participant DB as 数据库

    U->>F: 点击支付(网络慢)
    F->>B: 支付请求1
    B->>DB: 扣款100元
    DB-->>B: 余额1900
    U->>F: 再次点击支付(以为没成功)
    F->>B: 支付请求2
    B->>DB: 再次扣款100元
    DB-->>B: 余额1800
    Note over U,DB: 用户被重复扣款!

第二次:简单粗暴的去重方案

小明意识到问题后,想到可以用 Redis 来做简单去重:

@RestController
public class PaymentController {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @PostMapping("/pay")
    public ResponseEntity<String> pay(@RequestBody PaymentRequest request) {
        // 简单用用户ID+金额做key
        String key = "payment:" + request.getUserId() + ":" + request.getAmount();

        // 如果key存在,认为是重复请求
        if (redisTemplate.hasKey(key)) {
            return ResponseEntity.ok("重复请求,支付已处理");
        }

        // 设置标记
        redisTemplate.opsForValue().set(key, "processing", 60, TimeUnit.SECONDS);

        PaymentResult result = paymentService.processPayment(request);
        return ResponseEntity.ok("支付成功,订单号:" + result.getOrderId());
    }
}

似乎……可以了?小明自测后觉得针不戳,直接提交了代码。

结果老李又怒了:小明!你这去重的key设计百分百有问题啊!用户连续支付两笔相同金额怎么办?而且万一处理失败了,这个key还在 Redis 里,用户就再也无法支付这个金额了!

看看这个业务流程:

flowchart TD
    A[用户支付100元] --> B{Redis中是否存在key}
    B -->|不存在| C[设置key到Redis]
    C --> D[处理支付逻辑]
    D --> E{处理是否成功}
    E -->|成功| F[返回成功]
    E -->|失败| G[返回失败但key仍存在]
    G --> H[用户无法再支付相同金额]
    B -->|存在| I[直接返回重复请求]

    style G fill:#ffcccc
    style H fill:#ffcccc

第三次:考虑不周的幂等token方案

小明这次学聪明了,使用幂等token:

@RestController
public class PaymentController {

    @PostMapping("/pay")
    public ResponseEntity<String> pay(@RequestBody PaymentRequest request) {
        String idempotentToken = request.getIdempotentToken();
        if (StringUtils.isEmpty(idempotentToken)) {
            return ResponseEntity.badRequest().body("缺少幂等token");
        }

        String key = "payment:token:" + idempotentToken;

        // 检查token是否已使用
        if (redisTemplate.hasKey(key)) {
            String result = redisTemplate.opsForValue().get(key);
            return ResponseEntity.ok("重复请求:" + result);
        }

        try {
            PaymentResult result = paymentService.processPayment(request);
            // 成功后保存结果
            redisTemplate.opsForValue().set(key, "SUCCESS:" + result.getOrderId(), 
                                          24, TimeUnit.HOURS);
            return ResponseEntity.ok("支付成功,订单号:" + result.getOrderId());
        } catch (Exception e) {
            // 失败了也要记录,避免重试
            redisTemplate.opsForValue().set(key, "FAILED:" + e.getMessage(), 
                                          24, TimeUnit.HOURS);
            throw e;
        }
    }
}

这下肯定没问题了,这代码简直不要太完美~

小明自信满满,又一次提交了代码。

结果老李继续怒:小明!你这样处理有并发问题啊!如果有两个请求同时到达,都检查到token不存在,然后都去处理支付,还是会重复扣款!而且失败的请求也被标记了,用户在24小时内永远无法重试!

flowchart TD
    A[请求1和请求2同时到达] --> B[都检查token不存在]
    B --> C[请求1开始处理支付]
    B --> D[请求2也开始处理支付]
    C --> E[请求1扣款成功]
    D --> F[请求2也扣款成功]
    E --> G[用户被重复扣款]
    F --> G

    style G fill:#ffcccc

正确的幂等设计方案

经过三次被怼,小明终于在老李的指导下设计出了完善的幂等方案:

mindmap
  root((完善的幂等设计))
    核心要素
      唯一标识
        业务幂等key
        全局唯一token
      原子性保证
        分布式锁
        数据库唯一约束
      状态管理
        处理中状态
        最终状态持久化
    技术方案
      分布式锁+Redis
      数据库唯一约束
      状态机设计
      消息队列幂等

分布式锁 + 状态管理

@RestController
public class PaymentController {

    @Autowired
    private RedissonClient redissonClient;

    @Autowired
    private PaymentService paymentService;

    @PostMapping("/pay")
    public ResponseEntity<PaymentResponse> pay(@RequestBody PaymentRequest request) {
        String idempotentKey = request.getIdempotentToken();
        validateRequest(request, idempotentKey);

        // 先查询是否已有处理结果
        PaymentResponse existingResult = paymentService.getPaymentResult(idempotentKey);
        if (existingResult != null) {
            return ResponseEntity.ok(existingResult);
        }

        // 使用分布式锁保证并发安全
        RLock lock = redissonClient.getLock("payment:lock:" + idempotentKey);

        try {
            // 尝试获取锁,最多等待3秒,锁定10秒
            if (lock.tryLock(3, 10, TimeUnit.SECONDS)) {
                // 再次检查,避免重复处理
                existingResult = paymentService.getPaymentResult(idempotentKey);
                if (existingResult != null) {
                    return ResponseEntity.ok(existingResult);
                }

                // 执行支付逻辑
                PaymentResponse result = paymentService.processPaymentWithIdempotent(request);
                return ResponseEntity.ok(result);
            } else {
                throw new RuntimeException("系统繁忙,请稍后重试");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException("请求被中断");
        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

    private void validateRequest(PaymentRequest request, String idempotentKey) {
        if (StringUtils.isEmpty(idempotentKey)) {
            throw new IllegalArgumentException("缺少幂等token");
        }
        // 其他业务校验...
    }
}

说明:

  • 在获取锁之前先做一次结果查询,这是性能优化的关键。基本上大部分重复请求都能在这一步快速返回,无需等待锁;
  • 双重检查锁 :获取锁后再次检查结果,防止在等待锁的过程中其他线程已经完成了处理;
  • 等待锁最多3秒,避免请求长时间阻塞;锁定时间10秒,为支付业务预留足够的时间;
  • 区分好业务异常和系统异常,确保锁能正确释放,避免死锁;

核心业务逻辑

@Service
@Transactional
public class PaymentService {

    @Autowired
    private PaymentRecordRepository paymentRecordRepository;

    @Autowired
    private AccountRepository accountRepository;

    public PaymentResponse processPaymentWithIdempotent(PaymentRequest request) {
        String idempotentKey = request.getIdempotentToken();

        try {
            // 创建支付记录,状态为处理中
            PaymentRecord record = createPaymentRecord(request, idempotentKey);

            // 执行支付逻辑
            processPayment(request);

            // 更新状态为成功
            record.setStatus(PaymentStatus.SUCCESS);
            record.setCompletedAt(LocalDateTime.now());
            paymentRecordRepository.save(record);

            return PaymentResponse.success(record.getOrderId());

        } catch (Exception e) {
            // 处理失败,更新状态但不阻止重试
            updatePaymentRecordOnFailure(idempotentKey, e.getMessage());
            throw e;
        }
    }

}

这一段就是常规的业务流程了,不再多做赘述。

private PaymentRecord createPaymentRecord(PaymentRequest request, String idempotentKey) {
    PaymentRecord record = new PaymentRecord();
    record.setIdempotentKey(idempotentKey);
    record.setUserId(request.getUserId());
    record.setAmount(request.getAmount());
    record.setStatus(PaymentStatus.PROCESSING);
    record.setCreatedAt(LocalDateTime.now());

    try {
        return paymentRecordRepository.save(record);
    } catch (DataIntegrityViolationException e) {
        // 幂等key重复,说明已有请求在处理
        throw new RuntimeException("重复的支付请求");
    }
}

private void updatePaymentRecordOnFailure(String idempotentKey, String errorMsg) {
    PaymentRecord record = paymentRecordRepository.findByIdempotentKey(idempotentKey);
    if (record != null) {
        record.setStatus(PaymentStatus.FAILED);
        record.setErrorMessage(errorMsg);
        record.setCompletedAt(LocalDateTime.now());
        paymentRecordRepository.save(record);
    }
}

public PaymentResponse getPaymentResult(String idempotentKey) {
    PaymentRecord record = paymentRecordRepository.findByIdempotentKey(idempotentKey);
    if (record == null) {
        return null;
    }

    switch (record.getStatus()) {
        case SUCCESS:
            return PaymentResponse.success(record.getOrderId());
        case PROCESSING:
            return PaymentResponse.processing();
        case FAILED:
            // 失败的记录不返回,允许重试
            return null;
        default:
            return null;
    }
}

创建payment记录这段做个简易的说明:

  • 通过数据库约束做兜底:即使分布式锁出现问题,数据库的唯一约束也能防止重复记录的创建;
  • 失败的记录最好保留在数据库中用于审计和复查,但在业务中要返回null,允许用户重新发起支付;
  • 把PROCESSING状态告知前端,由前端显示“请求正在处理中”,避免用户重复提交;

完整的幂等处理流程

flowchart TD
    A[接收支付请求] --> B{验证幂等token}
    B -->|无效| C[返回参数错误]
    B -->|有效| D[查询是否已有结果]
    D -->|有结果| E{检查结果状态}
    E -->|成功| F[返回成功结果]
    E -->|处理中| G[返回处理中状态]
    E -->|失败| H[继续处理]
    D -->|无结果| I[尝试获取分布式锁]
    H --> I
    I -->|获取失败| J[返回系统繁忙]
    I -->|获取成功| K[再次检查结果]
    K -->|有结果| L[释放锁并返回结果]
    K -->|无结果| M[创建处理中记录]
    M -->|创建失败| N[返回重复请求]
    M -->|创建成功| O[执行支付业务]
    O -->|成功| P[更新状态为成功]
    O -->|失败| Q[更新状态为失败]
    P --> R[释放锁并返回成功]
    Q --> S[释放锁并返回失败]

    style C fill:#ffcccc
    style J fill:#ffcccc
    style N fill:#ffcccc
    style S fill:#ffcccc

这个方案基本上适用于我们的常规业务,但也有局限性,尤其是亿级流量的场景。

比方说当QPS达到5000-10000时,大量请求排队等待同一个幂等key的锁,那么接口的响应时间必然会变得缓慢。

而且这时候Redis的连接数、数据库的连接池也有可能成为瓶颈。

如果业务上真的达到了亿级流量,那就需要考虑更加复杂且强大的方案了,这里举些例子:

  • 基于消息队列的异步幂等处理

  • 分片式幂等设计(按用户ID或地理位置分片)

  • 基于CRDT的最终一致性幂等

  • 混合式架构(同步+异步+缓存预热)

了解即可,点到为止。

不同场景的幂等策略

并不是所有的业务系统都会用到Redis,也并不是所有的场景都需要应对高并发,我们抛砖引玉,也对其他场景做个归纳:

mindmap
  root((幂等策略选择))
    高并发场景
      Redis分布式锁
      本地锁+数据库
      消息队列削峰
    普通业务场景
      数据库唯一约束
      状态机设计
      版本号控制
    对外接口
      Token机制
      签名验证
      时间窗口限制
    内部服务
      业务主键幂等
      状态检查
      补偿机制

监控&告警

完善的幂等设计还需要结合运维,配套好线程池的监控、Redis的监控等。

当有异常业务时还可以通过钉钉、飞书、邮件等实现实时的推送告警。

最后

好的幂等设计不仅要防止业务被重复执行,还得保证良好的用户体验,不能芝麻没捡到还丢了西瓜。

幂等性的本质,其实就是要求我们的系统在面对不确定性时保持一致。

技术的迭代就是如此。

从简单粗暴的方案到最后考虑周全的设计,但这真的就是“最后”了吗?

小明走过的路其实就是千千万万个我们的成长轨迹。

我们都曾写过那些能跑就行的代码,也都被现实狠狠DISS过。但正是这些经历,让我们学会了思考边界、考虑异常、关注用户体验。

真正的成熟,不是写出多么复杂的代码,而是能在简单与复杂之间找到恰当的平衡。

知道什么时候该用简单方案,什么时候需要复杂设计;明白技术是为了解决问题,而不是炫技。

就像幂等设计一样,人生最好的状态也许就是:无论经历多少次冲击,都能保持内心的那份坚定与一致。

与君共勉。

006mowZngy1ftgq2o2m2yg305k05k40v.gif

AI增强摘要:

文章通过小明在设计支付接口时被架构师老李连续三次指出问题的经历,深入探讨了接口幂等性设计的重要性及其实现方法。第一次,小明的支付接口没有考虑重复提交的问题,导致用户可能被重复扣款。第二次,小明尝试使用Redis进行简单去重,但忽略了用户连续支付相同金额和支付失败后key仍存在的问题。第三次,小明引入了幂等token方案,但仍存在并发问题和失败请求无法重试的缺陷。最终,在老李的指导下,小明设计出了一个完善的幂等方案,包括使用分布式锁保证并发安全、状态管理以及核心业务逻辑的正确处理。文章不仅总结了幂等设计的核心要素和技术方案,还强调了在实际开发中避免常见错误的重要性。

内容分类: AI工具使用教程与技巧

适合人群: 后端开发工程师、软件架构师、技术爱好者


闲谈 :AI 生成视频哪家强 ,掘友们有没有推荐的工具?

原文链接: https://juejin.cn/post/7533861390501314612

原始摘要:

一. 前言

最近在抖音刷到了很多 AI 视频的案例 ,直到刷到其中一个 硬控了3秒才反应过来 ,现在AI视频好像可以面向生产了。

👍👍📍📍 来源于抖音 @ 阿飞乱剪

1d559e24a21a24c0140af84c5b6c0831.jpg

所以动了心思想了解一下这块的东西, 周末陆陆续续看了很多 ,也试了好些软件 。

花了真金白银的实现结果 ,在这里输出一个报告给大家。主要是国产的 ,国外的只收录了 Google 的案例。

  • 由于视频比较大 ,所有的视频都经过了压缩 ,本文只记录情节的展示 ,不代表视频的清晰度
  • 初次尝试 ,很多东西不了解 ,也只是抛砖引玉 ,希望大佬们能给些指导。

文案内容 (没有专门优化提示词,就作为一个普通使用者的尝试) :

image.png

二. 各家分类

  • 不同时间和不同质量的视频 ,价格均不相同 ,这里均为基础质量 + 5S 的案例
工具名称推出厂商付费模式消耗试用套餐主要特点
即梦字节跳动免费+付费版单次10每天送60效果还行 ,操作简单
可灵快手-会员有四个档 ,非会员有水印单次20有7天试用套餐 ,1-5元可以设置多个节点图 ,让视频的内容连贯起来
海螺稀宇科技-会员挡位很多 ,有年费版。
-非会员并发 + 质量限制
单次25500贝壳新人礼包
白日梦AI光魔科技-纯文生图,不支持图片传入
-需要选择特定的模板生成
开局500积分故事型的AI生成工具 ,适合做新时代漫画
腾讯混元AI腾讯项目/企业付费没收费没套装很慢 ,而且会中途失败 ,效果自己看
绘蛙阿里-多个会员档次,但是免费的下载无水印单次30赠送300积分新手礼包支持一键换衣等电商领域的功能

2.1 可灵 AI

  • 可灵的整体效果还是不错了 ,虽然逻辑处理上有一些偏差 ,但是可以通过提示词来纠正
  • 价格略贵 , 按照一次20来算 ,可能普通套餐就30多次
  • 操作界面会比其他的更复杂 ,适合更复杂的微调场景

image.png

image.png

可灵 00_00_00-00_00_30.gif

2.2 即梦 AI

  • 即梦的操作界面比较简单 ,一般只提供首图和尾图
  • 价格也不便宜 ,效果可圈可点 ,支持运镜

image.png

image.png

即梦 00_00_00-00_00_30.gif

2.3 海螺 AI

  • 支持文生视频 / 图生视频
  • 带有提示词控制和运镜指令 ,比较好的是这两个比较全
  • 价格稍微有点贵 ,免费的会带上水印

image.png

image.png

海螺 00_00_00-00_00_30.gif

2. 绘蛙

  • 支持文字生成视频 ,支持一定的动作控制 ,时间分为 5秒 和 10秒
  • 支持多个图片生成一个视频 , 多图生成的时候不支持指定情节
  • 有模板动作和人物上衣 (偏向于电商的使用

image.png

image.png

绘蛙 00_00_00-00_00_30.gif

2. 白日梦

  • 没有找到图片的入口 ,纯文字内容
  • 会选择默认的生成风格模板 ,限制稍微有点多
  • 不太符合我的需求 ,仅轻度使用, 和其他的不一样 ,生成的效果区别比较大

image.png

白日梦 00_00_00-00_00_30.gif

其他平台

腾讯混元视频

image.png

腾讯混元 00_00_00-00_00_30.gif

对比海外 : Google Veo 3

  • Google 还是强啊 ❗ ❗ ❗

google 00_00_00-00_00_30.gif

关于其他的

  • 其他的部分只看到有模型 ,有的入口不好找 ,有的主要领域还是语言类 ,就没有深入了

总结

  • 整体国内的水平都不错了 ,能投入一些短视频的创作了
  • 提示词很重要 ,通过提示词来规划动作 ,通过运镜 + 尾图限定范围还是有很大操作空间的
  • 也不要保有太乐观的想法 ,有的场景怎么说都没用
  • 基本上都用试用套餐 ,不确定可以试试再说

最后的最后 ❤️❤️❤️👇👇👇

AI增强摘要:

本文探讨了AI生成视频工具的现状和比较,作者通过实际使用和付费体验,对国内几款主流AI视频生成工具进行了详细评测,包括字节跳动的即梦、快手的可灵、稀宇科技的海螺、光魔科技的白日梦AI、腾讯的混元AI和阿里的绘蛙。文章不仅比较了各工具的价格、操作界面、功能特点,还分享了使用心得和技巧,如提示词的重要性。作者认为国内AI视频生成技术已足够成熟,可以投入短视频创作,但也提醒读者需合理预期,充分利用试用套餐进行尝试。

内容分类: AI工具使用教程与技巧

适合人群: 内容创作者、短视频制作人、技术爱好者


CSS 命名太乱?BEM 规范帮你一键搞定,代码清爽到飞起!

原文链接: https://juejin.cn/post/7533471580984770603

原始摘要:

前言

在前端开发中,随着项目规模的扩大,CSS代码的组织和维护变得越来越具有挑战性。开发者常常面临类名冲突、样式覆盖、代码难以维护等问题。为了解决这些问题,各种CSS命名规范和方法论应运而生,而BEM(Block-Element-Modifier)作为其中最流行和实用的方法之一,被越来越多的开发团队所采用。

接下来我就将带大家学习BEM命名规范,编写出更加模块化、可维护的前端代码。

一、什么是BEM命名规范?

BEM是Block(块)、Element(元素)、Modifier(修饰符)的缩写,是一种基于组件的Web开发方法论。它由Yandex团队提出,旨在帮助开发者创建可重用和可维护的代码结构。

BEM命名规范主要解决了CSS中的命名冲突和样式覆盖问题,通过明确的命名约定,使代码结构更加清晰,便于团队协作和项目维护。

二、BEM的三个核心概念

1. Block(块)

Block是一个独立的组件,可以在项目中重复使用,且不依赖于页面上的其他组件。

  • 命名规则:使用小写字母,多个单词之间用连字符(-)连接。

  • 示例

    .header {}
    .menu {}
    .search-form {}
    

Block就像是一个独立的"积木",可以放置在页面的任何位置,并且保持其功能和样式的一致性。

2. Element(元素)

Element是Block的组成部分,不能脱离Block单独使用。

  • 命名规则:Block名称 + 双下划线(__)+ Element名称。

  • 示例

    .menu__item {}
    .search-form__input {}
    .header__logo {}
    

Element就像是Block这个"积木"上的某个特定部分,它们共同构成了完整的Block功能。

3. Modifier(修饰符)

Modifier用于定义Block或Element的外观、状态或行为。

  • 命名规则

    • 对于Block的修饰:Block名称 + 双连字符(--)+ Modifier名称
    • 对于Element的修饰:Block名称__Element名称 + 双连字符(--)+ Modifier名称
  • 示例

    /* Block修饰符 */
    .menu--fixed {}
    .button--large {}
    
    /* Element修饰符 */
    .menu__item--active {}
    .search-form__input--disabled {}
    

Modifier就像是给"积木"或其部分添加特定的标签,表明它们处于某种特殊状态或具有特殊外观。

三、BEM命名规范的优势

1. 提高代码可读性

BEM命名方式直观地反映了HTML结构,使开发者能够通过类名就了解元素之间的关系。

<form class="search-form">
  <input class="search-form__input">
  <button class="search-form__button search-form__button--primary">搜索</button>
</form>

从上面的代码中,我们可以清晰地看出:

  • search-form是一个独立的块
  • inputbutton是这个块的元素
  • button有一个primary的修饰符

2. 降低CSS选择器的特异性

BEM鼓励使用单一类名选择器,避免使用标签名和ID选择器,从而降低了CSS选择器的特异性,减少了样式冲突的可能性。

/* 不推荐 */
form.search-form > input[type="text"] {}

/* 推荐 */
.search-form__input {}

3. 提高代码的可维护性

BEM的命名规则使得样式与HTML结构紧密关联,当需要修改某个组件时,可以很容易地找到相关的CSS代码。

4. 促进模块化开发

BEM鼓励开发者以组件的思维方式构建界面,每个Block都是独立的,可以在不同的项目中重复使用。

四、BEM在实际项目中的应用

基本示例

以一个简单的导航菜单为例:

<nav class="nav">
  <ul class="nav__list">
    <li class="nav__item">
      <a href="#" class="nav__link nav__link--active">首页</a>
    </li>
    <li class="nav__item">
      <a href="#" class="nav__link">关于我们</a>
    </li>
    <li class="nav__item">
      <a href="#" class="nav__link">服务</a>
    </li>
    <li class="nav__item">
      <a href="#" class="nav__link">联系我们</a>
    </li>
  </ul>
</nav>

对应的CSS:

.nav {
  background-color: #333;
  padding: 10px;
}

.nav__list {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}

.nav__item {
  margin-right: 20px;
}

.nav__link {
  color: white;
  text-decoration: none;
}

.nav__link--active {
  font-weight: bold;
  border-bottom: 2px solid white;
}

复杂示例

对于更复杂的组件,如一个带有标题、内容和操作按钮的卡片:

<div class="card">
  <div class="card__header">
    <h2 class="card__title">文章标题</h2>
    <span class="card__date">2023-05-15</span>
  </div>
  <div class="card__content">
    <p class="card__text">这是文章的内容...</p>
    <img class="card__image" src="image.jpg" alt="图片描述">
  </div>
  <div class="card__footer">
    <button class="card__button card__button--primary">阅读更多</button>
    <button class="card__button card__button--secondary">分享</button>
  </div>
</div>

对应的CSS:

.card {
  border: 1px solid #ddd;
  border-radius: 4px;
  overflow: hidden;
  margin-bottom: 20px;
}

.card__header {
  padding: 15px;
  background-color: #f5f5f5;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.card__title {
  margin: 0;
  font-size: 18px;
}

.card__date {
  color: #666;
  font-size: 14px;
}

.card__content {
  padding: 15px;
}

.card__text {
  margin-top: 0;
}

.card__image {
  max-width: 100%;
  height: auto;
  margin-top: 10px;
}

.card__footer {
  padding: 15px;
  background-color: #f5f5f5;
  display: flex;
  justify-content: flex-end;
}

.card__button {
  padding: 8px 15px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  margin-left: 10px;
}

.card__button--primary {
  background-color: #007bff;
  color: white;
}

.card__button--secondary {
  background-color: #6c757d;
  color: white;
}

五、BEM的常见问题与解决方案

1. 类名过长

当项目结构复杂时,BEM类名可能会变得很长,影响代码的可读性。

解决方案

  • 使用简短但有意义的Block和Element名称

  • 考虑使用预处理器(如SASS或LESS)的嵌套功能来简化编写

    • 在SASS/SCSS中,&符号表示父选择器的引用,可以大大简化BEM风格的CSS编写:
    .card {
      &__header { /* .card__header */ }
      &__title { /* .card__title */ }
    
      &__button {
        /* .card__button */
        &--primary { /* .card__button--primary */ }
        &--secondary { /* .card__button--secondary */ }
      }
    }
    

2. 嵌套元素的命名

当元素嵌套层级较深时,可能会出现命名困难的情况。

解决方案:BEM不推荐反映DOM结构的类名,如.block__elem1__elem2。应该始终保持扁平的命名结构:.block__elem1.block__elem2

<!-- 不推荐 -->
<div class="card">
  <div class="card__content">
    <div class="card__content__section">...</div>
  </div>
</div>

<!-- 推荐 -->
<div class="card">
  <div class="card__content">
    <div class="card__section">...</div>
  </div>
</div>

3. 何时创建新的Block

有时候很难判断应该创建一个新的Block还是继续使用Element。

判断标准:如果一个组件可以在不同的上下文中独立使用,那么它应该是一个Block;如果它只在特定Block中使用,那么它应该是一个Element。

结论

BEM命名规范是一种强大的CSS组织方法,它通过明确的命名约定,帮助开发者创建模块化、可维护的CSS代码。虽然在某些情况下类名可能会变得冗长,但其带来的代码清晰度和维护性的提升远远超过了这一小缺点。无论是小型项目还是大型应用,采用BEM命名规范都能帮助你构建更加健壮和可扩展的前端代码结构。
如果这篇文章有帮助到你,不胜荣幸;如果文章有错误或者缺漏,请在评论区指出,大家一起进步,谢谢🙏。

AI增强摘要:

本文深入介绍了BEM(Block-Element-Modifier)命名规范,这是一种旨在解决CSS代码组织和维护问题的前端开发方法论。通过明确的命名约定,BEM帮助开发者创建模块化、可维护的代码结构,有效避免了类名冲突和样式覆盖问题。文章详细解释了BEM的三个核心概念:Block(块)、Element(元素)和Modifier(修饰符),并通过实际示例展示了如何应用这些概念来编写清晰、可读的CSS代码。此外,文章还探讨了BEM命名规范的优势,如提高代码可读性、降低CSS选择器的特异性、提高代码的可维护性以及促进模块化开发。最后,文章提供了BEM在实际项目中的应用示例,并针对BEM使用过程中可能遇到的常见问题提出了解决方案。

内容分类: AI工具使用教程与技巧

适合人群: 前端开发者、UI设计师、全栈开发者


不要再用addEventListener了!这个API救了我的命

原文链接: https://juejin.cn/post/7533211262761009188

原始摘要:

不要再用addEventListener了!这个API救了我的命

昨天被产品经理叫到办公室,说用户反馈我们的后台管理系统越用越卡,Chrome任务管理器显示内存占用已经飙到2GB了。我tm当场就懵了,这不是在打我脸吗?

回到工位一番排查,发现罪魁祸首竟然是那些没清理干净的事件监听器。看着满屏的addEventListener和对应的清理代码,我突然想起了之前看到过但一直没用的AbortController

试了一下,卧槽,真香。

先看看我写的这坨屎

// 我之前写的"杰作",现在看着都想删库跑路
export default class DataGrid {
  constructor(container, options) {
    this.container = container;
    this.options = options;

    // 绑定this,一个都不能少,不然就报错
    this.handleResize = this.handleResize.bind(this);
    this.handleScroll = this.handleScroll.bind(this);
    this.handleClick = this.handleClick.bind(this);
    this.handleKeydown = this.handleKeydown.bind(this);
    this.handleContextMenu = this.handleContextMenu.bind(this);

    this.init();
  }

  init() {
    // 事件监听器注册大会
    window.addEventListener('resize', this.handleResize);
    this.container.addEventListener('scroll', this.handleScroll);
    this.container.addEventListener('click', this.handleClick);
    document.addEventListener('keydown', this.handleKeydown);
    this.container.addEventListener('contextmenu', this.handleContextMenu);

    // 还有定时器要管理
    this.resizeTimer = null;
    this.scrollTimer = null;
  }

  destroy() {
    // 清理环节,经常漏几个
    window.removeEventListener('resize', this.handleResize);
    this.container.removeEventListener('scroll', this.handleScroll);
    this.container.removeEventListener('click', this.handleClick);
    document.removeEventListener('keydown', this.handleKeydown);
    // 草,contextmenu忘记清理了

    if (this.resizeTimer) clearTimeout(this.resizeTimer);
    if (this.scrollTimer) clearTimeout(this.scrollTimer);
  }
}

这种写法有多恶心?我来告诉你:

  1. 写到手酸 - 每个方法都得bind一遍,复制粘贴都嫌烦
  2. 容易遗漏 - 加了事件监听器,销毁的时候经常忘记清理某几个
  3. 维护困难 - 想加个新事件?得在两个地方改代码

最要命的是,这个DataGrid会被频繁创建销毁(用户切换页面、筛选数据等),每次忘记清理就是一次内存泄漏。

AbortController拯救了我的职业生涯

export default class DataGrid {
  constructor(container, options) {
    this.container = container;
    this.options = options;
    this.controller = new AbortController();

    this.init();
  }

  init() {
    const { signal } = this.controller;

    // 所有事件监听器统一管理,爽到飞起
    window.addEventListener('resize', (e) => {
      clearTimeout(this.resizeTimer);
      this.resizeTimer = setTimeout(() => this.handleResize(e), 200);
    }, { signal });

    this.container.addEventListener('scroll', (e) => {
      this.handleScroll(e);
    }, { signal, passive: true });

    this.container.addEventListener('click', (e) => {
      this.handleClick(e);
    }, { signal });

    document.addEventListener('keydown', (e) => {
      if (e.key === 'Delete' && this.selectedRows.length > 0) {
        this.deleteSelectedRows();
      }
    }, { signal });

    this.container.addEventListener('contextmenu', (e) => {
      e.preventDefault();
      this.showContextMenu(e);
    }, { signal });
  }

  destroy() {
    // 一行代码解决所有问题!
    this.controller.abort();
  }
}

你没看错,destroy方法只需要一行代码。当初看到这个效果时,我特么激动得想发朋友圈。

线上踩坑记录

不过用AbortController也不是一帆风顺的。记得刚开始用的时候,我直接这样写:

// 错误示范,别学我
class Modal {
  show() {
    this.controller = new AbortController();
    const { signal } = this.controller;

    document.addEventListener('keydown', (e) => {
      if (e.key === 'Escape') this.hide();
    }, { signal });
  }

  hide() {
    this.controller.abort();
    // 没有重新创建controller!
  }
}

结果modal第二次打开的时候,ESC键失效了。原因很简单:controller.abort()之后,这个controller就废了,不能重复使用。

正确的写法应该是:

class Modal {
  constructor() {
    this.controller = new AbortController();
  }

  show() {
    this.setupEvents();
  }

  setupEvents() {
    const { signal } = this.controller;

    document.addEventListener('keydown', (e) => {
      if (e.key === 'Escape') this.hide();
    }, { signal });

    document.addEventListener('click', (e) => {
      if (e.target === this.overlay) this.hide();
    }, { signal });
  }

  hide() {
    this.controller.abort();
    // 重新创建一个新的controller
    this.controller = new AbortController();
  }
}

真实项目:拖拽排序的坑

前段时间做一个看板功能,需要实现卡片拖拽排序。用传统方式写的话,光是事件监听器的管理就能把人逼疯:

class DragSort {
  constructor(container) {
    this.container = container;
    this.isDragging = false;
    this.dragElement = null;

    this.initDrag();
  }

  initDrag() {
    const dragController = new AbortController();
    this.dragController = dragController;
    const { signal } = dragController;

    // 只在容器上监听mousedown
    this.container.addEventListener('mousedown', (e) => {
      const card = e.target.closest('.card');
      if (!card) return;

      this.startDrag(card, e);
    }, { signal });
  }

  startDrag(card, startEvent) {
    // 为每次拖拽创建独立的controller
    const moveController = new AbortController();
    const { signal } = moveController;

    this.isDragging = true;
    this.dragElement = card;

    const startX = startEvent.clientX;
    const startY = startEvent.clientY;
    const rect = card.getBoundingClientRect();

    // 创建拖拽副本
    const ghost = card.cloneNode(true);
    ghost.style.position = 'fixed';
    ghost.style.left = rect.left + 'px';
    ghost.style.top = rect.top + 'px';
    ghost.style.pointerEvents = 'none';
    ghost.style.opacity = '0.8';
    document.body.appendChild(ghost);

    // 拖拽过程中的事件
    document.addEventListener('mousemove', (e) => {
      const deltaX = e.clientX - startX;
      const deltaY = e.clientY - startY;

      ghost.style.left = (rect.left + deltaX) + 'px';
      ghost.style.top = (rect.top + deltaY) + 'px';

      // 检测插入位置
      this.updateDropIndicator(e);
    }, { signal });

    // 拖拽结束
    document.addEventListener('mouseup', (e) => {
      this.endDrag(ghost);
      // 自动清理本次拖拽的所有事件
      moveController.abort();
    }, { signal, once: true });

    // 防止文本选中
    document.addEventListener('selectstart', (e) => {
      e.preventDefault();
    }, { signal });

    // 防止右键菜单
    document.addEventListener('contextmenu', (e) => {
      e.preventDefault();
    }, { signal });
  }

  destroy() {
    this.dragController?.abort();
  }
}

这种写法的好处是,每次拖拽开始时创建独立的controller,拖拽结束时自动清理相关事件。不会出现事件监听器累积的问题。

以前用传统方式,我得手动管理mousemove和mouseup的清理,经常出现拖拽结束后事件还在监听的bug。

React项目中的应用

在React项目里,我封装了一个hook:

import { useEffect, useRef } from 'react';

function useEventController() {
  const controllerRef = useRef();

  useEffect(() => {
    controllerRef.current = new AbortController();

    return () => {
      controllerRef.current?.abort();
    };
  }, []);

  const addEventListener = (target, event, handler, options = {}) => {
    if (!controllerRef.current) return;

    const element = target?.current || target;
    if (!element) return;

    element.addEventListener(event, handler, {
      signal: controllerRef.current.signal,
      ...options
    });
  };

  return { addEventListener };
}

// 使用起来贼爽
function MyComponent() {
  const { addEventListener } = useEventController();
  const buttonRef = useRef();

  useEffect(() => {
    addEventListener(window, 'resize', (e) => {
      console.log('窗口大小变了');
    });

    addEventListener(buttonRef, 'click', (e) => {
      console.log('按钮被点了');
    });
  }, []);

  return <button ref={buttonRef}>点我</button>;
}

兼容性和实际使用建议

AbortController在主流浏览器中支持得还不错,Chrome 66+、Firefox 57+、Safari 11.1+都能用。我们项目的用户主要是企业客户,浏览器版本都比较新,所以直接用了。

如果你需要兼容老浏览器,可以加个简单的判断:

class EventManager {
  constructor() {
    this.useAbortController = 'AbortController' in window;

    if (this.useAbortController) {
      this.controller = new AbortController();
    } else {
      this.handlers = [];
    }
  }

  on(target, event, handler, options = {}) {
    if (this.useAbortController) {
      target.addEventListener(event, handler, {
        signal: this.controller.signal,
        ...options
      });
    } else {
      // 降级到传统方式
      this.handlers.push({ target, event, handler, options });
      target.addEventListener(event, handler, options);
    }
  }

  destroy() {
    if (this.useAbortController) {
      this.controller.abort();
    } else {
      this.handlers.forEach(({ target, event, handler, options }) => {
        target.removeEventListener(event, handler, options);
      });
      this.handlers = [];
    }
  }
}

最后

说实话,AbortController这个API我很早就知道,但一直以为只能用来取消fetch请求。直到那次内存泄漏的事故,我才真正开始研究它的其他用法。

现在回头看,这个API真的改变了我写事件处理代码的方式。代码变得更简洁,bug更少,维护成本也大大降低。

当然,不是说传统的addEventListener就一无是处。在某些需要精确控制单个事件监听器的场景下,传统方式可能还是有必要的。但对于大部分日常开发,AbortController绝对是更好的选择。

如果你也经常被事件监听器的管理搞得头疼,试试这个方法吧。保证你用了就回不去了。

ps:写这篇文章的时候,我又想起了那个2GB内存占用的bug。现在想想,要是早点用AbortController,也不至于被产品经理叫到办公室"喝茶"了。😅

AI增强摘要:

这篇文章详细介绍了如何利用AbortController API来高效管理事件监听器,避免内存泄漏和代码冗余的问题。作者通过对比传统的removeEventListener方法和使用AbortController的实践,展示了后者在简化代码、提高维护性和减少内存泄漏风险方面的显著优势。文章还分享了在实际项目中应用AbortController的经验,包括在React项目中的封装使用和兼容性处理建议,为开发者提供了一种更优雅的事件管理解决方案。

内容分类: AI工具使用教程与技巧

适合人群: 前端开发者、JavaScript程序员、Web应用开发者


手写 Promise 静态方法:从原理到实现

原文链接: https://juejin.cn/post/7533150906670841906

原始摘要:

在前端异步编程中,Promise 的静态方法扮演着至关重要的角色。它们为我们处理多个异步操作提供了简洁而强大的工具,让复杂的异步流程变得清晰可控。本文将深入剖析 Promise 常用静态方法的实现原理,带你一步步手写这些方法,彻底掌握它们的工作机制。

认识 Promise 静态方法

Promise 对象提供了多个静态方法,这些方法都是直接通过Promise构造函数调用的,无需实例化。它们的主要作用是对多个 Promise 实例进行组合操作,简化异步流程控制。

最常用的 Promise 静态方法包括:

  • Promise.all():等待所有 Promise 完成并收集结果
  • Promise.allSettled():等待所有 Promise 完成,无论成功失败
  • Promise.race():返回第一个完成的 Promise 结果
  • Promise.any():返回第一个成功的 Promise 结果

这些方法在实际开发中应用广泛,比如并发请求数据、设置请求超时、处理多个异步操作的结果等场景都离不开它们。

手写 Promise.resolve () 与 Promise.reject ()

作为最基础的 Promise 静态方法,resolve和reject用于快速创建处于特定状态的 Promise 实例。

Promise.resolve () 实现

Promise.resolve()的作用是返回一个处于 "已完成"(fulfilled) 状态的 Promise 实例,它接收一个参数作为完成值。如果参数本身就是一个 Promise 实例,则直接返回该实例。

Promise.myResolve = function(value) {
  // 如果参数是Promise实例,直接返回
  if (value instanceof Promise) {
    return value;
  }

  // 否则返回一个新的已完成Promise
  return new Promise((resolve) => {
    resolve(value);
  });
};

这个实现非常直接:首先检查传入的值是否已经是 Promise 实例,如果是则直接返回;否则创建一个新的 Promise 并立即用该值完成它。

Promise.reject () 实现

Promise.reject()与resolve类似,但它返回的是一个处于 "已拒绝"(rejected) 状态的 Promise 实例。

Promise.myReject = function(reason) {
  return new Promise((resolve, reject) => {
    reject(reason);
  });
};

注意reject方法不会像resolve那样检查参数是否为 Promise 实例,无论传入什么值都会作为拒绝原因。

手写 Promise.all ()

Promise.all()是最常用的 Promise 组合方法之一,它接收一个 Promise 数组 (或可迭代对象),返回一个新的 Promise。当所有输入的 Promise 都完成时,新 Promise 才会完成,结果是一个包含所有完成值的数组;如果有任何一个输入的 Promise 被拒绝,新 Promise 会立即被拒绝。

实现思路

  1. 接收一个可迭代对象作为参数,通常是数组
  1. 返回一个新的 Promise 实例
  1. 遍历输入的所有 Promise
  1. 维护一个计数器和结果数组,记录已完成的 Promise 数量和结果
  1. 当所有 Promise 都完成时,用结果数组完成新 Promise
  1. 如果有任何一个 Promise 被拒绝,立即用该原因拒绝新 Promise

代码实现

Promise.myAll = function (promises) {
    // 返回一个新的Promise实例
    return new Promise((resolve, reject) => {
        // 存储所有成功的结果,按传入数组的顺序排列
        let results = [];
        // 记录传入的Promise总数量(用于判断是否所有Promise都已处理)
        let count = 0;
        // 记录已成功完成的Promise数量
        let fulfilledCount = 0;
        for (const p of promises) {
            let i = count++;

            // 将当前值包装为Promise(处理非Promise值的情况,如普通数字、字符串等)
            Promise.resolve(p)
                .then((data) => {
                    results[i] = data;
                    fulfilledCount++;

                    // 当所有Promise都成功时(已成功数量 === 总数量)
                    if (fulfilledCount === count) {
                        // 用结果数组resolve外部Promise
                        resolve(results);
                    }
                }, 
                // 当当前Promise失败时的回调:直接调用外部Promise的reject
                // 符合Promise.all"一错即错"的特性,立即返回第一个失败原因
                reject);
        }

        // 特殊情况:如果传入的是空数组,直接resolve空数组
        // 此时循环未执行,count保持0,直接返回空结果
        if (count === 0) {
            resolve(results);
        }
    });
};

关键细节

  • 保持结果数组的顺序与输入数组一致,即使某些 Promise 先完成
  • 只要有一个 Promise 被拒绝,就会立即触发拒绝,且只触发一次
  • 输入数组中的非 Promise 值会被Promise.resolve自动转换

手写 Promise.race ()

Promise.race()的行为类似于 "赛跑",它接收一个 Promise 数组,返回一个新的 Promise。这个新 Promise 会跟随第一个完成 (无论是完成还是拒绝) 的 Promise,采用它的结果或原因。

实现思路

  1. 接收一个可迭代对象作为参数
  1. 返回一个新的 Promise 实例
  1. 遍历输入的所有 Promise
  1. 一旦有任何一个 Promise 完成或拒绝,就用它的结果或原因处理新 Promise

代码实现

Promise.myRace = function (promises) {
    return new Promise((resolve, reject) => {
        for (const p of promises) {
            Promise.resolve(p).then(resolve, reject);
        }
    })
}

典型应用:请求超时处理

race方法非常适合实现请求超时功能:

// 模拟一个异步请求
function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => resolve('数据加载成功'), 3000);
  });
}
// 超时控制器
function timeout(ms) {
  return new Promise((_, reject) => {
    setTimeout(() => reject(new Error('请求超时')), ms);
  });
}
// 使用race实现超时控制
Promise.myRace([fetchData(), timeout(2000)])
  .then(console.log)
  .catch(console.error); // 会输出"请求超时"

手写 Promise.allSettled ()

Promise.allSettled()等待所有输入的 Promise 都 "落定"(settled),即无论是完成还是拒绝,都会等待所有 Promise 处理完毕。它返回的 Promise 会完成一个数组,每个元素表示对应 Promise 的结果,包含状态和值 / 原因。

实现思路

  1. 接收一个可迭代对象作为参数
  1. 返回一个新的 Promise 实例
  1. 遍历输入的所有 Promise
  1. 每个 Promise 完成或拒绝后,都记录其状态和结果
  1. 当所有 Promise 都落定后,用结果数组完成新 Promise

代码实现

Promise.myAllSettled = function(promises){
    let results = [];
    for (const p of promises) {
        results.push(Promise.resolve(p).then((data) => ({
            status:"fulfilled",
            data
        }),
    (reason) => ({
        status:"rejected",
        reason
    })
))
    }
    return Promise.all(results);
}

应用场景

allSettled特别适合需要知道所有异步操作结果的场景,比如批量处理数据时,即使某些操作失败,也需要知道成功的部分并继续处理。

手写 Promise.any ()

Promise.any()与all相反,它等待第一个 "成功完成" 的 Promise。只要有一个输入的 Promise 成功完成,它就会用该结果完成;如果所有输入的 Promise 都被拒绝,它会用一个包含所有拒绝原因的AggregateError拒绝。

实现思路

  1. 接收一个可迭代对象作为参数
  1. 返回一个新的 Promise 实例
  1. 遍历输入的所有 Promise
  1. 只要有一个 Promise 成功完成,就用该结果完成新 Promise
  1. 如果所有 Promise 都被拒绝,收集所有原因并拒绝新 Promise

代码实现

Promise.myAny = function(promises) {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promises)) {
      return reject(new TypeError('Argument must be an array'));
    }

    const errors = []; // 收集所有拒绝原因
    let rejectedCount = 0;

    if (promises.length === 0) {
      return reject(new AggregateError([], 'All promises were rejected'));
    }

    promises.forEach((promise) => {
      Promise.myResolve(promise).then(
        (value) => {
          // 第一个成功的Promise会触发resolve
          resolve(value);
        },
        (reason) => {
          errors.push(reason);
          rejectedCount++;

          // 所有Promise都被拒绝时
          if (rejectedCount === promises.length) {
            reject(new AggregateError(errors, 'All promises were rejected'));
          }
        }
      );
    });
  });
};

与 race 的区别

any和race都关注 "第一个有结果的 Promise",但有重要区别:

  • race返回第一个 "落定" 的 Promise,无论成功还是失败
  • any返回第一个 "成功完成" 的 Promise,忽略拒绝的 Promise,直到所有都拒绝才会拒绝

测试与验证

实现完成后,我们需要验证这些静态方法是否符合预期行为。以myAll为例:

// 测试Promise.myAll
const p1 = Promise.resolve(1);
const p2 = new Promise(resolve => setTimeout(() => resolve(2), 100));
const p3 = 3;
Promise.myAll([p1, p2, p3]).then(result => {
  console.log(result); // [1, 2, 3]
});
// 测试拒绝情况
const p4 = Promise.reject('出错了');
Promise.myAll([p1, p4, p2]).catch(reason => {
  console.log(reason); // '出错了'
});

同样的方式可以测试其他方法,确保它们的行为与原生 Promise 静态方法一致。

总结

通过手写这些 Promise 静态方法,我们深入理解了它们的内部工作机制:

  • all等待所有完成,或第一个拒绝
  • allSettled等待所有落定,收集所有结果
  • race返回第一个落定的结果
  • any等待第一个成功,或所有拒绝

掌握这些方法的实现原理,不仅能帮助我们更好地在项目中应用它们,还能提升我们对异步编程的理解。在实际开发中,选择合适的 Promise 静态方法可以大大简化异步流程控制,写出更清晰、更健壮的代码。

如果大家在学习和使用 Promise 的过程中有任何问题或心得,欢迎在评论区留言交流,也可以前往我的github 网站查看更多关于 Promise 的内容。

如果您觉得这篇文章对您有帮助,欢迎点赞和收藏,大家的支持是我继续创作优质内容的动力🌹🌹🌹也希望您能在😉😉😉我的主页 😉😉😉找到更多对您有帮助的内容。

  • 致敬每一位赶路人

AI增强摘要:

本文深入探讨了前端异步编程中Promise静态方法的实现原理和应用场景,通过手写Promise.resolve、Promise.reject、Promise.all、Promise.race、Promise.allSettled和Promise.any等方法,详细解析了它们的工作机制和实现思路。文章不仅提供了每种方法的代码实现,还通过测试案例验证了这些方法的正确性,帮助读者彻底掌握Promise静态方法的核心概念和使用技巧。此外,文章还比较了Promise.any和Promise.race的区别,强调了在实际开发中选择合适方法的重要性。

内容分类: AI工具使用教程与技巧

适合人群: 前端开发者、JavaScript程序员、技术爱好者


前端必会:Promise 全解析,从原理到实战

原文链接: https://juejin.cn/post/7533109465492914186

原始摘要:

1. 从 “回调地狱” 到 Promise

在前端开发的异步编程领域,我们常常会遇到需要处理多个异步操作的情况。早期,使用回调函数来处理异步操作是一种常见的方式,但这种方式在处理复杂的异步流程时,会带来一个让人头疼的问题 —— “回调地狱”。

1.1 回调地狱示例

假设我们有这样一个场景:李华向他的众多crush表白(人物纯属虚构,切勿带入个人)。使用传统的回调函数实现,代码可能会长这样:

function sendMessages(name, onFulfilled, onRejected) {
    console.log(`李华 to ${name}:我喜欢你`);
    console.log(`李华 等待 ${name}的回答`);
    setTimeout(() => {
        if (Math.random() <= 0.1) {
            // 调用成功之后的回调
            onFulfilled(`李华,爱老虎油`)
        } else {
            // 调用失败之后的回调
            onRejected(`李华,抱歉,我有别人追了`)
        }
    }, 1000)
}

sendMessages(
    "旺仔小乔",
    (reply) => {
        console.log("成功", reply)
    },
    (reply) => {
        console.log("失败", reply);
        sendMessages(
            "可乐大乔",
            (reply) => {
                console.log("成功", reply);
            },
            (reply) => {
                console.log("失败", reply);
                sendMessages(
                    "伊利周瑜",
                    (reply) => {
                        console.log("成功", reply)
                    },
                    (reply) => {
                        console.log("失败", reply);
                        sendMessages(
                            "尖叫张飞",
                            (reply) => { "成功", reply },
                            (reply) => {
                                "失败", reply
                                console.log("李华,这辈子也就这样了");
                            }
                        )
                    }
                )
            }
        )
    }
)

这段代码虽然实现了我们的需求,但随着异步操作的增多,回调函数的嵌套会越来越深,代码会变得越来越难以阅读和维护。想象一下,如果这里有更多的文件需要读取,或者每个异步操作之间还有其他的逻辑,代码的复杂度将会呈指数级增长,这就是所谓的 “回调地狱”。

1.2 回调地狱的问题

  • 代码可读性差:层层嵌套的回调函数使得代码的逻辑结构变得模糊,难以一眼看出各个异步操作之间的关系和执行顺序。
  • 维护困难:当需要修改其中某个异步操作的逻辑时,可能需要在多层嵌套中找到对应的回调函数,并且还要小心不影响其他部分的代码。
  • 错误处理复杂:每个回调函数都需要单独处理错误,这不仅增加了代码量,还容易出现错误处理不一致的情况。

1.3 Promise 应运而生

为了解决回调地狱的问题,ES6 引入了 Promise。Promise 是一个对象,它代表了一个异步操作的最终完成(或失败)及其结果值。简单来说,Promise 就是一个承诺,它承诺在未来的某个时间点会给你一个结果,这个结果可能是成功的数据,也可能是失败的原因。

使用 Promise 来改写上面读取文件的代码,会变得清晰很多:

sendMessages("旺仔小乔")
    .then(
        (reply) => {
            console.log("成功", reply);
            // 成功后返回一个已完成的Promise,终止链式调用
            return Promise.resolve();
        },
        (reply) => {
            console.log("失败", reply);
            // 失败后返回新的Promise,继续下一个
            return sendMessages("可乐大乔");
        }
    )
    .then(
        (reply) => {
            console.log("成功", reply);
            return Promise.resolve();
        },
        (reply) => {
            console.log("失败", reply);
            return sendMessages("伊利周瑜");
        }
    )
    .then(
        (reply) => {
            console.log("成功", reply);
            return Promise.resolve();
        },
        (reply) => {
            console.log("失败", reply);
            return sendMessages("尖叫张飞");
        }
    )
    .then(
        (reply) => {
            console.log("成功", reply);
        },
        (reply) => {
            console.log("失败", reply);
            console.log("李华,这辈子也就这样了");
        }
    );

在这段代码中,我们使用了 Promise 的链式调用,每个 then 方法都返回一个新的 Promise,这样就避免了回调函数的层层嵌套,使得代码的逻辑更加清晰,错误处理也更加统一。

1.4 学习 Promise 的重要性

在现代前端开发中,Promise 已经成为了处理异步操作的核心机制之一。无论是使用原生的 JavaScript 进行开发,还是使用各种前端框架(如 Vue、React 等),都离不开 Promise。掌握 Promise 的使用,不仅可以让我们写出更优雅、更易维护的异步代码,还能更好地理解和运用其他与异步相关的技术,如 async/await 等。因此,深入学习 Promise 是每一位前端开发者都必不可少的功课。

接下来,让我们深入了解 Promise 的基本概念和用法,看看它是如何工作的,以及如何在实际项目中灵活运用它来解决各种异步编程问题。

2. Promise 初相识 (Promise A+规范)

2.1 概念与定义

Promise 是 ES6 引入的一种异步编程的新解决方案,它是一个对象,代表了一个异步操作的最终完成(或成功)及其结果值。简单来说,Promise 就像是一个容器,里面保存着某个未来才会结束的事件(通常是异步操作)的结果。从语法上讲,Promise 是一个对象,通过它可以获取异步操作的消息,并且提供了统一的 API,使得各种异步操作都能用同样的方式进行处理。

image.png

2.2 三个状态

Promise 有三种状态:

  • Pending(等待态) :这是 Promise 的初始状态,此时异步操作尚未完成,既没有被兑现(成功)也没有被拒绝(失败)。
  • Fulfilled(成功态) :当异步操作成功完成时,Promise 的状态会变为 Fulfilled,意味着操作已经成功,我们可以从 Promise 中获取到预期的结果。此时,Promise 会携带一个值,这个值就是异步操作成功的结果。
  • Rejected(失败态) :如果异步操作失败或出现错误,Promise 的状态会变为 Rejected。此时,Promise 会携带一个原因,表示失败的原因。

状态转换规则如下:

  • 一个 Promise 一旦从 Pending 状态变为 Fulfilled 或 Rejected,就不可以再进行其他状态转变,即 Promise 的状态只能改变一次。
  • Promise 只能从 Pending 状态转换成 Fulfilled 或 Rejected 状态。具体转换流程为:当异步操作成功完成时,状态从 Pending 变为 Fulfilled,未来可以用 .then() 方法访问结果;当异步操作失败时,状态从 Pending 变为 Rejected,未来可以用 .catch() 方法访问错误信息 。

2.3 基本用法示例

下面通过一个简单的示例来展示 Promise 的基本使用:

// 创建一个 Promise
const myPromise = new Promise((resolve, reject) => {
    // 模拟异步操作,这里使用 setTimeout
    setTimeout(() => {
        const success = true; // 模拟操作结果
        if (success) {
            resolve('操作成功'); // 将 Promise 状态置为 Fulfilled,并传递成功的值
        } else {
            reject('操作失败'); // 将 Promise 状态置为 Rejected,并传递失败的原因
        }
    }, 1000);
});
// 处理 Promise 的结果
myPromise.then((result) => {
    console.log(result); // 输出: 操作成功
}).catch((error) => {
    console.error(error); // 如果失败,捕获并输出错误
});

在上述代码中,我们首先使用 new Promise 创建了一个 Promise 对象,在其执行器函数中,通过 setTimeout 模拟了一个异步操作。如果 success 为 true,则调用 resolve 方法将 Promise 的状态变为 Fulfilled,并传递成功的结果 '操作成功';如果 success 为 false,则调用 reject 方法将 Promise 的状态变为 Rejected,并传递失败的原因 '操作失败'。

然后,我们使用 then 方法来处理 Promise 成功的情况,在 then 的回调函数中,我们可以获取到 resolve 传递过来的成功结果并进行相应的处理。使用 catch 方法来处理 Promise 失败的情况,在 catch 的回调函数中,我们可以获取到 reject 传递过来的失败原因并进行错误处理。

3. Promise 的核心方法

3.1 then 方法

then 方法是 Promise 中用于处理异步操作结果的核心方法之一,它允许我们在 Promise 状态变为 fulfilled 或 rejected 时执行相应的回调函数。

3.1.1 链式调用原理

then 方法的一个重要特性是它返回一个新的 Promise,这使得我们可以进行链式调用。具体来说,then 方法接收两个可选参数:onFulfilled 和 onRejected。

  • onFulfilled:当 Promise 状态变为 fulfilled 时调用的回调函数,该函数接收 Promise 成功时的值作为参数。
  • onRejected:当 Promise 状态变为 rejected 时调用的回调函数,该函数接收 Promise 失败时的原因作为参数。

当我们调用 then 方法时,它会返回一个新的 Promise,这个新 Promise 的状态和值取决于 then 方法中回调函数的执行结果:

  • 如果 onFulfilled 或 onRejected 回调函数返回一个值,这个值会被包装成一个新的已解决(resolved)的 Promise,并作为 then 方法返回的新 Promise 的值。
  • 如果 onFulfilled 或 onRejected 回调函数抛出一个错误,这个错误会被包装成一个新的已拒绝(rejected)的 Promise,并作为 then 方法返回的新 Promise 的值。
  • 如果 onFulfilled 或 onRejected 回调函数返回一个 Promise,那么 then 方法返回的新 Promise 的状态和值将取决于这个返回的 Promise 的状态和值。

通过这种方式,我们可以将多个 then 方法串联起来,形成一个链式调用,每个 then 方法处理前一个 Promise 的结果,并返回一个新的 Promise 供下一个 then 方法处理。

3.1.2 示例与应用场景

假设我们有一个需求,需要先获取用户信息,然后根据用户信息获取用户的订单列表,最后统计订单的总金额。使用 then 方法的链式调用可以很方便地实现这个需求:

// 模拟获取用户信息的异步操作
function getUserInfo() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const user = { id: 1, name: 'John' };
            resolve(user);
        }, 1000);
    });
}
// 模拟根据用户信息获取订单列表的异步操作
function getOrderList(user) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const orders = [
                { id: 1, amount: 100, userId: user.id },
                { id: 2, amount: 200, userId: user.id }
            ];
            resolve(orders);
        }, 1000);
    });
}
// 统计订单总金额
function calculateTotalAmount(orders) {
    return orders.reduce((total, order) => total + order.amount, 0);
}
getUserInfo()
   .then(user => getOrderList(user))
   .then(orders => calculateTotalAmount(orders))
   .then(totalAmount => console.log(`订单总金额为: ${totalAmount}`))
   .catch(error => console.error('操作过程中出现错误:', error));

在这个示例中,getUserInfo 返回一个 Promise,当这个 Promise 成功时,then 方法会调用 getOrderList 并传入用户信息,getOrderList 又返回一个 Promise,当这个 Promise 成功时,下一个 then 方法会调用 calculateTotalAmount 并传入订单列表,最后计算出订单总金额并打印。如果在任何一个步骤中出现错误,catch 方法会捕获并处理错误。

3.2 catch 方法

catch 方法是 Promise 中用于捕获错误的方法,它是 then 方法的语法糖,用于简化错误处理。

3.2.1 错误捕获机制

catch 方法实际上是 then(null, onRejected) 的简写形式,它专门用于捕获 Promise 链中任何一个环节抛出的错误。当 Promise 链中的某个 Promise 被拒绝(rejected)时,如果之前的 then 方法没有提供 onRejected 回调函数来处理错误,那么这个错误会一直向后传递,直到被 catch 方法捕获。

例如:

new Promise((resolve, reject) => {
    setTimeout(() => {
        reject('操作失败');
    }, 1000);
})
   .then(result => console.log(result))
   .catch(error => console.error('捕获到错误:', error));

在这个例子中,Promise 被拒绝并传递了错误信息 '操作失败',由于第一个 then 方法没有提供 onRejected 回调函数,所以错误会被后面的 catch 方法捕获并处理。

3.2.2 错误处理最佳实践

在项目中使用 catch 方法进行错误处理时,有一些最佳实践建议:

  • 统一错误处理:在 Promise 链的末尾使用 catch 方法来捕获所有可能的错误,这样可以确保错误不会被遗漏,并且可以在一个地方统一处理错误。
  • 错误日志记录:在 catch 方法中,除了对错误进行处理外,还应该记录错误日志,以便后续排查问题。可以使用浏览器的控制台日志或者专业的日志记录工具。
  • 避免在 catch 中抛出新错误:尽量避免在 catch 方法中再次抛出新的错误,因为这会导致错误处理变得更加复杂,并且可能会使错误在 Promise 链中继续传递,难以追踪。如果确实需要在 catch 中处理错误后返回一个新的 Promise,应该使用 resolve 或 reject 来处理,而不是抛出新错误。

3.3 finally 方法

finally 方法是 ES9(ES2018) 引入的 Promise 方法,它的特点是无论 Promise 的状态是 fulfilled 还是 rejected,都会执行其中的回调函数。

finally 方法主要用于一些资源清理的场景,比如在异步操作完成后关闭文件、释放网络连接等。它的回调函数不接收任何参数,因为它不关心 Promise 的最终状态是成功还是失败。

例如,我们在使用 fetch 进行网络请求时,可以使用 finally 方法来显示加载状态的结束:

function fetchData() {
    console.log('开始加载数据...');
    return fetch('https://api.example.com/data')
       .then(response => response.json())
       .catch(error => console.error('请求出错:', error))
       .finally(() => console.log('数据加载结束'));
}
fetchData();

在这个例子中,无论 fetch 请求成功还是失败,finally 方法中的回调函数都会执行,打印出 '数据加载结束',这样可以确保加载状态的显示与实际的异步操作完成情况一致。

4. Promise 的高级应用

4.1 Promise.all

4.1.1 并发请求处理

Promise.all 方法用于并行处理多个异步任务,它接收一个包含多个 Promise 对象的可迭代对象(如数组)作为参数,并返回一个新的 Promise。只有当传入的所有 Promise 都成功完成(状态变为 fulfilled)时,返回的新 Promise 才会成功,其结果是一个包含所有成功结果的数组,且数组中结果的顺序与传入的 Promise 顺序一致。如果其中任何一个 Promise 失败(状态变为 rejected),则返回的新 Promise 会立即失败,失败原因是第一个失败的 Promise 的错误信息。

例如,我们有三个异步任务,分别模拟从不同的 API 获取数据:

function fetchData1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('数据1');
        }, 1000);
    });
}
function fetchData2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('数据2');
        }, 2000);
    });
}
function fetchData3() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('数据3');
        }, 1500);
    });
}
Promise.all([fetchData1(), fetchData2(), fetchData3()])
   .then(results => {
        console.log(results); // 输出: ['数据1', '数据2', '数据3']
    })
   .catch(error => {
        console.error(error);
    });

在这个例子中,Promise.all 会同时启动这三个异步任务,尽管它们的完成时间不同,但最终会等待所有任务都完成后,将结果以数组的形式返回。如果其中某个任务失败,比如 fetchData2 改为:

function fetchData2() {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject('获取数据2失败');
        }, 2000);
    });
}

那么 Promise.all 返回的 Promise 会立即失败,catch 方法会捕获到错误信息 '获取数据2失败'。

4.1.2 实际项目案例

在一个电商项目中,我们可能需要在商品详情页面展示商品的基本信息、评论列表和相关推荐商品。这些数据分别来自不同的 API 接口,我们可以使用 Promise.all 来并发请求这些数据,从而提高页面的加载效率。

// 获取商品基本信息
function getProductInfo(productId) {
    return fetch(`https://api.example.com/products/${productId}`)
       .then(response => response.json());
}
// 获取商品评论列表
function getProductReviews(productId) {
    return fetch(`https://api.example.com/products/${productId}/reviews`)
       .then(response => response.json());
}
// 获取相关推荐商品
function getRelatedProducts(productId) {
    return fetch(`https://api.example.com/products/${productId}/related`)
       .then(response => response.json());
}
const productId = 123;
Promise.all([
    getProductInfo(productId),
    getProductReviews(productId),
    getRelatedProducts(productId)
])
   .then(([productInfo, reviews, relatedProducts]) => {
        // 处理数据,展示在页面上
        console.log('商品基本信息:', productInfo);
        console.log('商品评论列表:', reviews);
        console.log('相关推荐商品:', relatedProducts);
    })
   .catch(error => {
        console.error('请求数据失败:', error);
    });

通过这种方式,我们可以并行地获取这三个数据,而不需要依次等待每个请求完成,大大缩短了页面的加载时间,提升了用户体验。如果其中任何一个请求失败,整个 Promise.all 就会失败,我们可以在 catch 方法中统一处理错误。

4.2 Promise.race

Promise.race 方法同样接收一个包含多个 Promise 对象的可迭代对象作为参数,并返回一个新的 Promise。它的特点是,只要传入的 Promise 中有一个率先完成(无论是成功还是失败),返回的新 Promise 就会立即以这个率先完成的 Promise 的结果或错误进行解决或拒绝。

例如,我们有两个异步任务,一个任务模拟成功响应,另一个任务模拟失败响应:

function task1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('任务1成功');
        }, 2000);
    });
}
function task2() {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject('任务2失败');
        }, 1000);
    });
}
Promise.race([task1(), task2()])
   .then(result => {
        console.log(result); // 不会执行
    })
   .catch(error => {
        console.error(error); // 输出: 任务2失败
    });

在这个例子中,task2 会在 1 秒后失败,而 task1 需要 2 秒后才成功,所以 Promise.race 返回的 Promise 会立即失败,错误信息为 '任务2失败'。

Promise.race 常用于设置请求超时的场景。比如,我们发起一个网络请求获取数据,但希望在一定时间内如果没有收到响应,就视为请求超时并进行相应处理:

function fetchData() {
    return fetch('https://api.example.com/data')
       .then(response => response.json());
}
function timeout(duration) {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject(new Error('请求超时'));
        }, duration);
    });
}
Promise.race([fetchData(), timeout(3000)])
   .then(data => {
        console.log('请求成功:', data);
    })
   .catch(error => {
        console.error('请求失败:', error.message);
    });

在这个例子中,fetchData 发起网络请求获取数据,timeout(3000) 创建一个 3 秒后失败的 Promise。Promise.race 会同时执行这两个 Promise,如果 fetchData 在 3 秒内成功获取数据,就会执行 then 方法处理数据;如果 3 秒内 fetchData 没有完成,timeout 会率先失败,Promise.race 返回的 Promise 就会失败,执行 catch 方法,提示请求超时。

4.3 Promise.allSettled

Promise.allSettled 方法也接收一个包含多个 Promise 对象的可迭代对象作为参数,并返回一个新的 Promise。与 Promise.all 不同的是,Promise.allSettled 会等待所有传入的 Promise 都有结果(无论成功还是失败),然后返回一个包含所有 Promise 状态和结果的数组。数组中的每个元素是一个对象,包含 status(表示 Promise 的状态,取值为 'fulfilled' 或 'rejected')和 value(如果状态是 fulfilled,则为成功的结果;如果状态是 rejected,则为失败的原因)。

例如:

function task1() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('任务1成功');
        }, 1000);
    });
}
function task2() {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject('任务2失败');
        }, 2000);
    });
}
Promise.allSettled([task1(), task2()])
   .then(results => {
        results.forEach((result, index) => {
            if (result.status === 'fulfilled') {
                console.log(`任务${index + 1}成功,结果为:`, result.value);
            } else {
                console.log(`任务${index + 1}失败,原因是:`, result.reason);
            }
        });
    });

在这个例子中,Promise.allSettled 会等待 task1 和 task2 都有结果后,返回一个包含两个对象的数组。第一个对象表示 task1 的状态和结果,第二个对象表示 task2 的状态和原因。通过这种方式,我们可以全面了解每个异步任务的执行情况,而不会因为某个任务的失败而中断对其他任务结果的处理。

Promise.allSettled 适用于一些需要对多个异步操作的结果进行汇总分析的场景。比如在一个批量数据处理的任务中,我们需要向多个服务器发送数据更新请求,无论每个请求是否成功,都需要记录下每个请求的结果,以便后续进行错误排查和统计分析:

function updateServer1(data) {
    return new Promise((resolve, reject) => {
        // 模拟网络请求
        setTimeout(() => {
            if (Math.random() > 0.5) {
                resolve('服务器1更新成功');
            } else {
                reject('服务器1更新失败');
            }
        }, 1000);
    });
}
function updateServer2(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                resolve('服务器2更新成功');
            } else {
                reject('服务器2更新失败');
            }
        }, 1500);
    });
}
const data = { key: 'value' };
Promise.allSettled([updateServer1(data), updateServer2(data)])
   .then(results => {
        let successCount = 0;
        let failureCount = 0;
        results.forEach((result, index) => {
            if (result.status === 'fulfilled') {
                successCount++;
                console.log(`服务器${index + 1}更新成功,结果为:`, result.value);
            } else {
                failureCount++;
                console.log(`服务器${index + 1}更新失败,原因是:`, result.reason);
            }
        });
        console.log(`成功更新的服务器数量: ${successCount}`);
        console.log(`更新失败的服务器数量: ${failureCount}`);
    });

在这个例子中,Promise.allSettled 可以帮助我们统计出成功和失败的服务器更新次数,方便对整个批量更新操作的结果进行评估和后续处理。

4.4 Promise.any

Promise.any 方法接收一个包含多个 Promise 对象的可迭代对象作为参数,并返回一个新的 Promise。它的特性是只要传入的 Promise 中有一个成功(状态变为 fulfilled),返回的新 Promise 就会立即成功,其结果就是第一个成功的 Promise 的结果。如果所有传入的 Promise 都失败(状态变为 rejected),则返回的新 Promise 会失败,并抛出一个 AggregateError 错误,该错误包含所有失败的原因。

例如:

function task1() {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject('任务1失败');
        }, 2000);
    });
}
function task2() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('任务2成功');
        }, 1000);
    });
}
function task3() {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject('任务3失败');
        }, 1500);
    });
}
Promise.any([task1(), task2(), task3()])
   .then(result => {
        console.log('第一个成功的任务结果:', result); // 输出: 任务2成功
    })
   .catch(error => {
        console.error('所有任务都失败:', error);
    });

在这个例子中,task2 会在 1 秒后成功,虽然 task1 和 task3 会失败,但 Promise.any 只关注第一个成功的 Promise,所以会立即返回 task2 的成功结果。

Promise.any 适用于需要获取第一个成功结果的场景。比如在一个应用中,我们有多个数据源可以获取用户的偏好设置,但只要从其中一个数据源成功获取到数据,就可以满足需求,不需要等待其他数据源的响应:

function fetchPreferencesFromSource1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                resolve({ theme: 'dark' });
            } else {
                reject('数据源1获取失败');
            }
        }, 1000);
    });
}
function fetchPreferencesFromSource2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                resolve({ language: 'en' });
            } else {
                reject('数据源2获取失败');
            }
        }, 1500);
    });
}
function fetchPreferencesFromSource3() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                resolve({ notifications: true });
            } else {
                reject('数据源3获取失败');
            }
        }, 2000);
    });
}
Promise.any([fetchPreferencesFromSource1(), fetchPreferencesFromSource2(), fetchPreferencesFromSource3()])
   .then(preferences => {
        console.log('获取到用户偏好设置:', preferences);
    })
   .catch(error => {
        console.error('所有数据源获取失败:', error);
    });

在这个例子中,只要有一个数据源成功获取到用户偏好设置,Promise.any 就会返回该结果,从而快速满足应用对用户偏好数据的需求。如果所有数据源都获取失败,catch 方法会捕获到 AggregateError 错误,我们可以根据具体情况进行处理,比如提示用户获取偏好设置失败。

5. Promise 与 async/await

5.1 async/await 语法糖

async/await 是 ES2017 引入的异步编程语法糖,它建立在 Promise 的基础之上,使得异步代码看起来更像是同步代码,极大地提升了代码的可读性和可维护性 。async 用于声明一个异步函数,该函数始终返回一个 Promise 对象。await 关键字只能在 async 函数内部使用,用于等待一个 Promise 对象的解决(resolved)或拒绝(rejected),它会暂停当前 async 函数的执行,直到被等待的 Promise 对象返回结果。

例如:

async function asyncFunction() {
    try {
        const result = await new Promise((resolve) => {
            setTimeout(() => {
                resolve('异步操作结果');
            }, 1000);
        });
        console.log(result); // 输出: 异步操作结果
    } catch (error) {
        console.error(error);
    }
}
asyncFunction();

在这个例子中,asyncFunction 是一个异步函数,await 等待 new Promise 返回的结果,当 Promise 成功解决后,await 会将结果赋值给 result,然后继续执行后面的代码。如果 Promise 被拒绝,catch 块会捕获到错误并进行处理。

5.2 对比与优势

  • 写法对比:使用 Promise 时,我们通过链式调用 then 方法来处理异步操作的结果,而 async/await 则通过 await 关键字来等待 Promise 的结果,使代码看起来更像同步代码。例如,同样是获取用户信息并根据用户信息获取订单列表的操作:
    • Promise 写法
function getUserInfo() {
    return new Promise((resolve) => {
        setTimeout(() => {
            const user = { id: 1, name: 'John' };
            resolve(user);
        }, 1000);
    });
}
function getOrderList(user) {
    return new Promise((resolve) => {
        setTimeout(() => {
            const orders = [
                { id: 1, amount: 100, userId: user.id },
                { id: 2, amount: 200, userId: user.id }
            ];
            resolve(orders);
        }, 1000);
    });
}
getUserInfo()
   .then(user => getOrderList(user))
   .then(orders => console.log(orders))
   .catch(error => console.error(error));
  • async/await 写法
async function getUserAndOrders() {
    try {
        const user = await getUserInfo();
        const orders = await getOrderList(user);
        console.log(orders);
    } catch (error) {
        console.error(error);
    }
}
getUserAndOrders();

可以看出,async/await 的写法更加简洁直观,代码结构更接近同步代码,阅读起来更容易理解。

  • 错误处理优势:在 Promise 中,错误处理通常通过 catch 方法在链式调用的末尾进行捕获。而在 async/await 中,可以使用传统的 try...catch 语句来捕获错误,这种方式更加符合我们处理同步代码错误的习惯,使得错误处理的代码位置更清晰,也更容易维护。例如,在上面的代码中,如果 getUserInfo 或 getOrderList 抛出错误,在 Promise 写法中,需要在最后一个 then 方法之后的 catch 中处理;而在 async/await 写法中,可以直接在 try 块中捕获并在 catch 块中处理,更方便定位和处理错误。

5.3 实际应用示例

在实际项目中,async/await 常用于处理网络请求、数据库操作等异步任务。以一个简单的前端项目为例,我们使用 fetch 进行网络请求获取数据,并使用 async/await 进行处理:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>async/await 示例</title>
</head>
<body>
    <script>
        async function fetchData() {
            try {
                const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
                if (!response.ok) {
                    throw new Error('网络请求失败');
                }
                const data = await response.json();
                console.log(data);
            } catch (error) {
                console.error('获取数据失败:', error);
            }
        }
        fetchData();
    </script>
</body>
</html>

在这段代码中,fetchData 是一个异步函数,使用 await 等待 fetch 请求返回的 Promise 对象,然后检查响应状态,如果状态正常,再等待解析 JSON 数据。如果在任何一步出现错误,catch 块会捕获并处理错误。这种写法使得网络请求的处理逻辑更加清晰,易于理解和维护。通过这个示例,我们可以看到 async/await 在实际项目中的应用场景和优势,它让异步编程变得更加简单和高效。

6. Promise 的原理与实现

6.1 内部机制剖析

Promise 的核心是一个状态机,它的内部机制涉及到状态管理、任务队列以及微任务与宏任务的处理。

  • 状态管理:Promise 有三种状态:Pending(等待态)、Fulfilled(成功态)和Rejected(失败态)。状态的转换是单向且不可逆的,一旦从Pending状态转变为Fulfilled或Rejected状态,就不能再发生改变。当我们创建一个 Promise 时,它会初始化为Pending状态。在异步操作完成后,根据结果调用resolve函数将状态转变为Fulfilled,并传递成功的值;或者调用reject函数将状态转变为Rejected,并传递失败的原因。
  • 任务队列:Promise 内部维护了一个任务队列,用于存储在then方法中注册的回调函数。当 Promise 的状态发生改变时,会触发任务队列中的回调函数执行。例如,当状态变为Fulfilled时,会依次执行任务队列中onFulfilled回调函数;当状态变为Rejected时,会依次执行onRejected回调函数 。
  • 微任务与宏任务:在 JavaScript 的事件循环机制中,任务分为宏任务(macrotask)和微任务(microtask)。宏任务如setTimeout、setInterval、script(整体代码)等,微任务如Promise.then、MutationObserver等。Promise 的then方法注册的回调函数属于微任务。当一个宏任务执行完毕后,会先检查微任务队列,并依次执行微任务队列中的所有任务,然后再去执行下一个宏任务。这就保证了 Promise 的then回调函数总是在当前宏任务结束后,下一个宏任务开始前执行。例如:
console.log('script start');
setTimeout(() => {
    console.log('setTimeout');
}, 0);
Promise.resolve()
  .then(() => {
        console.log('promise1');
    })
  .then(() => {
        console.log('promise2');
    });
console.log('script end');

在这段代码中,首先输出script start和script end,这是同步代码的执行。然后setTimeout被放入宏任务队列,Promise.resolve().then被放入微任务队列。由于微任务优先于宏任务执行,所以先输出promise1和promise2,最后输出setTimeout。通过这样的机制,Promise 实现了异步操作的有序处理和回调函数的延迟执行,使得异步编程更加可控和可预测。

6.2 手写 Promise 简易版

为了更深入地理解 Promise 的工作原理,我们可以手写一个简易版的 Promise。下面是一个基本的实现,它包含了 Promise 的核心功能:状态管理、then方法的链式调用以及错误处理。

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED ='rejected';
class MyPromise {
    constructor(executor) {
        this.state = PENDING;
        this.value = undefined;
        this.reason = undefined;
        this.onFulfilledCallbacks = [];
        this.onRejectedCallbacks = [];
        const resolve = (value) => {
            if (this.state === PENDING) {
                this.state = FULFILLED;
                this.value = value;
                this.onFulfilledCallbacks.forEach(callback => callback(this.value));
            }
        };
        const reject = (reason) => {
            if (this.state === PENDING) {
                this.state = REJECTED;
                this.reason = reason;
                this.onRejectedCallbacks.forEach(callback => callback(this.reason));
            }
        };
        try {
            executor(resolve, reject);
        } catch (error) {
            reject(error);
        }
    }
    then(onFulfilled, onRejected) {
        onFulfilled = typeof onFulfilled === 'function'? onFulfilled : value => value;
        onRejected = typeof onRejected === 'function'? onRejected : reason => { throw reason };
        return new MyPromise((nextResolve, nextReject) => {
            if (this.state === FULFILLED) {
                setTimeout(() => {
                    try {
                        const x = onFulfilled(this.value);
                        this.#resolvePromise(nextResolve, nextReject, x);
                    } catch (error) {
                        nextReject(error);
                    }
                }, 0);
            }
            if (this.state === REJECTED) {
                setTimeout(() => {
                    try {
                        const x = onRejected(this.reason);
                        this.#resolvePromise(nextResolve, nextReject, x);
                    } catch (error) {
                        nextReject(error);
                    }
                }, 0);
            }
            if (this.state === PENDING) {
                this.onFulfilledCallbacks.push(() => {
                    setTimeout(() => {
                        try {
                            const x = onFulfilled(this.value);
                            this.#resolvePromise(nextResolve, nextReject, x);
                        } catch (error) {
                            nextReject(error);
                        }
                    }, 0);
                });
                this.onRejectedCallbacks.push(() => {
                    setTimeout(() => {
                        try {
                            const x = onRejected(this.reason);
                            this.#resolvePromise(nextResolve, nextReject, x);
                        } catch (error) {
                            nextReject(error);
                        }
                    }, 0);
                });
            }
        });
    }
    catch(onRejected) {
        return this.then(null, onRejected);
    }
    #resolvePromise(nextResolve, nextReject, x) {
        if (x === this) {
            return nextReject(new TypeError('Chaining cycle detected for promise'));
        }
        if (x instanceof MyPromise) {
            x.then(nextResolve, nextReject);
        } else if (x!== null && (typeof x === 'object' || typeof x === 'function')) {
            let called = false;
            try {
                const then = x.then;
                if (typeof then === 'function') {
                    then.call(x, (y) => {
                        if (called) return;
                        called = true;
                        this.#resolvePromise(nextResolve, nextReject, y);
                    }, (r) => {
                        if (called) return;
                        called = true;
                        nextReject(r);
                    });
                } else {
                    nextResolve(x);
                }
            } catch (error) {
                if (called) return;
                called = true;
                nextReject(error);
            }
        } else {
            nextResolve(x);
        }
    }
}

在这个实现中:

  • constructor方法接收一个执行器函数executor,并初始化 Promise 的状态为PENDING,同时定义了用于存储成功值value、失败原因reason以及成功和失败回调函数的数组onFulfilledCallbacks和onRejectedCallbacks。在执行器函数中,调用resolve和reject函数来改变 Promise 的状态,并触发相应的回调函数。
  • then方法用于处理 Promise 的成功和失败情况。它接收两个回调函数onFulfilled和onRejected,并返回一个新的 Promise。在then方法中,根据当前 Promise 的状态,决定是立即执行回调函数,还是将回调函数添加到相应的回调函数数组中等待状态改变时执行。如果回调函数返回一个值,会根据这个值的类型来决定如何处理新的 Promise;如果返回的是一个 Promise,则等待这个 Promise 完成后再决定新 Promise 的状态。
  • catch方法是then(null, onRejected)的简写,用于捕获 Promise 链中的错误。
  • resolvePromise方法是一个内部方法,用于处理then方法中回调函数返回值为 Promise 或者其他对象的情况,确保正确地处理链式调用和状态传递。通过这个简易版的 Promise 实现,我们可以更清晰地看到 Promise 的工作原理,包括状态的管理、回调函数的执行以及链式调用的实现机制,有助于我们在实际开发中更好地理解和运用 Promise。

随着前端技术的不断发展,异步编程将继续在前端开发中扮演重要的角色。希望透过这篇文章让大家理解Promise,Promise 作为异步编程的基础,也将不断演进和完善。希望大家在今后的前端开发中,能够熟练运用 Promise,让我们的代码更加优雅、高效!如果大家在学习和使用 Promise 的过程中有任何问题或心得,欢迎在评论区留言交流,也可以前往我的github 网站查看更多关于 Promise 的内容。

如果您觉得这篇文章对您有帮助,欢迎点赞和收藏,大家的支持是我继续创作优质内容的动力🌹🌹🌹也希望您能在😉😉😉我的主页 😉😉😉找到更多对您有帮助的内容。

  • 致敬每一位赶路人

AI增强摘要:

这篇文章深入探讨了前端开发中Promise的重要性及其应用。从回调地狱的问题出发,详细介绍了Promise如何通过链式调用解决异步编程中的复杂性和可读性问题。文章不仅解释了Promise的基本概念、三种状态(Pending、Fulfilled、Rejected)及其转换规则,还通过实例展示了Promise的核心方法(then、catch、finally)的使用场景和最佳实践。此外,文章强调了掌握Promise对于现代前端开发者的重要性,以及如何在实际项目中灵活运用Promise来处理各种异步编程问题。

内容分类: AI工具使用教程与技巧

适合人群: 前端开发者、JavaScript程序员、全栈开发者


一款令人惊艳的中文排版工具,开源了!

原文链接: https://mp.weixin.qq.com/s?__biz=MzAxOTcxNTIwNQ==&mid=2457990133&idx=1&sn=9c0e63262ab2ed84a4868103e592b469

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章提供了验证的步骤,包括点击视频、小程序、点赞或取消点赞、在看或取消在看等操作。这些步骤旨在确保用户身份的真实性和安全性,防止自动化脚本或机器人的滥用。核心观点是通过简单的用户交互验证来维护平台的安全和秩序。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、安全工程师、技术爱好者


Windows MCP,开源了!

原文链接: https://mp.weixin.qq.com/s?__biz=MzAxOTcxNTIwNQ==&mid=2457990110&idx=1&sn=b08fbce7007592a298af7722ea518920

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章可能探讨了网络安全、用户验证流程的重要性,或是如何在异常情况下保护用户数据和服务的稳定性。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全专家、IT管理员、技术爱好者


九天大模型大变身:性能狂飙35%!还能一键P大象

原文链接: https://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2652616413&idx=1&sn=49048545d9149e9d8bd5a9aba66dc2fc

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具滥用。文章可能探讨了网络安全、用户验证流程的重要性,或是如何在异常情况下保护用户数据和系统安全。核心观点可能集中在如何有效实施验证流程以平衡安全性和用户体验。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全专家、系统管理员、技术爱好者


马斯克再放大招!Grok AI短视频爆火,一夜疯狂刷屏

原文链接: https://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2652616413&idx=2&sn=230bb0d989de6cbd2e47e2cf18e69d17

原始摘要:

AI增强摘要:

文章内容似乎涉及到一个环境异常的情况,提示用户需要完成验证才能继续访问。这可能是一个网络安全措施,旨在防止自动化工具或机器人的滥用。文章还提到了视频、小程序以及点赞和在看的功能,暗示了这可能是一个社交媒体或内容分享平台上的通知或提示。核心观点可能是关于平台安全性和用户互动的平衡,关键洞见在于如何在不影响用户体验的前提下实施有效的安全验证。

内容分类: AI工具使用教程与技巧

适合人群: 社交媒体用户、内容创作者、网络安全爱好者


东亚修图邪术鼻祖,怎么悄悄成了爆款AI应用制造工厂?

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NzUxMzQ5Mw==&mid=2648136100&idx=1&sn=5271643551293baaf0318531befb9a3d

原始摘要:

修图界的AI应用工厂

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者


超火的跨次元互动视频!1张图让小八跳进我的杯子里

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NzUxMzQ5Mw==&mid=2648136060&idx=2&sn=069d779064323a4e50e240ccb629946f

原始摘要:

小八怎么跳到我杯子里了😮 (画面由AI生成,仅供娱乐)

这里附上图生视频提示词参考: 电脑屏幕上一个可爱的卡通人物套着游泳圈游泳,从屏幕跳出来,跳到人手拿着的水杯里,溅起水花和浪花,保持微笑的表情,展现了一幕虚实交融的奇妙瞬间。 制作工具:通义万相 体验地址: https://tongyi.aliyun.com/wanxiang/explore

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一过程可能涉及视频或小程序的互动,如点赞或取消点赞、在看或取消在看等操作。文章核心在于提醒用户注意环境异常,并指导用户如何通过简单的互动操作来完成验证,确保服务的连续性和安全性。

内容分类: AI工具使用教程与技巧

适合人群: 互联网用户、技术支持人员、网站管理员


Gemini月访问量激增至7亿;Agent上新带飞MiniMax跻身国内榜Top20 | AI产品月榜

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NzUxMzQ5Mw==&mid=2648135999&idx=1&sn=9062d61f104844015e4aad18d9144cfb

原始摘要:

新榜出品

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。验证过程可能包括点击验证按钮、观看视频、使用小程序或进行点赞等互动操作。这些步骤旨在验证用户的人类身份,而非自动化程序。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、普通互联网用户


非凡大赏:数字员工|如何落地 ROI、阻力与组织改造

原文链接: https://mp.weixin.qq.com/s?__biz=MzU5Mjg5MjQ5Ng==&mid=2247518473&idx=1&sn=7e0ca3375eda57f8f70f6ca74d57920f

原始摘要:

通用Agent落地失败的核心在于“毛坯房逻辑”

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动功能如点赞和在看的操作方式。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网站管理员、网络安全专家


非凡大赏:AI多模态|All-in-One VS Vertical,商业落点之争

原文链接: https://mp.weixin.qq.com/s?__biz=MzU5Mjg5MjQ5Ng==&mid=2247518460&idx=1&sn=c3cd5a739e1efaae69b01a969498470e

原始摘要:

技术卡位 vs 用户需求,谁优先?

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看功能的互动提示,表明内容可能涉及用户互动或社交媒体功能的使用。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网络安全专家、社交媒体管理员


8点1氪:北大录取通知书被指有语句问题;特朗普上白宫屋顶喊话,开玩笑“造核武器”;农行首次登顶A股市值冠军

原文链接: https://mp.weixin.qq.com/s?__biz=MzI2NDk5NzA0Mw==&mid=2248852604&idx=1&sn=af9cd275bd539fd6a95f409e91d17bd3

原始摘要:

北京大学工作人员回应称,感谢网友提出的建议,将及时向学校招生办反映相关情况,后续将研究如何改进。

AI增强摘要:

当前环境出现异常,用户需要进行验证以继续访问。此提示可能涉及网络安全措施,旨在防止自动化工具或恶意软件的滥用。用户需完成简单的验证步骤,如点击按钮或解决验证码,以确保其为真实用户而非机器人。这一机制常见于高流量或敏感操作的网站和应用中,以保护系统安全和用户体验。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网站开发者、普通互联网用户


打工人最爱的速食,正在集体塌房

原文链接: https://mp.weixin.qq.com/s?__biz=MzI2NDk5NzA0Mw==&mid=2248852604&idx=2&sn=a98ec5ab05435ddca11ded71bbe1b272

原始摘要:

“到底还有没有牌子能放心吃啊”。

AI增强摘要:

当前环境异常,完成验证后即可继续访问。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者


前华米高管创业,给宠物项圈加上AI,已完成Pre‑A轮融资|早起看早期

原文链接: https://mp.weixin.qq.com/s?__biz=MzI2NDk5NzA0Mw==&mid=2248852604&idx=4&sn=6f9030b4ddc5cc894b370029f174f215

原始摘要:

《涌现NewThings》是我们关注新兴AI应用的一档新栏目,如果你也是文生图/视频、情感陪伴、Coding、智能硬件等等AI应用创业者,只要你够新、够炫、够好玩,都欢迎添加文末作者微信与我们联系。

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around user interaction and verification processes in digital platforms, highlighting the importance of security measures and user engagement features.

内容分类: AI工具使用教程与技巧

适合人群: digital platform users, web developers, UI/UX designers


18岁的你vs现在的你,如果能对话会说什么?我用这个Agent拍出来了

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5ODU1MzQzOQ==&mid=2451427129&idx=1&sn=ca9a29f2c37720e94e3344dd9b48686d

原始摘要:

突然想到很多爆款视频是:如果和10年、20年前的自己对话,你会说什么?

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动(如点赞和在看)的即时反馈机制。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、技术爱好者


这个会损伤大脑的小习惯,很多人当优点去培养

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902208&idx=1&sn=944adae1e4f86bd1da004201958f0fa6

原始摘要:

你是不是每天也在用这样的方式,PUA你的大脑?

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户的安全访问或防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看功能的互动方式,暗示了内容可能涉及社交媒体或在线平台的用户交互和安全措施。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网络安全专家、社交媒体管理员


非科班爱好者,心理学入行的务实选择看这里

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902208&idx=2&sn=a6cb5d76278ef5bcd9c833ef30c0ff6c

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章可能探讨了网络安全、用户验证技术或是应对网络异常的策略。核心观点可能集中在如何有效进行用户验证以保障平台安全,同时提升用户体验。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全专家、网站管理员、技术爱好者


这个多数人都有的 “择偶心态” 看似害人不浅,其实没毛病!

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902208&idx=4&sn=654f979357ba939d814c0c14937aacf4

原始摘要:

AI增强摘要:

当前环境异常,需要完成验证后才能继续访问。这可能涉及到网络安全措施,如防止自动化攻击或验证用户身份。文章内容提示了通过视频或小程序进行验证的可能性,并提到了点赞和在看的功能,暗示了社交互动或内容分享的环节。核心观点在于强调在当前网络环境下,验证过程的重要性以及社交互动的便捷性。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网络安全爱好者、社交媒体用户


面对「成年人的世界」,你有足够的心理成熟度吗?

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902208&idx=5&sn=2db96902133167b90fb1dab1d4502085

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户的互动体验,同时提供了便捷的操作方式。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、产品经理、用户体验设计师


有这种特质的人,会令人永远「上头」

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902069&idx=1&sn=00a5d9d83457a8cdb15348b38834e428

原始摘要:

真正的「高段位」

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户的安全访问或防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的便捷性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全爱好者、普通互联网用户


一种很新的「四人约会」,可以拯救疲惫的关系

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247901921&idx=1&sn=2435d6cbdd372fa6afa246bbfa600cb8

原始摘要:

能一起这样玩的情侣,基本不会分手

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around the necessity of user verification in maintaining secure and uninterrupted access to digital platforms, highlighting the balance between user convenience and security measures.

内容分类: AI工具使用教程与技巧

适合人群: digital platform users, security enthusiasts, and developers interested in user verification processes


非科班爱好者,心理学入行的务实选择看这里

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247901921&idx=5&sn=524410e8a9d7a7ea6a04cb1c6b5a2321

原始摘要:

AI增强摘要:

该文章内容似乎涉及到一个环境异常的通知,提示用户需要进行验证以继续访问。这可能与网络安全、用户认证或系统访问控制相关。核心观点在于强调在当前环境下,完成验证是继续访问的必要步骤,反映了对安全性和用户身份验证的重视。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全专家、系统管理员、IT支持人员


为什么早期AI公司的网站过于精美并非好事?来自Linear联合创始人的案例拆解!

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg3NTk3MzQ4MQ==&mid=2247508551&idx=1&sn=2ef9bfc6f37e5079ddf64d37decfd6e4

原始摘要:

网页是品牌构建的第一步,也是对用户的主动筛选。

AI增强摘要:

文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。这可能是一个网络安全措施,旨在保护用户免受潜在的网络威胁。核心观点在于强调在当前网络环境下,验证过程的重要性,以确保访问的安全性和连续性。关键洞见可能包括对网络安全措施的重视,以及用户在面对此类提示时应采取的适当行动。

内容分类: AI工具使用教程与技巧

适合人群: 网络用户、IT安全爱好者


PMF是科学还是玄学?AI应用如何搭建增长飞轮?|Linkloud第三十二期沙龙实录(二)

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg3NTk3MzQ4MQ==&mid=2247508536&idx=1&sn=5352522dac00a6681795e2f95ea2bcbc

原始摘要:

来听听三位创业老司机带来了哪些深度洞察。

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一过程可能涉及视频验证或小程序互动,如点赞或取消点赞、在看或取消在看等操作。文章核心在于指导用户如何应对环境异常情况下的验证流程,确保顺利访问所需内容。

内容分类: AI工具使用教程与技巧

适合人群: 普通互联网用户、技术支持人员、网站管理员


友情招募:多家知名SaaS/AI公司优质岗位来袭,快来加入全球化浪潮!

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg3NTk3MzQ4MQ==&mid=2247508536&idx=2&sn=762388130be794db0525a325bb8c1171

原始摘要:

热门岗位招聘中RECRUITMENT WORK各位小伙伴大家好,最近我们的老朋友 Stripe 、小宿科技、

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了当前网络环境的安全验证机制和社交媒体互动功能的便捷性。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、社交媒体用户


第一个符合国人体质的办公 Agent 用起来咋样:不逼用户学AI,反教AI用产品。

原文链接: https://mp.weixin.qq.com/s?__biz=MzU1NDgyNDQ1Ng==&mid=2247509371&idx=1&sn=ce1d57f2bde7bd6748ebcf688ea7ec68

原始摘要:

你从小用到大的国产软件这次给友商打了个样

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章可能探讨了网络安全、用户验证流程的重要性,或是如何在异常情况下保护用户数据和系统安全。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全专家、系统管理员、技术爱好者


大热天,上海人夜饭烧啥

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzAyNTE3MA==&mid=2650525511&idx=1&sn=ea87c90b7a7417a5c86fea12c006e4e6

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的简便性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全爱好者、普通互联网用户


黄蓉和王小利说的还真不一样

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NDEzNTMyMA==&mid=2650332025&idx=1&sn=520a2de44834bb92a6e6bdb7ac35bf1e

原始摘要:

她还真没忘了自己姓啥

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章内容简短,主要围绕环境异常和验证流程展开,强调了验证的必要性和操作步骤。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、安全专家、普通网民


北京首个全现房销售项目,来了

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NzExODYzNw==&mid=2667529565&idx=1&sn=b9c5a6d302d32a8a6e22c1ac09f8bb5f

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化脚本或恶意软件的滥用,确保平台的安全性和稳定性。用户可能会遇到视频、小程序等内容无法正常访问的情况,需要通过点赞或取消点赞等互动操作来完成验证。

内容分类: AI工具使用教程与技巧

适合人群: 互联网用户、网站管理员、网络安全爱好者


通过微信读书实践“指读法”,提升阅读速度

原文链接: https://mp.weixin.qq.com/s?__biz=MzU2NDI1Mzg2NQ==&mid=2247499784&idx=1&sn=69df9228314636b9fbacc96d1351c2da

原始摘要:

微信读书 App 近期更新了“自动翻页”功能,引入了“划线导读”功能,就是在自动阅读的过程中用划线样式显示当前正在阅读的句子。

包括《如何阅读一本书》在内的诸多权威经典都曾指出过,阅读过程中的眼神飘忽是导致阅读速度慢的一个重要原因,并提出了“指读法”可以有效缓解眼神飘忽的问题并提升阅读的速度。

传统的指读法就是通过手指在书籍或屏幕上移动来实现,我在屏幕上阅读时更容易眼神飘忽,尤其是在大屏显示器上,特别是在排版的行间距较矮时最明显。

有了微信读书的这个“划线导读”功能就相当于自动实现了“指读法”,怎能不给个赞呢。

多年前我就开发了微信读书与 Anki 的一套流程,通过复习把新知变成已知,把当时理解变成将来也能理解。提升知识留存率的同时,也因长时记忆中相关知识的增多而提升了理解能力。搜过往文章或选择最近更新的视频课程便可了解具体用法。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章简要提到了验证的必要性,并提供了完成验证的指引。此外,还涉及了视频小程序中的点赞和在看功能,提示用户可以通过轻点两下来取消这些操作。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网站管理员、网络安全专家


用AI分析你的游戏偏好

原文链接: https://mp.weixin.qq.com/s?__biz=Mjg2NTE4MzUwMA==&mid=2651234591&idx=1&sn=bfc960844d2f0ebfdfce7475758be938

原始摘要:

我们都曾在凌晨两点还坐在艾泽拉斯的月光下,刷着一遍又一遍《魔兽世界》的副本;或者在《巫师3》的大地上,为寻找一

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或机器人的滥用,确保服务的正常运作和用户体验。文章提醒用户进行验证操作,并提供了简单的互动选项,如点赞和在看,以增强用户参与感。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全爱好者、普通互联网用户


用AI分析你的观影偏好

原文链接: https://mp.weixin.qq.com/s?__biz=Mjg2NTE4MzUwMA==&mid=2651234583&idx=1&sn=ad9c79167ef66de59e4bb3d9c2a83e66

原始摘要:

如果你和我一样,在豆瓣上给电影打分已经成了一种生活习惯,或许你早已积累了一份“五星片单”私藏宝库。

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户的互动体验,同时提供了便捷的操作方式。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、产品经理、用户体验设计师


欧·亨利十大经典小说鉴赏

原文链接: https://mp.weixin.qq.com/s?__biz=Mjg2NTE4MzUwMA==&mid=2651234571&idx=1&sn=ef1f8f32dd6657f1d364f0905cee8054

原始摘要:

美国短篇小说之王欧·亨利,用幽默、机智与温情,构筑出一个个小人物的真实世界。他的作品往往篇幅不长,却总能在结尾一击致命,令人莞尔又沉思。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户的安全访问或防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看的功能,这些互动元素可能用于增强用户参与度或内容筛选。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、普通互联网用户


用AI分析你的听歌偏好

原文链接: https://mp.weixin.qq.com/s?__biz=Mjg2NTE4MzUwMA==&mid=2651234548&idx=1&sn=510f8d2930f97c22ad32c06e8ee2fbaf

原始摘要:

最近在玩网易云音乐的时候,注意到一个有趣的限时小功能:“复制DeepSeek锐评指令”,可以解析你最近100首

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。验证过程可能包括点击验证按钮、观看视频或使用小程序等互动方式。此外,内容中提到的点赞和在看功能,允许用户通过轻点两下进行互动,这种设计旨在提升用户体验和互动性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、用户体验设计师


秋天的感觉

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804928&idx=1&sn=93919e6e36b25e2ad92cb87ee62299e4

原始摘要:

今天立秋。秋天并不如人们所说,在一夜之间到来。立秋时节天气依然炎热多雨,花草树木依旧繁茂,看不见一丁点秋意,感觉是夏天仍在无尽延续。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提到了通过视频、小程序等多媒体方式进行验证,以及点赞和在看等社交互动功能,这些都可能作为验证的一部分或是增强用户参与度的策略。核心观点在于通过多层次的验证和互动机制,既保障了平台的安全,又提升了用户的参与感和互动性。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网络安全专家、产品经理


创造改变的可能

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804909&idx=1&sn=7161bd33ddca6242c624fc311275a34e

原始摘要:

这两年我有种感受正变得越来越清晰,渐渐朝着一个想法蜕变。那就是在绝大多数时候,人对于世界,对于他人是无能为力的,它们总是在自己的控制之外,总是在自己的意愿之外。

AI增强摘要:

当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者


当下的反应

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804894&idx=1&sn=eb3a1c329f1274d3b114825df847f9fc

原始摘要:

很多读者可能会很失望,因为他们来到这里想要搜索我对当下热点问题的文章却没有结果。还有的读者留言说:请问你对 XX 事件的看法是什么?

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代数字平台对用户互动行为的即时反馈和调整机制,强调了用户体验的便捷性和互动性。

内容分类: AI工具使用教程与技巧

适合人群: 数字平台用户、内容创作者、用户体验设计师


租房的尊严

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804885&idx=1&sn=df969bbf01890f4b76dbc1cd5c0f3ea7

原始摘要:

我听到一个很奇怪的说法:租房没有尊严。

AI增强摘要:

当前环境出现异常,用户需要进行验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。验证过程可能包括点击验证按钮、输入验证码或完成其他形式的身份确认。此外,内容中提到了视频和小程序的互动功能,如点赞和在看,这些功能允许用户通过简单的操作表达对内容的喜好或关注,同时也提供了取消这些操作的便捷方式。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、普通互联网用户


今天不出门

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804877&idx=1&sn=a73eaf89a241b70b583e7232bddc1352

原始摘要:

上个月 23 号我出过一次门,然后就在家里待到了今天。回想刚来到北京的时候,拿了工资掰着手指头算账,其中有一笔交际费总是令我皱眉。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化脚本或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动功能如点赞和在看的使用说明。核心观点在于强调安全验证的重要性和用户互动的便捷性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、安全工程师、普通用户


2025年7月文章一览

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804867&idx=1&sn=4ec4ccd615f074b6d58fd72648ecd378

原始摘要:

从数据上来说,这是非常惨淡的一个月,我全靠蹭脱不花和李笑来的流量熬着。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代数字平台对用户互动行为的即时反馈和调整机制,强调了用户体验的流畅性和互动性。

内容分类: AI工具使用教程与技巧

适合人群: 数字产品设计师、用户体验研究人员、小程序开发者


关于美国政府和华尔街的根本利益冲突

原文链接: https://mp.weixin.qq.com/s?__biz=MzUxNjE1NjI1MA==&mid=2247492494&idx=1&sn=f9aa54c4edc7e80de3b551cc356b3689

原始摘要:

封面人物:特朗普和鲍威尔

AI增强摘要:

文章内容似乎涉及到一个环境异常的情况,提示用户需要完成验证后才能继续访问。这可能是一个技术性或安全性的提示,旨在保护用户数据或防止自动化攻击。核心观点是强调在当前网络环境下进行验证的重要性,以确保访问的安全性和连续性。关键洞见可能包括对网络安全措施的简要讨论,以及用户在面对此类提示时应采取的步骤。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、IT安全专家、普通互联网用户


Figma上市首日股价大涨250%,B站推出自研AI翻译功能|一句话看出海新鲜事

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NTQ4NjczNw==&mid=2650672782&idx=3&sn=e8bfabc766fcafb3c78bcac81b064342

原始摘要:

微软旗下 AI 编程助手 GitHub Copilot 累计用户数已达 2000 万。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章可能探讨了网络安全、用户验证技术或是应对网络异常的策略。核心观点集中在如何通过简单的验证步骤来恢复访问权限,强调了安全验证在保护用户数据和防止未授权访问中的重要性。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全爱好者、IT专业人员、普通互联网用户


中国互联网出海一周头条 我们一起看真相聊大事儿 | 白鲸出品371期

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NTQ4NjczNw==&mid=2650672765&idx=1&sn=d74b918b5e916a54707030bf201e59ce

原始摘要:

专为出海互联网人打造的资讯周报。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户的互动体验,同时提供了便捷的操作方式。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、产品经理、用户体验设计师


广州登革热病例与区域蚊媒密度密切相关,但公众缺乏实时预警数据

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3OTQ4MzU5Mg==&mid=2247487859&idx=1&sn=52c68592cfdfc74508c3091a78eed90b

原始摘要:

这些问题都迫切需要得到关注。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化脚本或机器人的滥用,确保服务的正常使用。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动(如点赞和在看)的轻点两下取消功能,这些细节强调了用户体验和互动性的重要性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、用户体验设计师


我国有 8 亿白纹伊蚊

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3OTQ4MzU5Mg==&mid=2247487836&idx=1&sn=3bf97167dbbb9d48dcb5cc24c96b910b

原始摘要:

那我国有多少种蚊子?

AI增强摘要:

当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者


山西大同大学引用 4 篇同一作者的不相关文献

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3OTQ4MzU5Mg==&mid=2247487829&idx=1&sn=128c8cb40ecd4e7a18907442e474ad85

原始摘要:

我们欢迎更多线索

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了用户互动功能,如点赞和在看,这些功能的轻点两下取消设计旨在减少误操作,提升用户交互的准确性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、用户体验设计师、网络安全专家


今天确实有三个很重要的新闻

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2MDc2NzQ3MQ==&mid=2247503119&idx=1&sn=0740599912238deff3ca7a0b31526dfd

原始摘要:

幼儿园免学费,以及央妈的最新发文

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-program interactions, as well as features for liking and viewing content with simple gestures to undo these actions. The core insight revolves around user interaction mechanisms and system prompts for verification in digital environments.

内容分类: AI工具使用教程与技巧

适合人群: digital product users, UI/UX designers, system administrators


今天的两条主线

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2MDc2NzQ3MQ==&mid=2247503093&idx=1&sn=e0e1c082ccd9626c750f4f70be09cda7

原始摘要:

解释一下,今天港股和南下资金的大幅背离

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看功能的互动提示,这些功能旨在增强用户的参与感和互动性。

内容分类: AI工具使用教程与技巧

适合人群: 网站管理员、网络安全专家、普通互联网用户


下周会不会很刺激?

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2MDc2NzQ3MQ==&mid=2247503075&idx=1&sn=061794403a0a263146013c3108293a2c

原始摘要:

聊聊5件大事

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around user interaction and system security measures in digital platforms.

内容分类: AI工具使用教程与技巧

适合人群: digital platform users, system administrators, and security enthusiasts


对国债取消免税的解读

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2MDc2NzQ3MQ==&mid=2247503030&idx=1&sn=8371873b9101210fb19f2d50df52c1c3

原始摘要:

对普通的个人投资者的建议,只有5个字

AI增强摘要:

文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。这可能是一个技术性或系统性的提示,涉及到网络安全或用户验证流程。核心观点在于强调在当前环境下完成验证的重要性,以确保访问的连续性和安全性。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网络安全专家、系统管理员


今天为何大跌?

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2MDc2NzQ3MQ==&mid=2247502990&idx=1&sn=a6ccae5b4a318ac8ca65752fb904fa29

原始摘要:

除了两个利空以外,也聊一些正能量

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,这些互动功能允许用户通过简单的操作表达对内容的喜好或关注。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网络安全爱好者、社交媒体用户


专访姚洋:建议成立中储房,先收下100万套房子

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653703088&idx=1&sn=d42fa73c6f98b60705cde23ed3de3458

原始摘要:

去年法拍房的数量是75万套,今年估计超过100万套,即使法拍房价格是市场价的一半,实际成交并不高,大量房屋砸在银行手里,拉低了整个市场的价格

AI增强摘要:

当前环境出现异常,用户需完成验证以继续访问。此提示可能涉及网络安全措施,旨在保护用户数据和防止自动化攻击。核心观点强调了验证过程的重要性,以确保环境安全性和访问的合法性。关键洞见在于理解此类安全提示的普遍性和必要性,以及它们如何帮助维护网络环境的健康。最实用的技巧是遵循提示完成验证,以确保无缝和安全地继续访问所需内容或服务。

内容分类: AI工具使用教程与技巧

适合人群: 网络用户、IT安全爱好者、网站管理员


增量与存量之间|《财经》社评

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653703088&idx=2&sn=ac0593601622b8951e7f2d7798d2c743

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代网络环境中用户交互的便捷性和即时性,同时也展示了平台对用户行为数据的实时监控和反馈机制。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、产品经理、用户体验设计师


行业观察|红缨子高粱丰收背后:茅台“质量芯片”为何难以复制

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702994&idx=2&sn=cf37e0b5543fd498337ee16c148eda02

原始摘要:

红缨子“519”第七代高粱种的生育期大幅缩短至118天,株高显著降低至210.10厘米,更矮壮、更抗倒伏完美适配机械化收割需要,亩产提升至367.55公斤,支链淀粉含量达到99%,单宁含量降至1.37%。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动功能如点赞和在看的操作方式。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网站管理员、网络安全专家


九大行业调研,万字详解中国反内卷风暴|《财经》封面

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702936&idx=1&sn=d16f429d73b87a0c948dc8e166f6ae80

原始摘要:

越是努力生产产品,售价反而越低,利润越微薄。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代网络环境中用户交互的便捷性和即时反馈的重要性。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网站开发者、用户体验设计师


商户卷入外卖大战,有没有赢家?

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702866&idx=1&sn=f9cf754efbd5b89b8755cc4ac66bbcfd

原始摘要:

平台提供补贴,本质是争夺用户和市场份额,这种行为过去有,未来还会存在。需要认识到,合理的竞争并不需要干预,而“内卷式”的恶性竞争,必须予以规制,预防“烧钱圈地割韭菜模式”反复重演

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的便捷性。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网站开发者、普通互联网用户


香港经济“无就业复苏”待解

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702841&idx=1&sn=e3a29408217b7330f761335811661b4e

原始摘要:

自2023年至今,中国香港特区GDP已连续10个季度录得增长,但不少当地居民似乎感受不到经济增长带来的好处,总就业人数仍在不断减少。有分析认为香港近年经济增长的动力,主要来自对外货物贸易和金融活动,并未直接带来新增的就业机会

AI增强摘要:

当前环境检测到异常活动,用户被要求完成验证以继续访问。这一机制旨在保护系统安全,防止自动化工具或恶意软件的滥用。验证过程简单快捷,用户只需按照提示操作即可恢复正常访问。此外,平台提供了视频和小程序等多媒体内容,用户可以通过点赞或在看等互动方式表达对内容的喜爱或关注,这些互动也可以轻松取消。

内容分类: AI工具使用教程与技巧

适合人群: 互联网用户、网站管理员、网络安全爱好者


消费金融公司密集发债,能提振消费吗

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702820&idx=1&sn=cba971ed1d42f329512db6ef565604ce

原始摘要:

截至2024年末,全国消费金融公司贷款余额达1.35万亿元,同比增长16.66%,增速较2023年的38.2%大幅下降;蚂蚁消金信贷业务余额3108.48亿元,同比增长36.92%

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网络安全爱好者、普通互联网用户


第四批690亿元支持消费品以旧换新,10月下达

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702820&idx=2&sn=4ed5628a27c957cb3f61043a94600bcb

原始摘要:

8月1日国家发展改革委召开新闻发布会,解读当前经济形势和经济工作。

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-program interactions, as well as features for liking and viewing content with simple gestures to cancel these actions. The core insight revolves around user interaction mechanisms and system prompts for verification in digital platforms.

内容分类: AI工具使用教程与技巧

适合人群: digital platform users, UI/UX designers, web developers


播客更新:“趋势动物”的自白

原文链接: https://mp.weixin.qq.com/s?__biz=MzIyMTYyMzg1OQ==&mid=2247497049&idx=1&sn=6ca79329efcad3bf843576bae2212179

原始摘要:

最近文章更新的少, 播客方便更坦诚、全面的表达自己。

感谢老钱接受邀请, 借播客自述和传播趋势交易的理念。

希望进一步关注趋势动物内容的, 可关注趋势动物pro小程序和@趋势小程序说明书

Nick 2025/8/5

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户体验和互动性。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网络安全爱好者、社交媒体用户


社保出大事~

原文链接: https://mp.weixin.qq.com/s?__biz=MzkzODYxNzU5Mw==&mid=2247512331&idx=1&sn=6cf79d61d2b7fbe5175d2db984372812

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提到了通过视频、小程序等方式进行验证,同时也涉及了点赞和在看功能的互动,暗示了内容可能涉及社交媒体或在线平台的用户互动和安全验证流程。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网络安全专家、社交媒体管理员


有钱人的厮杀

原文链接: https://mp.weixin.qq.com/s?__biz=MzkzODYxNzU5Mw==&mid=2247512326&idx=1&sn=40117c01138f65da1f4c0ff48ab89a51

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提醒用户进行验证,并提供了简单的操作指南,如轻点两下取消赞或取消在看,这些操作可能是为了优化用户体验或减少误操作。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网站管理员、用户体验设计师


哇,要收税了

原文链接: https://mp.weixin.qq.com/s?__biz=MzkzODYxNzU5Mw==&mid=2247512312&idx=1&sn=17356d7ce386a680d445943c32f755d3

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,这些互动功能允许用户通过轻点两下来取消操作,提供了用户友好的交互体验。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网络安全爱好者、小程序开发者


被迫吃屎...

原文链接: https://mp.weixin.qq.com/s?__biz=MzkzODYxNzU5Mw==&mid=2247512302&idx=1&sn=f7fba1e8c035bb5de63a6705dda5a4bc

原始摘要:

AI增强摘要:

当前环境出现异常,用户需完成验证以继续访问。此提示可能涉及网络安全措施,旨在保护用户数据和系统安全。核心观点在于强调验证过程的重要性,以确保环境的正常运作和用户的安全访问。关键洞见包括识别异常环境的能力和采取相应措施的必要性。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、IT安全专家、普通互联网用户


带他买台积电的大哥,也会带他买英伟达

原文链接: https://mp.weixin.qq.com/s?__biz=MzI5NDQ3MTc2Nw==&mid=2247486497&idx=1&sn=2e02f09b8d63888074d4f56ae622dfb9

原始摘要:

幻想明星的人生高开低走,是咱儒家社会需要的内在的秩序感,即跨越阶层一定靠的读书、勤奋,其他富贵都是必有灾殃的。

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-program interactions, along with features for liking and viewing content, which can be toggled with a double-tap. This message seems to be a part of a user interface designed to ensure security and user engagement through interactive elements.

内容分类: AI工具使用教程与技巧

适合人群: UI/UX designers, web developers, and tech-savvy users interested in user interface interactions and security features.


武大图书馆门背后:离婚/结婚比创新高了

原文链接: https://mp.weixin.qq.com/s?__biz=MzI5NDQ3MTc2Nw==&mid=2247486490&idx=1&sn=999a80ef86ff814b46f8bb90ea47f052

原始摘要:

武大这个事儿,拱火拱的,顾头不顾腚。先讲一个冷知识:在无人注意的场合,2024年的离婚/结婚对数之比,新高了。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网站管理员、网络安全专家


7日投资提示:欧22转债提议下修

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922048&idx=2&sn=1a910b9ed607e53a0d4e5ce77716efde

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或恶意软件的滥用,确保平台的安全性和稳定性。用户可能会遇到需要点击验证按钮或完成其他形式的验证步骤,以证明其为真实用户而非机器人。此过程虽然可能带来短暂的不便,但对于维护网络环境的健康和安全至关重要。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、安全专家、普通互联网用户


网上很知名的投资高手为何不去做基金经理?

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922025&idx=1&sn=41fcb8b4a920dc417b612c571aed018d

原始摘要:

当然也是有一点的,但不多。为啥?

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具滥用。文章简要提到了视频和小程序的功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网络安全专家、普通互联网用户


6日投资提示:福斯特股东拟减持不超1.25%股份

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922025&idx=2&sn=12001eeb1d70dd980cfa2c553573a8e5

原始摘要:

福斯特:股东拟减持不超1.25%公司股份红墙股份:股东拟减持不超1%公司股份福新转债:不强赎微导转债:【申购】

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around the necessity of user verification in maintaining secure and uninterrupted access to digital platforms, highlighting the balance between user convenience and security measures.

内容分类: AI工具使用教程与技巧

适合人群: digital platform users, security enthusiasts, and developers interested in user verification processes


一次人生跨越的体会

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922009&idx=1&sn=b4eaf9d738a16183e3434473405258ea

原始摘要:

从前年8月收到老宅拆迁的正式通知,11月收到拆迁款,直到上周收到最后的尾款,整整历时两年。

AI增强摘要:

当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者


4日投资提示:中旗新材,晨丰科技股东拟减持不超3%股份

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922009&idx=2&sn=6d46111e1c26b89f7c5566484fb81782

原始摘要:

志高机械,一签门槛终于能降低点了上周长江电力计划花266亿修航运工程,貌似不会带来什么盈利周末,中国神华停牌了

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化脚本或恶意软件的滥用,确保平台的安全性和稳定性。文章强调了验证的重要性,并提供了简单的操作指南,如轻点两下取消赞或在看,以优化用户体验。

内容分类: AI工具使用教程与技巧

适合人群: 技术爱好者、网站管理员、网络安全专家


预测下牛市可能的顶部区域?

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664921979&idx=1&sn=776af2ebe641c68d77e6c0c70b5609dc

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能探讨了网络安全、用户验证技术或是平台管理策略,旨在提供一个安全、公平的网络环境。

内容分类: AI工具使用教程与技巧

适合人群: 网络安全专家、平台管理员、技术爱好者


8月1日投资提示:ST应急复牌

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664921979&idx=2&sn=8348e39ab26560edf858d064439287a8

原始摘要:

今天看山鹰的公告,他们把股票名称从山鹰纸业改名山鹰国际。其实纸业挺好的,一看起码知道是什么公司,改成国际不知为什么。

AI增强摘要:

当前环境出现异常,用户需完成验证以继续访问。此提示可能涉及网络安全措施,旨在保护用户数据和防止自动化攻击。完成验证后,用户可恢复正常访问权限。此过程强调了网络安全的重要性以及在异常情况下采取的必要步骤。

内容分类: AI工具使用教程与技巧

适合人群: 网络管理员、网络安全爱好者、普通互联网用户


AI工具的第一人称深度使用经验

匠心千游 | 纯 AI 打造休闲小游戏

原文链接: https://juejin.cn/post/7534578384338042914

原始摘要:

前言

《匠心千游》 是一款 休闲益智小游戏集。目前已上架微信小游戏,未来发展较好的话,会考虑基于 Flutter 完成全平台应用。经历了三周的业余时间打磨,目前已经完成 23 个经典小游戏的集成。而程序包的总大小仅为 884KB,这足以见得,目前项目中没有引入任何游戏引擎,是纯 Canvas 绘制的小游戏。

而完成这些小游戏的过程中,我 没写任何代码,都是通过自然语言的描述,让 AI 编写的。

--

AI 让我这个 Flutter 开发者,在完全不懂微信小游戏开发的情况下。创作了一个产品,并上架成功、接入广告,每天还有点小收益。确实不得不感慨 AI 时代对传统编程的冲击。它可以大大提升你的能力上限,让之前很多有心无力的想法,得以通过任何形式落地。

在不远的将来,并不缺乏实现想法的手段。缺乏的是想法本身。

感兴趣的朋友,可以在微信或QQ 的小游戏中搜索 匠心千游 体验~


1. 匠心千游的初衷

记得小时候,手机还是数字按键的时代。五子棋、象棋、数独、打靶、贪吃蛇等小游戏,曾丰富了我的童年时光,玩累了歇一歇也没什么负担。而现在的小朋友都开始玩,那些打打杀杀的刺激游戏,抽皮肤、氪金、买礼包,每日任务眼花缭乱,摸到手机后就停不下来。

另外,现在想在手机上找到纯净版的休闲益智小游戏,可以说非常困难,更不用说高质量的合集了。广告充斥着游戏的各个环节,对游戏的侵扰、公平性带来了非常大的影响。游戏本来是用来放松的,现在反而成了负担。

  • 广告泛滥:下个五子棋,每走几步就弹30秒广告
  • 强制观看:想继续游戏?先看广告再说
  • 过度包装:简单的井字棋被包装成复杂的商业产品
  • 难以寻找:真正纯净的经典游戏很难找到

其实接广告也无可厚非,毕竟开发维护,也需要开发者的时间、精力、金钱来维护。只是平衡点非常重要,匠心千游中也有广告,但是:

[1]. 广告 默认关闭,对匠心千游支持的朋友可以手动开启。
[2]. 匠心千游中的游戏,都会为广告留下空白区域。保证广告不影响游戏体验。

--

因为这些游戏是 AI 编写的,所以维护它,我来说也不会花费很多精力。所以对于广告收益来说,只是锦上添花。匠心千游的初心是:

让游戏回归游戏,让经典的智慧与策略得以传承。

回归游戏本质

游戏就是游戏,不需要那么多花里胡哨的东西。五子棋就是五子棋,象棋就是象棋,让用户专心享受游戏的乐趣,而不是被各种干扰打断。

收集真正的经典

什么是经典游戏?就是那些几十年甚至上百年来一直有人玩的游戏。五子棋、象棋、数独、扫雷...这些游戏之所以能传承至今,就是因为它们的玩法经过了时间的检验。


2. 从想法到落地的历程

之前在玩 Flutter Flame 游戏开发时,就有意项去做一个游戏盒子,收录经典的休闲益智游戏。但是后面工作比较忙,还有一些别的计划,就搁置了。

可能有人会疑问,既然会 Flutter Flame ,为什么你不用 Flutter 做全平台应用?

怎么说呢,现在客户端应用即使开发出来了,对于个人开发者来说,上架也非常麻烦。即使上架,分享和宣发也是个大问题。倒不如基于腾讯微信的生态,先用微信小游戏试试水。而且休闲小游戏,并不太吃性能,微信小游戏也够丝滑了。如果未来 匠心千游 发展良好的话,再考虑基于 Flutter 做客户端也不迟。

当接触到 AI 编程后,我感觉我的想法可以落地了。开始让 AI 从一个空白文件夹,尝试编写第一批游戏。当时的心里预期是完成基本的玩法,界面上不追求太好看,下面是最初版本的样子:

初版·游戏中心初版·五子棋初版·中国象棋

五个小游戏大概花了三天晚上就搓出来了。也就在这个版本,我提交了第一次审核。代码会审核很快就过了。但离上架还很远呢~

初版·游戏中心初版·五子棋初版·中国象棋

微信小游戏必须进行备案, 接下来就是非常漫长的备案和审核阶段。提交信息、初审、提交管局审核,一共前后花了近一个月。整体来说还是很顺利的,只是需要耐心等待。填写备案资料时真的非常随意,就这几个界面随便写写都没问题 😂

备案审核整个过程,不会有电话回访。
微信认证时,会有微信委托的三方机构,核对一些信息。

通过初审通过备案

3.审核中的逐步发展

在审核过程中,我也没闲着。希望面相用户的第一版就相对完整,于是继续增加经典的棋类游戏,比如国际象棋、跳棋、斗兽棋等。并且统一了游戏控制面板的表现,看起来像那么回事了。

国际象棋跳棋斗兽棋

接下来继续完成了 2048、拼图、蜘蛛纸牌,三个相对复杂的游戏。此时已经集成了十几个游戏,游戏列表也成了宫格表现。它就像一个 种子 一样, 发芽生长,然后长出一节节的枝干,逐渐繁茂。模块化的开发使得 AI 可以独立开发单个游戏,最后在进行集成,从而避免上下文过多而引发的混乱。

2048拼图蜘蛛纸牌

AI 令我惊艳的瞬间有很多,比如让它实现五子棋的人机对战。然后就得到了我下不赢的五子棋了。另外,最近实现的 消灭星星七彩连珠炮击砖块 三款小游戏,是相对来说比较复杂的。AI 也可以轻松把握,如果让我自己纯手写,两个星期估计都搞不定,而通过 AI 半天就完成了。

消灭星星七彩连珠炮击砖块

当有了想法,AI 编程从无到有,可以迅速落地。很多人问问你用什么 AI 来做的。其实我并不想打谁的广告。目前市面上的 AI 编程编程工具有很多,关键是谁用,而不是用谁。Trae、Cursor、Kiro 等都是优秀的编程工具。

但永远不要忘记,人是永远在 AI 编程中起到主导作用的,只是角色由编码者,变成了设计者。小马过河的故事告诉我们,水是深是浅,自己试试就行了。找到合适自己的工具,去拓展自己的能力。


4.对于匠心千游的规划

在朋友圈和群聊中分享后,感谢大家的支持,目前注册用户的数量已经快 700 人了:

也顺利地接入了流量主,目前每天够喝瓶可乐了,美滋滋~

对应匠心千游,我是有自己的规划的,目前先聚焦前两个阶段。其中第一阶段的上架和集成广告已经完成了。接下来是聚焦完成 30 个小游戏。目前已经有 24 个了,还要几个已经在准备中了,第一阶段应该可以顺利完成。

第一阶段完成后,我将聚焦后端相关的事宜,让单机游戏有成为联机的可能性。同样整个过程都会通过 AI 来编写代码。后端打算采用 Rust 进行开发,因为目前我已经有了一套相对稳定的 rust 服务端项目。第二阶段的终点是完成微信认证,实现游戏排行榜功能。


5.小结

从一个简单的想法,到一个有 700+ 注册用户、接入广告的小程序,《匠心千游》的整个开发过程对我来说是一段非常有价值的体验。

  • 它证明了AI 不只是辅助工具,更是创作加速器。在这个过程中,我几乎没有写一行业务代码,全靠自然语言指令完成了 23 款游戏的开发和集成。
  • 它也让我深刻体会到,想法的价值远大于技术的复杂性。一旦想清楚了产品的定位,AI 能帮助你快速验证并实现它。
  • 最后,它也让我重新思考游戏的本质 —— 不一定需要炫酷的动画、高成本的开发、复杂的玩法,简洁而有趣,足以打动人心

AI 的到来不是让编程者失业,而是成为更好的产品设计师、创意实现者。

《匠心千游》的旅程还远未结束,接下来会继续打磨更多小游戏,尝试接入排行榜、好友对战等功能。未来,也不排除基于 Flutter 推出桌面、移动全平台版本。

如果你也想做点什么,不妨从一个小想法开始试试; 如果你曾经也热爱过这些经典小游戏,欢迎你体验并分享《匠心千游》。感谢看到这里的你。愿你也在 AI 的浪潮中,找到属于自己的风帆~


如果你有其他的想法和建议,都欢迎在评论区留言。更多文章和视频知识资讯,大家可以关注我的公众号、掘金和 B 站 。对 AI 编程感兴趣的,或者喜欢匠心千游的朋友,欢迎加入 匠心千游 QQ 交流群: 1046304516

AI增强摘要:

《匠心千游》是一款由纯AI打造的休闲益智小游戏集,目前已成功上架微信小游戏平台。开发者通过自然语言描述,让AI编写代码,实现了23款经典小游戏的集成,程序包总大小仅为884KB。这一过程展示了AI技术在编程领域的强大能力,使得即使不具备特定平台开发知识的开发者也能实现产品从想法到落地的全过程。文章深入探讨了AI如何成为创意实现的加速器,以及如何通过AI技术简化开发流程,同时保持游戏的本质和乐趣。此外,文章还分享了开发过程中的挑战、解决方案以及未来的发展规划,强调了在AI时代,创意的价值远超过技术的复杂性。

内容分类: AI工具的第一人称深度使用经验

适合人群: 技术爱好者、AI开发者、游戏开发者、创业者


满帮微前端

原文链接: https://juejin.cn/post/7534370442350886963

原始摘要:

前言

  大家好,我是王坤明,作为满帮集团微前端的发起和推动落地人来分享一下整个过程, 为什么想分享一下这个过程,因为集团内开发Web项目的同学应该都在微前端基座上开发过自己的项目,享受着微前端项目开发带来的便利和约束。最近1年半新项目几乎都是微前端方案,微前端方案已经成为集团开发Web项目事实上的标准方案。一个方案从提出方案,落地实践,推广扩大,变成标准。整个过程和大家想想的不一样,没有所谓的有个架构师从一开始就整体的指明方向,更多的是我们本着贴合公司实际情况,解决实际问题,解决全局问题,还有公司的快速发展给整个方案带来的天时地利的环境,让这个方案更快的推动下去。希望通过这次的分享,让大家更贴合实际的感受在前方没有参考目标或者参考目标不适合我们时,如何找到最适合我们自己的路。

满帮微前端

  微前端提出它其实是一个类似后端微服务架构的概念,将 微服务 的概念扩展到了前端世界,简单理解就是将一个大型前端应用拆分为多个小型前端应用,这样每个小型前端应用都有自己的仓库,可以独立开发,部署,降低整个项目的复杂度。

  在实际的发展过程中,因这几年前端技术快速发展,很多公司的项目都是既有jquery,又有vue或者react,如何让这些不同技术栈的项目能很好地融合在一起这成为很多公司更实际的需求,所以前端行业推出的比较知名微前端解决方案 无论是Single-span ,qiankun,wujie 他们的重点都是如何让不同技术栈的项目融合在一起看着像一个项目,这些方案更多的精力就是在解决不同类型的项目融合在一起后如何进行项目之间的隔离,防止不同的技术栈融合在一起后带来的相互影响的问题,如下图。 image.png

  满帮的集团的Web项目因为在最初项目大量爆发之前就提供了统一的项目摸版和脚手架,虽然创建了很多项目,但是每个项目基本上技术栈,项目结构,都是差不多的,所以满帮的Web项目历史负债相对较少,业界的微前端方案解决多个不同技术栈融合到一起的述求在公司没有太多团队有,所以虽然初期在微前端方案被业界提出的时候,公司内部个别团队在案这个方向探索,但是业界这套微前端方案最终没能在公司更广的铺开,核心还是没有足够的场景。

  我们结合满帮集团项目的特点以及我们实际面对的要解决的问题,最终满帮微前端方案落地后的整体架构如下。 image.png

  可以看到我们相比行业内的微前端架构在公共能力层做的更加的深入,这得益于满帮的Web项目较轻的历史负债,90%的项目的公共能力都是相同的,我们把这些相同的公共能力进行了剥离,独立成了一个基座项目,业务项目只保留业务逻辑代码,运行在统一的基座上,这就是满帮微前端整体的架构。通过这套方案让满帮Web项目在面对研发效率性能体验稳定性持续性 几个方面做提升的时候能更好的面对。

研发效率方面

  典型场景就是满帮Web项目有上千个,日常在迭代的也有好几百个,在没有微前端方案之前,如果要推动基础能力的改造,比如某个安全库的升级,或者某个埋点库的优化,需要上下协同所有业务部门,涉及到非常多的项目进行改造,升级,发布。一是时间周期长,二是容易有遗漏。而现在在满帮微前端架构基础上,由于基础能力都在一个独立的基座项目进行维护,那么这些基础的能力迭代对业务是基本无感的,业务专注做业务相关的需求,基础能力由Web基础团队独立负责。大大提高了基础能力的覆盖效率。

性能体验方面

  一个Web项目打开最多的耗时就是基础能力的加载和执行占掉70%,在满帮现有的微前端架构上,由于所有业务项目依赖的基础能力相同,并且是一个独立的项目,我们可以通过提前运行这个项目,来减少用户在打开业务项目那一刻运行基础能力的时间。大大减少Web项目的开屏时间,满帮在App内的FCP值能做到300ms左右。

稳定性方面

  基座配合配合客户端做了很多稳定性的提升,比如离线基座,加载重试等,这些能力我们通过基座对100%加载业务项目上也做了很多稳定性加强,比如业务资源多CDN容灾,离线缓存,加载或执行失败后的错误兜底,自动修护,灰度发布等。让Web项目白屏率能像0.001%靠齐,并且Web项目的故障率也能保持很低的水平。

持续性方面

  伴随着2021年公司快速发展,人员快速壮大,新的人有新的想法,带来了很多推翻重做的项目,在这个背景下,2022年开始Web基础组在考虑所做的事的时候会优先考虑持续性,做有生命的产品 而不是项目。微前端的架构下,因为所有项目有统一的基座,我们通过基座的集中管控上层所有项目,基座定好上层业务必须要满足的规则,包括但不限于依赖组件,项目结构,优化方案等。确保就算没有现在的Web基础组,公司的Web项目也能按这个规则持续下去,做到真正的完成落地。

满帮微前端发展过程

  回顾过去几年年我们是怎么一步一步变成这样的架构,现在回想起来主要是通过解决两个核心的问题,一步步提出

微前端架构雏形提出

  满帮微前端架构雏形提出和业界微前端解决的问题不一样,并不是解决项目太大要进行拆分,也不是解决多个技术栈要融合到一起,而是为了解决移动端体验问题。时间回到2020年8月份,在这个时间之前对于Web基础团队做了很多Web项目的优化手段,从最开始的雅虎35条前端优化军规到H5打包预渲染,再到App离线Web项目,除了通过SSR直出外(直出在满帮当时不是研发效率最高的方式,所以没考虑这个方向),其他的优化方案都上了,但是最终FCP的值还是只能做到1.5到2s左右。当时每天都定这个这个统计数据看。

-w866

上图是我们的web项目在android平台的一个FCP的时间平均值分布图,核心四部分

  1. html加载600ms(蓝线),
  2. js资源加载400ms(橙线),
  3. 公共逻辑和页面执行800ms(绿线),
  4. 页面资源加载执行预估200ms。

我们如果想进一步优化,我们想着要做到极致,那就只能把除了业务逻辑之外的内容全部提前运行,结合以前积累的一些优化方式,以及满帮已有Web项目的特点(基础能力基本无差别),我们不仅仅需要提前启动一个webview容器,还得把一个项目基础的能力都提前运行起来。这样通过空间换时间的方式,在业务页面打开的时候,使用已经执行基座的webview容器来加载业务代码运行渲染页面,这样大大加快页面打开速度。

按这个想法我们需要进行web端项目和native项目进行改造

web端改造

image.png

上面是改造之前3个前端项目打包后的产物,包含html入口文件,公共的资源库,以及每个页面的js逻辑代码。如果一个公司里面按照公司的标准规范统一创建的项目,那么大多项目引入的公共资源库在每个项目里面都是一样的。 既然每个项目依赖的公共资源都一样,那我们是否可以想个办法把公共的东西当作一个项目,这个项目根据url的信息,动态加载对应url页面的js来运行,最终渲染页面,按这个想法我们调整了一下架构如下图。

image.png

可以看到我们把公共的依赖资源抽离成一个单独的项目,暂且叫做 微前端框架 。通过 static.ymm56.com/microweb 可以进行访问 。社区项目的某个页面可以通过如下链接进行访问 static.ymm56.com/microweb/#/…

可以看到我们把具体项目的路由信息放到hash后面(你完全可以定义自己的规则不使用hash)。 微前端框架通过获取hash值,分析出是social项目的D页面。然后通过动态加载D页面的逻辑js。执行并创建页面,最终渲染。

经过上面的调整,我们统一了所有前端项目的公共库,集中到了一个项目里面进行维护。这一步统一后我们就好去提前加载微前端框架项目并执行这些公共逻辑了。要知道基础框架初始化这个过程占了项目的90%时间,这个时间节省下来了,那200ms打开就不是问题了。

接下来需要app启动后预先加载一个webview。这个webview会直接加载微前端框架项目,当app被告知要打开一个h5页面。判断端该h5页面是否支持微前端,支持的话,就给预加载的这个微前端框架发一个消息告诉他加载这个页面,并让这个预加载的webview显示。

整个流程用户感知到的时间只有加载页面的js,直接执行。体验上是非常快的。

有想法了。接下来就是找客户端兄弟配合做细节完善了。走找客户端兄弟去。

客户端改造

-w1691

客户端要做的事不复杂,直接上图,主要关注的问题如下

  1. 如何区分一个链接是微前端的,还是非微前端的(可以自行通过url域名等信息定好规则) 非微前端的项目还是走老的流程直接打开页面,微前端的项目则是给预加载好的webview发消息,并显示出来。
  2. 如何判断一个微前端框架已经加载好了,因为微前端项目最终需要接受容器的消息去加载一个页面的js,如果发消息之前微前端的容器还没加载好,那么收到这个消息也是没用的,所以一定需要微前端基础框架加载好后通知客户端,容器已经准备好了。
  3. 如果加载一个微前端页面的时候,容器还没初始化好。那就直接打开该页面。不用走微前端的形式打开
  4. 可以自行做队列控制最大初始化微前端容器的数量,来提供微前端的命中率。

具体我们内部的流程如下。

App启动就初始化一个微前端容器,容器的html加载完,并且js逻辑执行完后会告诉客户端该微前端容器可用了。这个时候如果App接收到打开一个微前端页面,那么客户端会进过一系列逻辑判断后,给微前端容器发送打开的url信息,并把该微前端容器显示出来。

该微前端框架项目收到客户端的url后,解析url里面的hash,判断是打开什么项目的什么页面,然后在配置里面去加载该页面的js,加载完后执行,并渲染页面,当一个微前端容器使用后又接着初始化一个微前端容器,方便下次使用。

最终收益

akOzsd6cJH50zzgX.gif

热门活动页面打开的效果图 (测试机型 小米6 普通机器)

  1. 一个是微前端方式打开(除了页面过渡,以及数据loading之外,页面基本150ms就打开)
  2. 一个是不使用微前端方式(明显能加载过程中的白屏,以及进度条,在页面缓存过后打开时间也差不多在1.2s左右)

在2021年3月我们通过已有的效果推动了公司的7-8个核心项目按这套方案进行了适配,整体的效果在Web前端团队内部还是比较认可的,除了对项目的改造有一些成本外,其他的评价都是比较正向的,这就是满帮微前端架构的雏形形成,叫做满帮微前端方案名字是并不是很贴切,但是又没有更合适的名字了,也就没过于纠结,就叫满帮微前端了。

艰难成为标准

  在2021年3月后一方面继续完善微前端方案,一方面推动更多项目接入,虽然陆陆续续有新的项目接入微前端方案,但是微前端的项目占比一直维持在5%左右,只有1/4的团队了解和使用了微前端方案,无法成为事实上的标准。回头看主要原因是迁移存在成本业务团队效率优先无法强力约束

迁移成本

  微前端和普通项目存在差异,老项目的迁移成本取决于和微前端基座差别的大小,伴随着满帮融合,以及大多项目在业务团队后,每个项目发展节奏不一致带来和很多差异,这些差异和基础的项目随着这几年积累越来越大,这导致了能平滑迁移的项目很少,大多项目迁移差不多就是新开发。所以这套方案也是更适合新项目的优先选择,老项目基本上就没怎么迁移了

业务团队效率优先

  对于2021年虽然体验在一些团队会优先考虑,但是大多团队第一优先级还是确保业务的完成,对Web项目体验会相对原生有差异也是共识的,都是一些非核心场景使用H5选型,所以对于H5的体验不是第一优先级考虑的。这也导致在和业务方商量迁移老项目的时候业务方大多都会因为迁移后涉及到的功能回归对研发,测试都是有很大的投入,而这些投入目前无法满足业务需求从而无限的推迟。

无法强力约束

  在2021年整个前端行业还处于发展阶段,很多新技术出现,很多新组件出现,尽管每个团队的成员不同,但是他们都想着是在项目中尝试新的技术来解决自己团队的问题,而作为Web基础也没能找到一种能实际约束和规范各个业务项目的发展方向,虽然尝试过定规范,提供脚手架,统一摸版等等手段,但项目一旦到了业务团队,在不断地处理各种业务的实际问题过程中,项目就和原来的摸版慢慢有了差异。  还有一个和公司发展阶段相关事件导致了这件事纯技术侧很难统一,那就是在2021年中,公司人员规模快速扩张加入很多人员,每个人员都希望做出不一样的东西,很多需求明确就要求不要和别的系统一样,各自为阵,不会第一优先考虑是否能复用,这也导致了出了很多新东西。

  正是因为这些原因,虽然能微前端方案能带来Web页面的秒开体验,但是那个时间阶段秒开这件事并不是每个团队都优先考虑的,接入的动力一直不足,这个不温不火的状态一致维持了一年多。

  转折点在2023年1月,几年快速的割裂的发展,大前端产生了很多相似的东西,比如App页面技术选型有原生ReactNativeFlutterThresh,Web。很多一线研发非常痛苦,团队效率低,恰逢在这个时间点满帮大前端为了解决前端研发技术栈碎片化问题确定了未来大前端整体的架构方向如下图。这次确定了未来前端的项目一次编写,多平台输出,确定了App端内页面高性能的Thresh,以及非核心场景的H5技术栈,并且最为重要的就是这里的H5默认就是微前端。

  在这大方针确定下,加之配合强力的项目准入申请制度,确保新的项目全部的按统一标准来,同时微前项目因为又在统一的基座上运行,进一步的加强了项目到业务团队后还能按照统一的标准发展,降低未来割裂的速度,回头看这件事的最终落地除了我们有不断的技术追求外,还需要贴合公司的发展阶段,快速发展阶段鼓励创新推动统一那就逆流而上,稳定阶段重视效率推动统一那感觉就是顺水推舟。

解决中后台研发效率问题

  经过2022年一年的时间,对于移动端的项目基本上已经确定未来最佳实践的方式,这个时候回看PC端的项目,还有很多需要优化的空间。 2023年2月我们在做年度规划的时候定的大方向就是要解决中后台研发效率的问题。那时候中后台面临两个主要的效率问题,规范无法统一基础能力覆盖慢

规范无法统一

  团队内部每次讨论结论都是要提效,首先的统一规范,虽然这几年一直在尝试统一规范,但在实际过程中发现很难推动,很多时候不仅仅是技术上的问题, 更多的是因为公司在高速发展过程中,处于其中的人或者系统各自有不同的惯性,时间会慢慢放大这些系统和人的差异,如果没有很好地机制来调节各个系统的惯性,那么在时间的积累过程中所有系统就会越来越难统一,比如我们经常提到的设计规范编码规范组件规范

  1. 设计规范上每一位设计师都会有自己的标准,都会有自己的坚持,在满帮发展的几年中因为设计负责人的变动和业务团队设计师有自己的想法导致中后台的设计规范一致在变化,这种变化直接导致的就是中后台的体验样式等会按设计负责人的加带来明显的前后不一致,而这个不一致的差异会随着时间积累越来越大。 image.png
  2. 编码规范上一方面是前端行业还处于快速发展中,很多规范都不算是行业标准,很多是某个大公司的标准,更多的情况是每个公司每个阶段都有自己的标准,伴随着2015年到2022年前端行业也是快速发展的时间段,每年都有新的解决方案,这导致所在这个行业的前端研发在团队有新项目的时候控制不住的就想用行业新方案,站在个人或者小团队来说这没问题,能用新的技术快速解决问题,但是对于公司整体效率长远来看是留下了很多问题的。正是因为这几年每个团队都是这样才会导致公司几百个中后台项目很难在项目结构上,编码规范上进行统一。
  3. 组件规范上因为下层的编码规范,项目规范不一致,在不同项目中开发的组件依赖的环境不同,导致我们有很多组件,但是这些组件并不能在公司各个项目中平滑互通使用。

规范统一简单,我们只需要敲定一个规范后面按这个规范来就行,但是如何保障这个规范在未来可持续的统一需要我们更多的思考,我们需要一种能长期管控的方式,而不是简单的规范。

基础能力覆盖慢

  2022年集团发展过程中做了很多埋点对齐,合规,风控,权限多方面的基础能力治理,这些治理过程中涉及到了公司全部的中后台系统,拿埋点库的升级来说,集团500多个项目依赖埋点库,日常使用的150个,每次埋点库的升级,功能的修改都需要联系同步所有后台的负责人,需要他们配合,可能需要调整,可能需要回归,一方面基础库负责人很难快速覆盖基础能力到各个系统,一方面业务放会觉得基础一直在调整,一直在升级,整体来说基础能力在那段时间的迭代推动过程效率很低。

  我们思考很久得出这两个问题,核心是缺少长期可持续的集中控制机制。正是因为缺少这个机制,才会导致中后台在长时间的发展中每个中后台的步调不一致,慢慢的就会变得不统一,最终影响各方面的研发效率。我们希望有一个方式能否提供中后台长期可持续的集中控制机制,这个时候在移动端推动两年的满帮微前端方案已然成为我们的最佳选择。

  满帮微前端最核心的部分就是有一个各个业务项目依赖的基座,业务专注业务逻辑开发,基座管理项目运行需要的基础能力的迭代更新,比如埋点,水印,安全相关,统计,组件,主题等。业务只使用基座提供的能力进行业务开发。 image.png

最终收益

在统一架构的基础上,我们能提效的方式就有更多了,比如提供一站式的中后台管理平台,从创建,准入,菜单权限,打包,发布等,以前需要多个平台完成,现在只需要一个地方就快速添加。又比如我们把中后台页面按难易程度进行分级,不同级别的页面有最高效率的开发方式,适合前端,以及后端,让更多的角色加入进来,让整个研发链路能提效。

中后台创建演示L2简单逻辑开发L3轻交互页面搭建
专业前端开发非前端开发人员,选摸版,简单修改代码,快速上线非开发人员,选摸版,简单配置,快速上线

截止2024年12月,整体的方案在线上已经运行了1年半,在中后台管理平台上又新建了200多个项目,未来还会有更多的项目, 目前运行在基座上的中后台项目拥有很多以前很难想象的能力。典型的场景有如果未来有新的设计师进来有新的设计方案,那么只需要基座进行对接就好,业务项目无需任何投入,集团中后台主题算是做到真正的持久统一。再比如基础做的基础能力的升级可以快速覆盖到这200个项目上,以及我们定了一些检查规范可以约束或者告警业务的代码,是否有风险,最佳实践是什么,可以在开发过程中就能提示出来。减少上线后变成历史无法修护的问题。

AI增强摘要:

本文由满帮集团微前端的发起和推动落地人王坤明分享,详细介绍了满帮微前端从提出方案到落地实践,再到推广成为集团开发Web项目标准方案的整个过程。文章强调了满帮微前端方案的核心在于解决移动端体验问题,通过将公共能力剥离成独立的基座项目,业务项目仅保留业务逻辑代码,运行在统一的基座上,从而在研发效率、性能体验、稳定性和持续性方面带来显著提升。此外,文章还分享了满帮微前端发展过程中的挑战和转折点,以及如何通过解决中后台研发效率问题,进一步推动方案的落地和应用。

内容分类: AI工具的第一人称深度使用经验

适合人群: 前端开发者、技术架构师、Web项目管理者


AI模型突破与技术进展 - 关于大模型、多模态模型等前沿技术突破

[华创证券]:Kimi:K2模型,跻身全球开源SOTA序列

原文链接: https://www.fxbaogao.com/detail/4983698

原始摘要:

发现报告作为专业研报平台,收录最新、最全行业报告,可免费阅读各类行业分析报告、公司研究报告、券商研报等。智能分类搜索,支持全文关键词匹配,可下载PDF、Word格式报告。

AI增强摘要:

华创证券的报告详细介绍了月之暗面(Moonshot AI)及其开发的Kimi K2模型,该模型以其卓越的性能和开源策略,在全球开源模型中脱颖而出。Kimi K2不仅在代码、数学、工具调用等核心维度上超越了国际顶尖开源模型,还在性价比上具有显著优势,被《自然》杂志誉为“又一个DeepSeek时刻”。报告还分析了Kimi从C端超级入口到B端基础设施的战略布局,以及其开源策略如何降低AI Agent开发成本,推动应用层创新爆发。此外,报告提供了对AI应用方向的国内和海外相关标的的投资建议,并指出了技术进展、模型落地和商业落地可能面临的风险。

内容分类: AI模型突破与技术进展 - 关于大模型、多模态模型等前沿技术突破

适合人群: 技术爱好者、AI研究人员、投资者、创业者和企业级服务提供商


中国人跳槽的详细经历或深度第一人称经验

五年自学前端到京东终面:我才明白自己不是范进,连范进都不如

原文链接: https://juejin.cn/post/7533801117521772582

原始摘要:

1. 京东终面后,我在群里被恭喜了

2025年4月,京东HR在BOSS上找我,岗位写的是「iOS开发」,我心想这HR真他妈不专业,但还是回了句:「您好,我是前端,可以面试吗?」

没想到就这么稀里糊涂面了五轮,终面见部门老大,聊得还行。面完群里几个「未来同事」加我微信,有人说「稳了,等offer吧」,我也觉得这次该轮到我了吧?

然后,就没有然后了。

HR说「流程中」,一等就是一个月。这一个月我啥也没干,就刷邮箱等消息,像个傻逼一样。

这时候我才懂范进——你以为自己中了,其实屁都没有。


2. 我这五年,就是一部「选择比努力重要」的失败史

① 2020年:1万块我就觉得牛逼了

毕业那年进了个区块链小公司,老板说转正给1万,我他妈高兴坏了——「我同学花两三万培训还找不到工作呢!」

现在看真是蠢。那时候滴滴应届生「白菜价」都20k了,我还在为1万沾沾自喜。

问题不是钱,是起点——你第一份工作在小公司,后面想进大厂,难如登天。

② 2021-2023年:被裁了才知道害怕

后来跳槽涨了50%,进了个中型公司,终于知道什么叫「团队协作」了。结果没两年公司不行了,领了几万块钱「毕业大礼包」。

2023年再找工作,行情已经烂了。我怕失业,涨了40%多又去了个小公司,继续写垃圾代码。

这时候我才明白:小公司呆久了,你的简历就废了。

③ 2025年:面京东,我才知道自己多菜

今年我认真准备了半年,八股文、项目难点、架构设计,甚至刷了LeetCode。面京东时,人家问「你们日活多少?QPS多少?」

我他妈哪知道?我们公司就几十个人用,需要个屁的高并发!

大厂要的是「大厂经验」,你没有,就是没有。


3. 我认命了,但你们别学我

我现在进了一家还算稳定的公司,薪资也还行,但心里明白——我这辈子可能都进不去大厂了。

不是我不努力,是一开始选错了。如果毕业就进大厂,现在跳槽随便涨50%。但在小公司呆过?难。

但有一点让我没完全废掉:我写技术博客

真的,这几年每次面试,人家都会问我博客上的东西。那些在小公司用不上的「高端技术」,我全靠自己折腾,写在博客里。

所以如果你也在小公司:

  1. 别混日子,自己搞点有难度的项目
  2. 写博客,这玩意儿真能当简历用
  3. 早点跳,在小公司呆三年以上,简历就臭了

4. 最后说句实话

我知道你们想听「坚持就能进大厂」,但现实是——有些人就是没这个命。

我现在马上30岁了,五年经验,没大厂背景,以后更难。

前面卡技术经验,卡大厂背景,后面卡年龄限制,一开始没走好路,后面真的特别艰难

现在还背上了房贷,要结婚,要有小孩,后面压力更大,现在只想稳定一点 😭😭😭

但至少我还能写代码,还能靠技术吃饭。比起范进,我至少没疯。

最后贴几张图吧,就当看电子榨菜了

  • 京东是真远,来回四个小时

88b1e1f592d2f44016a0102337766464.jpg

  • 一直等不到的消息,我都感觉我问烦了 fd35bf9289d492478da47258daec1053.jpg

  • 来自群友的关心,我当时已经是范进的心态了

b8a76638c8a0dbb5b640c742b8fcc55e.jpg

  • 别人的起点,或许就是你的终点

1be7b0dd3664752caaa9a625114deda1.jpg

e34e7e1fd5a8f67c6ee3af31bc6e52f3.jpg

  • 为什么拿京东说事

因为别的大厂也没约我面试,除了美团,小红书的外包 😭😭😭

  • 新公司 来新公司上班快一个月了,已经轻车熟路,同事关系处的不错,已经开始穿拖鞋了(你们应该知道这句话的含金量)

结束语

后面会更新一些,新的学习的技术,如果对面经感兴趣的,也可以单独写一篇半年的面试经历以及总结~

AI增强摘要:

这篇文章是一位自学前端五年的开发者分享的个人经历和深刻反思。从最初的区块链小公司起步,到经历裁员、跳槽,最终在京东终面后未能获得offer,作者深刻体会到了选择比努力更重要的现实。文章揭示了在小公司长期工作可能对职业发展的限制,以及大厂对经验和背景的严格要求。作者通过自己的经历,向读者传达了几点实用建议:在小公司工作时要主动挑战有难度的项目、坚持写技术博客以积累可展示的技能和经验、尽早规划职业跳槽以避免简历贬值。尽管作者对自己的大厂梦感到无奈,但他也承认技术博客为他带来了面试机会,并鼓励同行不要放弃自我提升。

内容分类: 中国人跳槽的详细经历或深度第一人称经验

适合人群: 自学转行的程序员、前端开发者、职业规划迷茫者


垂直领域-播客行业的生意经

外卖大战拉动肯德基母公司增长,OpenAI 时隔六年发布开源模型

原文链接: https://www.xiaoyuzhoufm.com/episode/68936f7246542d8c41d6bd6c

原始摘要:

本期早咖啡为你带来与日常生活息息相关的商业科技动态,你将会听到:

  • Temu、Shein 成交总额上半年保持增长
  • 喜茶海外门店数增长 6 倍
  • 高盛计划入股哈根达斯母公司
  • 上半年日本市场奢侈品销售大幅回落

本期还有关于百胜中国、杨国福、OpenAI、特斯拉和加拿大鹅的新动态,欢迎收听!

漫威剧集《猎鹰与冬兵》《月光骑士》已经在哔哩哔哩全网首发,《鹰眼》也即将在8月9号上线。三部剧集聚焦于终局之战后的世界,讲述了在现实中挣扎、有缺陷和创伤的角色,如何寻找自我、接纳自我的成长故事。

《猎鹰与冬兵》是一场关于自我肯定与信仰传承的心灵之旅。猎鹰与冬兵在美国队长退幕后临危受命,一边对抗邪恶势力的威胁,一边并肩作战寻找自我认同,完成心灵救赎。《月光骑士》则讲述创伤导致人格分裂的雇佣兵,在古埃及诸神的纷争中踏上一场关于自我与正义的探索之旅,在多重身份中追问「我究竟是谁」。而《鹰眼》则是一个归途中的冒险故事,是一场陪伴新弓箭手成长的旅程,也是一场卸下责任、回归普通生活的温柔告别。

在这里提前祝大家追剧愉快,也希望大家能够尊重正版,保护原创!

声动活泼年度新节目上线!

我们的新节目——「Knock Knock 世界」上线啦!这次,我们倾全团队之力为 AI 时代的青少年做了一件微小但重要的事。

每期 10 分钟,从一个青少年感兴趣的现象谈起,涉及商业科技、社会人文等话题,解读表象背后的深层逻辑,启发青少年提出自己的好奇。每周一、三、五早晨 6 点在各大音频平台准时更新。

🧧前 3 期内容可以免费试听。现在就去节目主页一探究竟吧 ↓

小宇宙听友请点这里

Apple Podcast 听友请点这里

主播

Mengyi

幕后制作

监制:Zelin、Stella

实习研究员:桃子、Rachel、Kori、大豆、溪若

运营:George

后期:沁茗

封面设计:饭团

商业内容策划:茹雪、幸倍

声动活泼商业化小队:新新、秋杰、琳琳、迪卡、刘畅(实习)

商务合作:声动早咖啡等节目商业合作持续招募中,点击链接直达 声动商务会客厅,或者发送邮件至 business@shengfm.cn 联系我们;

加入我们:声动活泼目前开放人才发展伙伴岗、市场部门岗位(节目运营、社群运营、内容营销)和 BD 经理,工作地点北京东城区。详细信息与申请方式,请点击链接

听众投稿:如果你了解身边日常现象的背后原因,欢迎投稿,你的发现可能出现在节目中。

「用声音碰撞世界」,声动活泼致力于为人们提供源源不断的思考养料。

AI增强摘要:

本期声动早咖啡节目涵盖了多个商业科技动态,包括Temu和Shein的成交总额增长、喜茶海外门店的扩张、高盛计划入股哈根达斯母公司、日本奢侈品市场的回落,以及百胜中国、杨国福、OpenAI、特斯拉和加拿大鹅的最新动态。此外,节目还介绍了漫威剧集《猎鹰与冬兵》、《月光骑士》和《鹰眼》在哔哩哔哩的首发情况,这些剧集聚焦于终局之战后的世界,探讨了角色的自我认同和成长故事。节目还推出了新节目「Knock Knock 世界」,旨在为AI时代的青少年提供商业科技和社会人文的深度解读。

内容分类: 垂直领域-播客行业的生意经

适合人群: 商业科技爱好者、漫威粉丝、青少年教育工作者


最新研究论文关于社交技巧

[香港青年协会]:国际青年价值观比较观察2025

原文链接: https://www.fxbaogao.com/detail/4984574

原始摘要:

发现报告作为专业研报平台,收录最新、最全行业报告,可免费阅读各类行业分析报告、公司研究报告、券商研报等。智能分类搜索,支持全文关键词匹配,可下载PDF、Word格式报告。

AI增强摘要:

该报告由香港青年协会青年研究中心执行,比较了香港与日本、美国、德国、法国和瑞典13至29岁青年的价值观。研究发现,香港青年与家人同住的比率最高,但结婚和生育意愿最低,对家庭和朋友关系的满意度最高。在校学业方面,香港青年对校园生活的满意度最高,最重视学历资格和证书。约半数香港青年有工作,其中近五成从事高技能职业,大部分对现职工作感到满意。然而,香港青年对社会的满意度较低,对参与社会事务的意愿也较低。报告指出,香港青年的这些特点可能对人口结构和社会政策产生深远影响,建议深入探讨背后原因并制定相应政策。

内容分类: 最新研究论文关于社交技巧

适合人群: 社会学家、政策制定者、青年工作者


最新研究论文关于运动和健康

[国联民生证券]:深海:大化工大有可为

原文链接: https://www.fxbaogao.com/detail/4983693

原始摘要:

发现报告作为专业研报平台,收录最新、最全行业报告,可免费阅读各类行业分析报告、公司研究报告、券商研报等。智能分类搜索,支持全文关键词匹配,可下载PDF、Word格式报告。

AI增强摘要:

该文章深入分析了在国家政策推动下,深海经济战略如何促进我国南海油气资源的开发,特别强调了中海油及其产业链在勘探、工程建设、装备运维及油田服务全流程中的优势。文章指出,深海油气开发对高性能、特种化工新材料的需求日益增长,尤其是在防腐涂料和密封材料方面,提出了新型石墨烯防腐蚀涂料和高压密封材料的发展方向。此外,文章还提供了关键数据和研究结论,建议关注深海油气资源勘探开采和高性能防腐涂料与密封材料方向,同时提醒了包括政策调整、油气价格波动等在内的风险因素。

内容分类: 最新研究论文关于运动和健康

适合人群: 能源行业分析师、化工材料研究人员、政策制定者、投资者


特定前提下的众生相

新智元十年,ASI降临,诚邀你加入!

原文链接: https://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2652616672&idx=4&sn=d04a32124240598fd01f3a29d09b61ae

原始摘要:

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around the necessity of user verification in response to detected environmental irregularities, highlighting the importance of security measures in digital platforms.

内容分类: 特定前提下的众生相

适合人群: digital platform users, security professionals, and system administrators


单条播放超2亿,爆火TikTok的AI监控视频是怎么做的;AI商品图受害者出现了 | AI一周热门

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NzUxMzQ5Mw==&mid=2648136060&idx=1&sn=2f8838f4066a5bf468bb5f39e5f689b6

原始摘要:

欢迎来到“AI新榜”推出的「AI一周热门」栏目

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容可能涉及视频、小程序的使用,以及点赞和在看功能的互动。核心观点在于强调在异常环境下完成验证的重要性,以及如何在数字平台上进行基本的互动操作。

内容分类: 特定前提下的众生相

适合人群: 数字平台用户、社交媒体管理者


雪王大战东方明珠,AI版“魔都怪谈”如何引发全网刷屏?

原文链接: https://mp.weixin.qq.com/s?__biz=MzA3NzUxMzQ5Mw==&mid=2648135993&idx=1&sn=de76fc908dc49cfaa8c7f9db6ff38a4d

原始摘要:

一杯蜜雪冰城引发的二创狂欢

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly that requires user verification to proceed. It includes options for verification and mentions interactions with videos and mini-programs, such as liking and viewing actions. The core insight revolves around the necessity of user verification in abnormal environmental conditions to ensure secure access or interaction with digital content.

内容分类: 特定前提下的众生相

适合人群: general internet users, digital content consumers


非凡大赏:AI营销|洞察-触达-转化-留存:AI驱动的增长新公式

原文链接: https://mp.weixin.qq.com/s?__biz=MzU5Mjg5MjQ5Ng==&mid=2247518478&idx=1&sn=4a0530b85ef83e5d9f95d3c23ca0bc08

原始摘要:

AI不应只被用来优化流程中某个环节,而应直接作用于结果本身

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-program interactions, along with features for liking and viewing content. The core insight revolves around the necessity of user verification in abnormal environmental conditions to ensure secure and uninterrupted access to services.

内容分类: 特定前提下的众生相

适合人群: general internet users encountering access verification prompts


非凡大赏:AI Coding|开发者新纪元:工具、技能与人机协作之道

原文链接: https://mp.weixin.qq.com/s?__biz=MzU5Mjg5MjQ5Ng==&mid=2247518468&idx=1&sn=f128ffb59262c7ecd5368fd89b909a61

原始摘要:

下一代IDE,是“Agent Native”而非“功能堆叠”

AI增强摘要:

该文章内容似乎涉及到一个环境异常的通知,提示用户需要进行验证以继续访问。内容中提到了视频、小程序以及点赞和在看的功能,暗示这可能是一个社交媒体或内容分享平台上的通知。核心观点是用户在遇到访问限制时,需要通过完成验证来恢复正常的访问权限。这可能涉及到平台的安全措施或用户身份验证流程。

内容分类: 特定前提下的众生相

适合人群: 社交媒体用户、内容分享平台用户、网络管理员


欢迎 GPT OSS —— 来自 OpenAI 的全新开放模型家族!

原文链接: https://mp.weixin.qq.com/s?__biz=Mzk0MDQyNTY4Mw==&mid=2247495056&idx=1&sn=7d8817150535304378dd35320b3777e9

原始摘要:

GPT OSS 来啦!

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around the necessity of user verification in abnormal environmental conditions to ensure secure and uninterrupted access to services.

内容分类: 特定前提下的众生相

适合人群: general internet users encountering access verification prompts


7个浙江人,撑起中国饮料半边天

原文链接: https://mp.weixin.qq.com/s?__biz=MzI2NDk5NzA0Mw==&mid=2248852604&idx=3&sn=a52b8e731d5f9c2bc41f081c2f041033

原始摘要:

浙江饮料的成功,绝非偶然。

AI增强摘要:

该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序、点赞和在看的功能,暗示这可能是一个社交媒体或内容分享平台的界面提示。核心观点是用户需要通过验证来恢复正常的访问权限,关键洞见在于平台可能采用了某种安全机制来防止滥用或自动化攻击。

内容分类: 特定前提下的众生相

适合人群: 社交媒体用户、内容分享平台的管理员、网络安全爱好者


拉开你和同龄人差距的 43个 顶级心理能力!拥有5个,人生就能 “开挂”

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902208&idx=3&sn=80837753cdc5df7601a8e1679df75888

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这可能是一个关于网络环境安全验证和社交媒体互动功能的简短说明。

内容分类: 特定前提下的众生相

适合人群: 网络用户、社交媒体管理者、网络安全爱好者


你的「潜在天赋」决定了你的人生上限

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902069&idx=2&sn=32d693904539a92b1da4c324748565bf

原始摘要:

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around the necessity of user verification in abnormal environmental conditions to ensure secure and continued access to services.

内容分类: 特定前提下的众生相

适合人群: general internet users encountering access verification prompts


邪修是怎么用AI做爆款?一条视频播放量540万,14天涨粉超17万!

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902069&idx=3&sn=9059555c50b48d814e3b98e4fc201936

原始摘要:

AI不会淘汰人,只淘汰不会用AI的人。

AI增强摘要:

The provided content does not contain substantive information or a coherent article for analysis. It appears to be a system-generated message related to environmental verification, possibly from a website or application, indicating an abnormal environment status and prompting the user to complete a verification process to continue access. The message includes options to verify, watch a video, or interact with a mini-program, along with interactive elements for liking and viewing content.

内容分类: 特定前提下的众生相

适合人群: 系统管理员、网站开发者、用户体验研究人员


“我好像没那么爱你了〞|感情走到最后都会变质吗?

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902069&idx=4&sn=8ea5ec7ebaf6e5b2bfdebe4281360932

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。

内容分类: 特定前提下的众生相

适合人群: 互联网用户和技术爱好者


这份越老越吃香的终身事业,建议每个打工人都了解下

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247902069&idx=5&sn=e0ad88fb52093750e92136dd7175fb25

原始摘要:

AI增强摘要:

该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序、点赞和在看等功能,但缺乏具体的文章内容或深度信息。因此,无法生成一个深度摘要。

内容分类: 特定前提下的众生相

适合人群: 普通互联网用户


一个被误解了很久的择偶心态,其实可以「很靠谱」

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247901921&idx=3&sn=fdc930871b544cd97b7ababdc3dbdc37

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的便捷性。

内容分类: 特定前提下的众生相

适合人群: 网站管理员、网络安全专家、普通互联网用户


“我在喜欢的人面前,难以自控地自卑。”丨女性如何找到真正的自信?

原文链接: https://mp.weixin.qq.com/s?__biz=MzA4NjcyMDU1NQ==&mid=2247901921&idx=4&sn=96b7eeab87138fed4fb40dead3466d72

原始摘要:

告别自卑,从这本心理手账开始——

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-program interactions, as well as features for liking and viewing content, with instructions to double-tap to cancel these actions. This content seems to be a part of a user interface or platform notification system, possibly related to social media or content sharing platforms, designed to ensure user authenticity and engagement.

内容分类: 特定前提下的众生相

适合人群: social media users, platform developers, UI/UX designers


友情招募:多家知名SaaS/AI公司优质岗位来袭,快来加入全球化浪潮!

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg3NTk3MzQ4MQ==&mid=2247508551&idx=2&sn=4c89bc8d0ef7624a59875309e8da46b8

原始摘要:

热门岗位招聘中RECRUITMENT WORK各位小伙伴大家好,最近我们的老朋友 Stripe 、小宿科技、

AI增强摘要:

The provided content does not contain substantive information for analysis. It appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. The message includes options to verify, watch a video, or use a mini-program, along with interactive elements for liking and viewing content. Given the lack of detailed or meaningful content, a deep summary cannot be generated.

内容分类: 特定前提下的众生相

适合人群: 系统管理员或网络用户 encountering access verification prompts


不能输和不要输

原文链接: https://mp.weixin.qq.com/s?__biz=MzI1ODAzMTgyMw==&mid=2651488715&idx=1&sn=a4baef2c6fb0d077ba504ab09013d4dd

原始摘要:

不要输钱是一种愿望,不能输钱是一种能力。

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章内容简短,主要围绕验证的必要性和操作提示展开,强调了用户互动(如点赞和在看)的即时反馈机制。

内容分类: 特定前提下的众生相

适合人群: 网络管理员、网站开发者、普通互联网用户


再见,马叔叔

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804919&idx=1&sn=dc9b3ebf395f8f3bea7a9b9dc863fd87

原始摘要:

今天早上,云南航空公司的前同事打来电话,通知我马叔叔骤然离世,距离他退休只剩下一年。

AI增强摘要:

该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序以及点赞和在看的功能,暗示这可能是一个社交媒体或内容分享平台上的通知。核心观点可能是关于用户互动和内容验证的重要性,关键洞见在于平台如何通过验证机制来确保环境的安全性和用户的真实性。

内容分类: 特定前提下的众生相

适合人群: 社交媒体用户、内容创作者、平台开发者


磁带机往事

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5MjAzODU2MA==&mid=2652804901&idx=1&sn=bc83bef7bd35ae68cfcbffc19463cd59

原始摘要:

今天的便携式音乐设备就是手机,加上耳机和一个音乐 App,就可以随时随地听音乐。有些人连耳机都省略,在电梯、高铁里直接开外放,这种人属于手机恐怖主义分子,个人建议判处有期徒刑10 年起,剥夺手机使用权终身。

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-program interactions, as well as features for liking and viewing content with simple gestures to undo these actions. This message seems to be part of a user interface or platform notification system, possibly related to content access or interaction mechanisms.

内容分类: 特定前提下的众生相

适合人群: Platform users encountering access issues or system notifications


关于恢复征收国债增值税、反内卷和供给侧改革

原文链接: https://mp.weixin.qq.com/s?__biz=MzUxNjE1NjI1MA==&mid=2247492479&idx=1&sn=4896228dca168e300cf276dd38b1b6a0

原始摘要:

封面人物:Ronald H. Coase

AI增强摘要:

文章内容似乎涉及到一个环境异常的情况,提示用户完成验证后可以继续访问。这可能是指某种在线服务或网站的安全验证过程,旨在保护用户和数据的安全。核心观点可能是强调在当前网络环境下,安全验证的重要性以及如何通过简单的步骤(如点击验证)来恢复访问权限。

内容分类: 特定前提下的众生相

适合人群: 网络用户、IT安全爱好者


【老猫观察】2025年8月展望:美股大盘、黄金原油贵金属、大宗商品期货、加密市场等回顾与分析

原文链接: https://mp.weixin.qq.com/s?__biz=Mzk0OTc1Njc1NA==&mid=2247484036&idx=1&sn=edfb4b94b6b79f5bf815b7c1e52f23bd

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。

内容分类: 特定前提下的众生相

适合人群: 网络管理员、网络安全爱好者、普通互联网用户


解读银行理财的半年报

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2MDc2NzQ3MQ==&mid=2247503049&idx=1&sn=cc26c2d529bde8938106bad44970d744

原始摘要:

补充了一些同业小伙伴的观点

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. The core insight revolves around the necessity of user verification in maintaining secure and uninterrupted access to digital platforms, highlighting the balance between user convenience and security measures.

内容分类: 特定前提下的众生相

适合人群: digital platform users, security professionals, and UI/UX designers


A股再上3600点,券商降佣仍在持续

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702994&idx=1&sn=0aea1b2a34c7d790f2d70a92d8823b5a

原始摘要:

A股持续回暖,开户数明显回升,券商经纪业务直接受益,但存量竞争下佣金率下降趋势不可阻挡

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. However, the content lacks substantive information or a clear narrative, making it challenging to extract a core viewpoint or practical insight.

内容分类: 特定前提下的众生相

适合人群: 系统管理员或网络技术爱好者


港股IPO盛宴,谁在席上?

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702994&idx=3&sn=5b2ac7941c0c023d3ed3164045ccfdbc

原始摘要:

这场IPO盛宴里,上市公司、投行、投资机构等都扮演着重要角色,推动港股形成“IPO融资-二级市场表现-再投资”的良性循环,同时促进行业生态在港股的新周期里产生新的变化

AI增强摘要:

当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。

内容分类: 特定前提下的众生相

适合人群: 互联网用户和技术支持人员


行业观察|涅槃者“商汤”:当AI明星公司再一次穿越产业周期

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702936&idx=2&sn=dfa92a13038c554a04fce8f7b76c53e2

原始摘要:

AI产业进入新一轮技术与商业洗牌期,有人陨落,也有人主动重构。曾是估值之巅的商汤科技,选择以拆分、年轻化和再创业的方式重新定义自己的价值位置

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly that requires verification for continued access. It includes options for verification and mentions interactions with videos and mini-programs, such as liking and viewing actions. However, the content lacks substantive information or a clear narrative, making it challenging to extract core viewpoints, key insights, or practical tips.

内容分类: 特定前提下的众生相

适合人群: 系统管理员或网络技术维护人员


特别策划|诺亚ARK年度峰会用「反脆弱」构建华人「聪明财富」

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702936&idx=3&sn=dcea24528f8deb2dd76fb95bc79c35a2

原始摘要:

8月1日,诺亚方舟全球华人财富管理与传承峰会在新加坡圆满举办!

AI增强摘要:

当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看

内容分类: 特定前提下的众生相

适合人群: 技术爱好者


香港稳定币条例生效,概念股为何集体下跌?

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702866&idx=2&sn=2f98a7d2cef2d2e7b6b114e46c9d0122

原始摘要:

香港金管局新闻稿称,发牌将是一个持续进行的过程,已准备充分并希望尽早获得考虑的机构应于9月30日或之前提交申请。香港金管局的态度表明其在发牌初期将安全和稳定作为更重要的考量因素

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. However, the content lacks substantive information or a clear narrative, making it challenging to extract core viewpoints, key insights, or practical tips.

内容分类: 特定前提下的众生相

适合人群: general internet users encountering system verification prompts


强降雨导致河北兴隆“北京山谷”项目3人遇难4人失联

原文链接: https://mp.weixin.qq.com/s?__biz=MjM5NDU5NTM4MQ==&mid=2653702841&idx=2&sn=70f45a4eb89e031b35d15ab6ca2b17fe

原始摘要:

8月2日,据河北省兴隆县防汛抗旱指挥部消息,7月28日,兴隆县发生强降雨,有人员在“北京山谷”失联。

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video and mini-programs, along with interactive elements for liking and viewing content. However, the content lacks substantive information or a clear narrative, making it challenging to extract core viewpoints, key insights, or practical tips.

内容分类: 特定前提下的众生相

适合人群: general internet users encountering system verification prompts


砸死人了,惨...

原文链接: https://mp.weixin.qq.com/s?__biz=MzkzODYxNzU5Mw==&mid=2247512319&idx=1&sn=55e37f6da2a54eec0fabdb01fe2155f4

原始摘要:

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly, prompting the user to complete a verification process to continue access. It includes options for video, mini-programs, and interactive elements like liking and viewing, which can be toggled with a double-tap. This message seems to be a part of a user interface or platform interaction, possibly related to social media or a web service, where user engagement and verification are required for continued access.

内容分类: 特定前提下的众生相

适合人群: web developers, UI/UX designers, social media platform users


大家今年都挣了多少了?

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922048&idx=1&sn=2300fa0c945958bfcc192f3bd60bce40

原始摘要:

想问问,大神们都挣了多少了?符工不多,挣了3000多个,收益率157%多一点。

AI增强摘要:

The provided content appears to be a system notification or error message indicating an environmental anomaly that requires user verification to proceed. It mentions options for verification, including video and mini-programs, and includes interactive elements like liking and viewing actions. The core insight is the system's attempt to secure or verify user access in an abnormal environment, highlighting the importance of security measures in digital platforms.

内容分类: 特定前提下的众生相

适合人群: 系统管理员、网络安全专家、普通用户


什么样的人能够做好投资?

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922015&idx=1&sn=947099dd12370576fd610a634f8fb346

原始摘要:

我看到的最好的回答,是王文的。他的观点是,第一有卓越的智商第二对投资的热爱第三阅历第四长期主义思维对于50岁以上的,增加三项特质要求:好奇心、谦卑感和勤奋。

AI增强摘要:

该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序、点赞和在看的功能,暗示可能与社交媒体或在线平台的互动有关。然而,由于提供的文本片段较为零散且缺乏具体信息,难以提炼出更深层次的核心观点或关键洞见。

内容分类: 特定前提下的众生相

适合人群: 社交媒体用户或在线平台使用者


5日投资提示:康泰医学股东拟合计减持不超3.59%股份

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664922015&idx=2&sn=e1bd469778ff079aa3559f0010c0aa78

原始摘要:

AI增强摘要:

当前环境出现异常,用户需要进行验证以继续访问。文章内容涉及用户互动功能,如点赞和在看,提供了简单的操作指南。核心观点在于强调用户验证的重要性以及互动功能的便捷性。

内容分类: 特定前提下的众生相

适合人群: 网站管理员和普通用户


是长江电力带崩了大盘吗?

原文链接: https://mp.weixin.qq.com/s?__biz=MzAwNzA0MTkxOQ==&mid=2664921996&idx=1&sn=6c169f5f6879412e02339c91863d0970

原始摘要:

是为ZF化债的长江电力带崩了大盘吗?政府没钱修船闸,然后就向国企化缘了,如果国企是ZF百分比持股那没说得,但还有那么多个人股东的嘛。

AI增强摘要:

The provided content appears to be a system-generated message indicating an environmental anomaly that requires user verification to proceed. It mentions options for verification, including video and mini-programs, and includes interactive elements like liking and viewing actions. However, the content lacks substantive information or a clear narrative, making it challenging to extract core viewpoints, key insights, or practical tips.

内容分类: 特定前提下的众生相

适合人群: 系统管理员或网络用户 encountering similar verification prompts


程序员的副业或创业经验分享

入了台程序员专业显示器,同事们都来围观了

原文链接: https://juejin.cn/post/7533235582261542912

原始摘要:

入了台程序员专业显示器,同事们都来围观了

前言

不知道大家有没有发现,随着年龄的增长,在电脑前熬夜变得越来越困难了。记得刚工作那会儿,连续写代码到凌晨三四点都不觉得累,现在到了晚上十点多,眼睛就开始发干发涩,脖子也僵硬得不行。特别是在调试复杂bug的时候,盯着密密麻麻的代码几个小时下来,整个人都感觉被掏空了。

现在我的工位上常备着三样东西:眼药水、颈椎按摩器和护腕垫。每天下班回家,第一件事就是闭眼休息十分钟,让眼睛缓解一下。以前还天真地想着,等哪天不做开发了,就去做个激光手术,从此告别眼镜,重新拥抱清晰的世界。

但现实很骨感,作为程序员的我们,每天至少8-10小时都要面对屏幕。既然改变不了工作性质,那就只能改善工作环境了。某个周末,我在京东上搜索程序员专用显示器时,意外发现还真有专门针对我们这个群体设计的产品,这让我眼前一亮。

外观展示

说干就干,下单后第二天这台明基RD280U就送到了公司。拆箱的那一刻,同事们都围过来看热闹,毕竟28寸的显示器在我们办公室还是挺少见的。包装很扎实,显示器本体比我想象中要厚重一些,但这种分量感反而让人觉得很有质感,不像那些轻飘飘的廉价显示器。

IMG_20250725_193251

为程序员量身定制的屏幕比

接上电源的那一刻,我就被这块28寸屏幕的显示效果震撼到了。以前用的24寸1080P显示器瞬间显得小家子气。为什么说它是程序员专用呢?用了几天后,我总结出以下几个让我印象深刻的特点:

这块的屏幕比是3:2,分辨率达到了3840×2560,这是什么概念呢?举个实际例子:我现在可以同时打开VS Code编辑器、Chrome浏览器查文档、终端窗口运行命令,还能在右侧放一个API测试工具,四个窗口互不遮挡,再也不用频繁切换Alt+Tab了。

image-20250724233432774


IMG_20250725_193643

这个分辨率真的改变了我的工作方式。一般显示器的比例是16:916:1021:9,而这款显示器的比例接近3:2。这意味着什么呢?当我在看长代码文件时,比如那些几百行的配置文件或者复杂的业务逻辑,我可以一次性看到更多的代码行数,减少了滚动次数。特别是在code review的时候,能够看到更完整的上下文,理解代码逻辑变得更容易了。

image-20250724234026434

以前没用过这种特殊比例和高分辨率显示器时还没什么感觉,但用了一个星期后,真的是回不去了。最明显的变化是:以前需要在多个桌面之间切换的工作流程,现在在一个屏幕上就能完成。比如做前端开发时,左边写代码,右边实时预览效果,中间还能放个开发者工具调试,整个开发过程变得行云流水。同事看到我的工作效率提升后,也开始考虑换显示器了。

专业编程模式

最让我惊喜的是,这款显示器居然还有专门为程序员设计的专业编程模式。刚开始我还以为这只是个营销噱头,但实际体验后发现,这个功能真的很实用。

通过设置编程模式,代码的语法高亮变得更加鲜明,注释和关键字的对比度明显提升。最直观的感受是:以前看代码时偶尔会眯眼睛,现在完全不需要了,即使是小号字体的代码也能看得很清楚。特别是在处理复杂的嵌套逻辑时,不同层级的代码块区分更明显了。

它提供了多种不同的模式,可以自定义到快捷触键中,我用的比较多的是「用户模式」「编程-深色模式」「编程-亮色模式」:

用户模式:这是默认模式,适合日常办公使用,画面比较明亮,看文档和浏览网页都很舒服。

IMG_20250731_193712

编程-深色模式:这是我的最爱!切换到这个模式后,VS Code的Dark主题显示效果简直完美。代码的语法高亮更加鲜艳,字符串、注释、关键字之间的对比度大幅提升。我现在90%的编程时间都在使用这个模式,特别是晚上加班的时候,眼睛的疲劳感明显减轻了很多。有一次连续写代码4个小时,竟然没有感到明显的眼部不适。

IMG_20250731_201935


IMG_20250725_195723

编程-亮色模式:这个模式是为喜欢Light主题的开发者准备的。我试用了几天,发现它在白天光线充足的环境下表现很好。与普通显示器相比,这个模式下的白色背景不会那么刺眼,看起来更像是纸质书籍的感觉。我的一个同事就特别喜欢这个模式,他说用起来眼睛很舒服,不会有那种"被强光照射"的感觉。

IMG_20250725_200711

有效减少眩光

RD280U面板的抗反射涂层真的让我刮目相看。我们办公室是朝南的,下午阳光特别强烈,以前用普通显示器时,经常需要拉窗帘或者调整座位角度来避免反光。现在用这台显示器,即使是下午两三点阳光最强的时候,屏幕上也几乎看不到明显的反光。

最实际的体验是:以前在阳光强烈的时候,我经常需要把IDE的主题调得更亮一些才能看清代码,现在完全不需要了。甚至有时候忘记拉窗帘,也能正常工作,这对提高工作效率帮助很大。

这里放两张对比图让大家感受一下:

为了突出强光对比效果,我特意用手机开启闪光灯进行拍摄。可以看到,虽然有强光照射,但RD280U几乎没有反光现象,屏幕内容依然清晰可见,代码的可读性完全不受影响。

IMG_20250725_201118


而切换到我笔记本的普通显示器时,反光现象就非常明显了。在同样的光线条件下,笔记本屏幕上的反光几乎让人无法正常阅读代码,这种对比真的很震撼。

IMG_20250725_201138

智慧蓝光过滤

作为一个经常需要加班到深夜的程序员,蓝光过滤功能对我来说特别重要。RD280U提供了5个级别的蓝光过滤设置,我通常会根据不同的时间段来调整。白天工作时用1-2级,保持色彩的准确性;晚上8点后调到3-4级,减少蓝光对睡眠的影响,也可以设置好昼夜模式,就可以根据日出日落时间自动调整滤蓝光的水平了。

最明显的变化是:以前晚上写代码到11点多,躺下后经常需要半小时才能入睡,现在基本上沾枕头就能睡着。我用配套的Display Pilot 2软件设置了自动调节,到了晚上8点会自动切换到护眼模式,非常贴心。

值得一提的是,RD280U通过了5项德国莱茵认证:Eyesafe2.0、Eyecomfort、无频闪、硬件级滤蓝光和抗反射认证,以及1项国家发明专利:智慧调光专利。这些认证不是摆设,实际使用中确实能感受到护眼效果。

IMG_20250801_131514

总结

使用明基RD280U两个多月后,我可以负责任地说,这确实是一款专门为程序员量身定制的显示器。它不仅仅是一块普通的大屏幕,而是真正解决了我们日常编程中遇到的痛点。

主要优势总结:

  1. 超高分辨率带来的效率革命:3840×2560的分辨率彻底改变了我的工作方式。现在我可以同时打开IntelliJ IDEA、Chrome开发者工具、Postman和终端,四个窗口并排显示,再也不用频繁切换了。据我粗略估算,每天至少节省30分钟的窗口切换时间。

  2. 专业编程模式的贴心设计:编程模式真的很实用,特别是深色模式,让我在深夜加班时眼睛舒服了很多。有一次项目紧急上线,我连续编程12小时,眼睛竟然没有以前那种刺痛感。

  3. 护眼功能全方位保护:从抗反射涂层到蓝光过滤,再到无频闪技术,每一项功能都能在实际使用中感受到。最明显的变化是睡眠质量提升了,以前晚上写代码后经常失眠,现在很少出现这种情况。

  4. 3:2比例的编程友好性:这个比例让我在查看长代码文件时体验极佳。比如查看Spring Boot的配置文件或者React组件时,能看到更多的代码行,理解上下文变得更容易。

真实使用感受:

作为一个每天编程10+小时的后端开发,这款显示器真的改善了我的工作和生活质量。工作效率提升了至少20%,眼睛疲劳感减少了一半以上。

如果你满足以下条件,我强烈推荐这款显示器:

  • 每天编程时间超过6小时
  • 经常需要多窗口协作开发
  • 重视眼部健康和睡眠质量
  • 预算在3000-5000元之间

毕竟,我们程序员最宝贵的就是眼睛和大脑,好的工具能让我们在保护健康的同时提高效率,这笔投资绝对值得!

AI增强摘要:

这篇文章详细介绍了作者作为一名程序员,如何通过更换专业显示器(明基RD280U)来改善工作效率和眼部健康。文章不仅分享了显示器的外观和功能特点,如3:2的屏幕比例、3840×2560的高分辨率、专业编程模式、抗反射涂层和智慧蓝光过滤等,还深入探讨了这些功能如何具体提升编程效率和保护视力。作者通过个人体验,强调了这款显示器在减少眼睛疲劳、改善睡眠质量方面的实际效果,并推荐给长时间编程的同行。

内容分类: 程序员的副业或创业经验分享

适合人群: 程序员、软件开发人员、IT专业人士


基于 Kotlin + Jetpack Compose 的 Android 完整电商开源项目分享

原文链接: https://juejin.cn/post/7533134306342289471

原始摘要:

🛍️ 一个完全开源免费且功能完善的 Android 电商项目

作为一名 Android 开发爱好者,我在学习 Jetpack Compose 的过程中发现其生态仍有完善空间,因此开发了「青商城」项目。该项目专为国内开发环境设计,旨在为社区提供实用的 Compose 代码参考,帮助开发者快速掌握现代 Android 开发技术,同时也能对我所学的知识进行巩固和分享。

🌟 项目亮点

  • 100% Kotlin 开发:全面拥抱现代语言特性
  • Jetpack Compose UI:声明式 UI 框架,开发效率显著提升
  • 模块化架构:参考 Google 官方 Now in Android 最佳实践
  • 完整电商功能:涵盖用户认证、商品展示、购物车、支付、订单等
  • 现代化技术栈:Hilt、Coroutines、Flow、Room 等主流技术
  • 开源学习:提供完整的接口文档和代码参考

项目涵盖了 Android 开发中的常见场景:

  • 网络请求、分页加载、深色模式
  • 国际化、支付集成
  • 第三方库整合
  • 模块化架构

整体架构参考了 Google 官方的 Now in Android 项目,采用当前主流技术栈实现。目前已完成的基础功能包括:

  • 用户登录认证系统
  • 商品列表展示与搜索分类
  • 购物车管理功能
  • 订单流程与在线客服

后续将逐步完善优惠券以及商品评价等功能(具体可查看项目中的功能模块计划目录)。

这个项目凝聚了我业余时间的全部心血,从代码实现到 UI 设计再到动画效果,都力求打造流畅生动的用户体验。希望能为开发者提供有价值的参考,同时我也提供了完整的接口文档,期待大家的建议与反馈,共同学习进步。

如果项目对您有帮助,请给个 Star 支持 ⭐ 这对我来说很重要,能给我带来长期更新维护的动力!

📱 项目预览

💡 说明:由于功能模块较多,截图不下,这里仅展示部分界面。更多功能正在持续完善中...

图片 1 图片 2 图片 3 图片 4

📍 项目地址

Demo 下载

  • Release 版本(推荐)点击下载体验

    • 为日常使用和体验优化的稳定版本,具有最佳性能。
  • Debug 版本(开发者)点击下载体验

    • 注意:Debug 版本的包名带有 .debug 后缀,与 Release 版本不同,可以共存安装。
    • 内置工具:集成了 LeakCanary(内存泄漏检测)和 Chucker(网络请求监控)等调试工具。
    • 性能与体积:由于开启了调试功能且未进行代码压缩,此版本性能低于 Release 版本,且 APK 体积更大。
    • 快捷访问:长按桌面图标可快速访问 Leaks(内存泄漏)和 Open Chucker(网络监控)。为确保能接收到 Chucker 的实时网络请求通知,建议开启应用的通知权限。
  • 支持系统:Android 8.0 及以上

  • 更新说明:预览版本会不定时更新,可能不会完全同步最新的代码变更

🛠️ 技术选型

项目采用了当前 Android 开发的主流技术栈:

核心技术

  • Kotlin:100% Kotlin 开发,享受现代语言特性
  • Jetpack Compose:声明式 UI 框架,开发效率显著提升
  • MVVM + Clean Architecture:清晰的分层架构,便于维护和测试
  • Hilt:Google 官方依赖注入框架,简化依赖管理
  • Coroutines + Flow:协程和响应式编程,优雅处理异步操作

功能模块

  • Navigation Compose:Compose 导航组件
  • Retrofit + OkHttp:网络请求处理
  • Room:本地数据库存储
  • MMKV:高性能键值存储
  • Coil:图片加载与缓存
  • Lottie:动画效果支持

架构设计

项目采用模块化架构,参考 Google 官方的 Now in Android 最佳实践:

├── app/                   # 应用入口模块
├── build-logic/          # 构建逻辑
├── core/                 # 核心模块
│   ├── common/           # 通用工具和扩展
│   ├── data/             # 数据层
│   ├── database/         # 数据库
│   ├── datastore/        # 数据存储
│   ├── designsystem/     # 设计系统
│   ├── model/            # 数据模型
│   ├── network/          # 网络层
│   ├── result/           # 结果处理
│   ├── ui/               # UI组件
│   └── util/             # 工具类
├── feature/              # 功能模块
│   ├── auth/             # 认证模块
│   ├── common/           # 公共模块
│   ├── goods/            # 商品模块
│   ├── launch/           # 启动模块
│   ├── main/             # 主模块
│   ├── market/           # 营销模块
│   ├── order/            # 订单模块
│   └── user/             # 用户模块
└── navigation/           # 导航模块

模块化的优势:

  • 🔧 职责分离:降低模块间耦合,提高代码可维护性
  • 👥 并行开发:支持团队协作,提升开发效率
  • 增量编译:显著提升构建速度,优化开发体验
  • 🧪 便于测试:模块化设计便于单元测试和功能验证

功能模块目录

注:文档更新可能略滞后于代码开发进度,最新状态请查看项目中的 README.md 文件。

状态说明:

  • 已完成 - 功能页面已完整实现并可以正常使用
  • 待完善 - 功能页面基本实现,但还需要进一步优化和完善
  • 待优化 - 功能页面已实现,但需要性能优化或体验优化
  • 仅页面 - 只完成了页面UI,功能逻辑尚未实现
  • 待开发 - 功能页面尚未开发,陆续实现中
  • 主模块 (main)

    • 首页 (home) 待完善
    • 分类 (category) 已完成
    • 购物车 (cart) 已完成
    • 我的 (me) 待完善
  • 认证模块 (auth)

    • 登录主页 (login) 已完成
    • 账号密码登录 (account-login) 已完成
    • 注册页面 (register) 已完成
    • 找回密码 (reset-password) 仅页面
    • 短信登录 (sms-login) 已完成
  • 用户体系模块 (user)

    • 个人中心 (profile) 仅页面
    • 设置模块 (settings) 待开发
    • 收货地址列表 (address-list) 已完成
    • 收货地址详情 (address-detail) 已完成
    • 用户足迹 (footprint) 已完成
  • 订单模块 (order)

    • 订单列表 (list) 已完成
    • 确认订单 (confirm) 待完善
    • 订单详情 (detail) 待完善
    • 订单支付 (pay) 已完成
    • 退款申请 (refund) 待开发
    • 订单评价 (comment) 待开发
    • 订单物流 (logistics) 待开发
  • 商品模块 (goods)

    • 商品搜索 (search) 已完成
    • 商品详情 (detail) 待完善
    • 商品评价 (comment) 待开发
    • 商品分类页面 (category) 已完成
  • 营销模块 (market)

    • 优惠券管理 (coupon) 待开发
  • 客服模块 (cs)

    • 客服聊天 (chat) 待优化
  • 反馈系统 (feedback)

    • 投诉子模块 (complain) 待开发
    • 反馈子模块 (feedback) 待开发
  • 通用模块 (common)

    • 关于我们 (about) 仅页面
    • WebView 页面 (web) 已完成
  • 启动流程模块 (launch)

    • 启动页 (splash) 待开发
    • 引导页 (guide) 待开发

🤝 参与贡献

欢迎所有对 Android 开发感兴趣的朋友参与项目贡献!

  • 🐛 Bug 反馈:发现问题请提交 Issue
  • 💡 功能建议:有好的想法欢迎讨论
  • 🔧 代码贡献:提交 Pull Request 改进项目
  • 📖 文档完善:帮助改进项目文档

如果这个项目对你有帮助,请不要忘记给个 ⭐ Star 支持一下!这对我来说意义重大,也是我持续更新的动力源泉。

让我们一起在 Android 开发的道路上不断学习、共同进步! 🚀

AI增强摘要:

这篇文章介绍了一个基于 Kotlin 和 Jetpack Compose 的 Android 完整电商开源项目「青商城」。该项目专为国内开发环境设计,旨在为社区提供实用的 Compose 代码参考,帮助开发者快速掌握现代 Android 开发技术。项目亮点包括100% Kotlin 开发、Jetpack Compose UI、模块化架构、完整电商功能等,涵盖了用户认证、商品展示、购物车、支付、订单等常见场景。文章详细介绍了项目的技术选型、架构设计、功能模块以及如何参与贡献,旨在为开发者提供有价值的参考,并鼓励社区共同学习和进步。

内容分类: 程序员的副业或创业经验分享

适合人群: Android 开发者、技术爱好者、创业者