原文链接: https://supertechfans.com/cn/post/2025-08-07-HackerNews/
原始摘要:
2025-08-07 Hacker News Top Stories #
- OpenAI发布了开放权重推理模型,支持本地运行和定制,提供完整的推理链并注重安全性。
- KittenTTS是一个轻量级开源文本到语音模型,适合CPU环境,模型大小仅25MB,支持多种声音选择。
- 开源开发者因作品被公司使用却未获得回报,引发对开源软件许可和伦理的讨论。
- Claude Code IDE实现了与Emacs的深度集成,通过MCP协议提供丰富的功能和工具支持。
- 美国政府要求台积电购买英特尔49%股份以换取关税减免,引发对芯片供应链和经济影响的讨论。
- Ollama Turbo允许用户利用数据中心硬件运行大型模型,解决了运行速度和资源问题。
- 日本要求苹果在2025年前解除浏览器引擎禁令,支持第三方浏览器引擎的发展。
- 文章介绍了通过base64编码识别JSON、证书和私钥的方法,强调了安全风险的识别。
- 人工智能经济可能被高估,警告其泡沫可能比加密货币泡沫更大,引发对未来经济影响的担忧。
- 美国宪法网站部分内容被移除,引发对数据真实性和信息操控的讨论。
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 的更多指南和资源。
https://news.ycombinator.com/item?id=44800746
https://github.com/KittenML/KittenTTS
KittenTTS 是一个开源的、逼真的文本到语音(TTS)模型,仅包含 1500 万个参数,专为轻量级部署和高质量的语音合成而设计。目前处于开发者预览阶段,用户可以加入其 Discord 社区以获取更多信息。
特点:
快速开始:
系统要求:
开发计划:
关于:
资源:
页面底部提供了 GitHub 的版权信息、相关条款、隐私政策、安全信息、状态更新、文档联系以及管理 cookies 的选项,并提醒用户不要分享个人信息。
https://news.ycombinator.com/item?id=44807868
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 了。
https://news.ycombinator.com/item?id=44808794
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 生态系统互动。
特点包括:
Emacs 工具集成: 该包使 Claude Code 能够通过 MCP 工具集成充分利用 Emacs 的全部功能。Claude 可以直接访问和使用 Emacs 的功能,包括:
这种深度集成意味着 Claude Code 理解您的项目上下文,并能够利用 Emacs 的广泛生态系统提供更智能、更具上下文感知的协助。
截图展示了以下功能:
安装: 先决条件包括 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 交互的最简单方式是通过基本命令。
https://news.ycombinator.com/item?id=44811567
gptel 提供了一个充满活力的生态系统,提供了比 VSCode 更强大的功能。gptel 和 Claude Code 的工作经验和配置。美国政府正在采取极端措施来挽救英特尔公司。根据台湾的一份新报告,美国政府正在将降低对台湾的贸易关税与台积电(TSMC)在美国的重大投资联系起来。这项投资包括购买英特尔 49% 的股份。目前,美国对台湾的贸易关税高达 20%,高于日本等国家的 15%。台湾是美国最大的贸易伙伴之一,因此 20% 的关税对台湾企业来说是一个沉重的负担,这也是为什么台湾需要与美国进一步谈判以降低或完全取消关税。然而,根据台湾媒体 mnews.tw 的报道,美国总统特朗普提出了两个条件,要求台湾在获得关税减免前必须满足:购买英特尔 49% 的股份,以及在美国进一步投资 4000 亿美元。
尽管台积电已经在美国进行了大量投资,包括在亚利桑那州的两个新工厂和一个研发中心以及一个封装设施,计划总投资达到 1650 亿美元,但特朗普总统提出的额外投资 4000 亿美元以及购买英特尔股份的要求从财务角度来看似乎不太可能。英特尔公司正面临衰退,从其制造业务到消费产品,几乎每个部门都受到了打击。公司的年收入从 2021 年的 790 亿美元下降到 2024 年的 530 亿美元,下降了 33%。英特尔是美国国内半导体制造计划的关键部分,已经获得了数十亿美元的联邦补贴,但这并未解决英特尔的问题,公司已将其俄亥俄州工厂的建设从最初的 2025 年推迟到 2030/31 年。主要原因是英特尔在缺乏美国芯片法案和外部合作伙伴的显著帮助下,努力保存资本资源。
简而言之,美国政府似乎正在向台积电施压,要求其收购英特尔的大量股份,以注入急需的资金并维持美国政府国内芯片供应链的计划。然而,台积电不太可能同意这一提议。未来几个月,英特尔的情况将如何发展还有待观察。英特尔正在开发一些激动人心的产品,如 Panther Lake 和 Nova Lake 处理器。如果这些产品能够成功交付,那么英特尔的前景可能会有所改善。
https://news.ycombinator.com/item?id=44801486
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 还提供聚会活动。
https://news.ycombinator.com/item?id=44802414
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)指南。这些从属规则阐明了法案将如何被解释和执行。对于浏览器竞争,这些指南意味着什么?
指南明确禁止任何阻止或妨碍第三方浏览器引擎采用的措施:
MSCA 还要求公平访问操作系统 API,这与欧盟数字市场法案(EU DMA)第 6 条第 7 款相呼应。对于浏览器来说,这一点尤其关键,因为它们需要广泛访问通常为 Safari 和 WebKit 保留的大量 API。
该法案还规定了浏览器等项目的选择屏幕。重要的是,它规定选择屏幕必须在“首次激活后立即”显示,这是对欧盟数字市场法案的一个重要改进。
预计《移动软件竞争法案》将在 2025 年 12 月生效。随着日本加入欧盟和英国,现在有三个司法管辖区要求苹果允许浏览器运行自己的引擎。随着日本准备执行,它可能正在研究已经在欧洲和英国展开的监管方法和挑战。
正如欧盟和英国已经展示的(英国 MIR、CMA SMS 案、欧盟 DMA 执行),执行将是一个漫长而艰难的过程。现在日本、欧盟和英国都要求苹果支持第三方浏览器引擎,2026 年可能成为恢复 iOS 浏览器竞争的决定性一年。但这在很大程度上取决于监管机构的决心,以及苹果在实质上的合规意愿,而不仅仅是形式上的。
https://news.ycombinator.com/item?id=44810061
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 补充了关于证书和私钥的信息。
https://news.ycombinator.com/item?id=44802886
MI 是每个 ASN.1 DER 编码对象的常见前缀,因为每个对象几乎都是以 SEQUENCE(0x30 标签字节)开始,后跟长度引导字节(最高位 0x8)。MII 非常常见,因为它引入了一个两字节长度的 SEQUENCE。https://www.bloodinthemachine.com/p/the-ai-bubble-is-so-big-its-propping
大家好,这是本周的 BITM 新闻。我刚从旅行中回来,参加了在旧金山的一个关于人工智能和工作的座谈会,接着又回到了洛杉矶参加了 404 现场活动之夜,很高兴在那里遇到了很多 BITM 的读者。我还接受了《时代》杂志 Charter 项目的采访,虽然因为疲惫状态不佳,但我认为还是传达了一些好的观点。此外,我还与独立媒体/自由职业者倡导平台 Study Hall 讨论了人工智能在新闻业中的应用。
本周人工智能领域也非常忙碌,这并不令人惊讶,因为与我们即将讨论的新闻息息相关。在本期中,我们将深入探讨以下内容:
上周,微软成为继英伟达之后第二家市值达到 4 万亿美元的公司。微软的股价自今年年初以来上涨了约 28%。这一里程碑的到来,距离微软达到 3 万亿美元市值仅一年半时间。微软和英伟达都从人工智能热潮中受益,它们通过销售云计算服务来推动增长。微软的主要收入来源现在是 Azure,其云计算业务。Azure 曾是行业领导者亚马逊网络服务的远落后者,但上个季度的销售超出预期,推动微软达到新的高峰。
微软和英伟达从真正的历史性投资水平中受益。克里斯·米姆斯引用了投资者和程序员保罗·凯德罗斯基在《华尔街日报》专栏中的分析:人工智能基础设施的支出已经超过了互联网泡沫时期电信和互联网基础设施的支出,而且仍在增长。美国经济之所以持续强劲,尽管有关税问题,一个解释是 IT 基础设施支出如此之大,以至于它像是一种私营部门的刺激计划。
过去两个季度,人工智能的资本支出对美国经济增长的贡献超过了所有消费者支出的总和。对我来说,这显然是泡沫。我知道我并不孤单。我特别想到了埃德·齐特龙关于人工智能泡沫的激情和详尽的指南;关于投入和花费在人工智能上的钱与这些产品所赚取的钱的对比,以及令人惊讶的是,目前的情况是不可持续的。令人担忧的迹象比比皆是,尤其是到目前为止,从人工智能中受益最多的公司是那些销售构建更多人工智能工具的公司(英伟达、微软),或者是那些可以通过垄断迫使用户大规模使用人工智能工具而几乎没有后果的公司(谷歌、Meta)。消费者在民意调查中对人工智能和人工智能产品的负面情感通常超过热情。与此同时,我认为唯一真正流行的人工智能产品类别,聊天机器人,大部分仍然是大钱亏损者,因为它们需要大量的资源来运行。因此,这些巨大的估值感觉可疑。我询问了埃德对微软 4 万亿美元收入报告的看法。他说:微软历史上首次公布了 Azure 的收入,但自 2025 年 1 月 29 日以来没有更新他们的年度人工智能收入。如果人工智能的发展如此顺利,为什么他们不提供这些数字?那是因为事情根本不顺利,他们试图玩弄数字游戏来迷惑和激发投资者。此外,Azure 收入中有超过 100 亿美元是 OpenAI 的计算成本,按成本支付,意味着微软没有利润(甚至可能有损失)。
看,我显然不是预言家。我几乎一年前就预测我们可能见证了人工智能热潮的顶峰,尽管我认为在真正的消费者和流行文化兴趣方面我是对的,但显然投资和扩张一直在继续。现在已经远远超过了互联网泡沫时期的投资水平,正如凯德罗斯基所指出的,接近铁路级别的投资,上次出现还是在强盗贵族时代。我不知道接下来会发生什么。但如果人工智能投资如此庞大,以至于实际上在压力增长时期帮助支撑了美国经济,如果人工智能的凳子被踢开,会发生什么?可能会有一次超过互联网泡沫破裂的崩溃,而在这样一个政治局势中,这样的崩溃会…
https://news.ycombinator.com/item?id=44802916
https://reddit.com/r/law/comments/1mj3ttx/constitution_of_the_united_states_website_has/
您当前遇到的是一个网络安全提示页面,提示您已经被网络安全系统阻止。为了继续访问,您需要登录您的 Reddit 账户或使用您的开发者令牌。如果您认为这是一个错误的阻止,您可以在页面下方提交一个工单,工作人员将会对您的问题进行调查。页面提供了登录和提交工单的选项。
https://news.ycombinator.com/item?id=44811733
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
根据公历和地球的公转轨道,八月才刚刚开始。
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美元的订阅费,也不会消耗大量资源。
我对此感到无比震撼。
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的格斗游戏无法运行。
对长指令的遵循和简单的组合游戏逻辑会失败(例如,收集一些分数/钥匙等,走到门口,解锁等)。
动作空间有限。
它距离成为一个真正的游戏引擎还差得很远,还有很长的路要走,但这已经让我们清晰地瞥见了未来的方向。
尽管有这些限制,这成果仍然令人难以置信。这向我表明,世界模型在机器人和现实世界的人工智能中可能比我意识到的扮演着更重要的角色。未来的机器人或许会在它们的“梦境”中学习……
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这样的公司用我的代码当然好,但要是能从中获益就更好了。关于这个话题,我在这里写了一篇稍长的博客文章:
https://news.ycombinator.com/item?id=44753654
But I already have Jira for that
ochronus
但是,我已经有 Jira 来做这个了。
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、让所有人都发了财就感到不满,这想法简直是《阴阳魔界》级别的荒谬。而这,完全与他们网站上宣称的那些狗屁价值观背道而驰。
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倍的提升在大多数情况下都不切实际。
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”……就没那么清楚了:
商家不得向其收单机构,也客户不得向交换系统,提交任何非法的交易,或者,在公司的自行决定权下,任何可能损害公司商誉或对其商标产生负面影响的交易。
现在到底该信哪个呢?是允许所有合法购买(相当明确),还是只允许不会在万事达看来对其“产生负面影响”的合法购买(含糊至极)?
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
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相关的脂肪增生患者,而这种病症与加速衰老有关联。尚不清楚这对普通人意味着什么。
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
会计规则。如果积分永久有效,任何未使用的积分都不能计入收入。我上一家公司的时候就遇到了这个问题,当时我们签下了一份大合同,并给了对方价值几十万美元的永久性积分。我们告诉会计师之后,他当时就懵了。
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做过贡献,大概花了一年时间才重拾编程的热情。不过相比之下,我之后开源的其他项目都相当顺利。
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研究人员、开源社区成员、经济政策分析师
原文链接: https://juejin.cn/post/7534879121093591079
原始摘要:
#FlashTable超能播种计划 #效率革命 #人工智能 #表单低代码 #效率工具 #低代码
随着数字化时代的不断发展和普及,传统的表单在制作与维护过程中交互设计繁琐、效率低下等众多问题,如何进行高效的文档处理和团队协作变得越来越重要,云端办公软件已经成为了越来越多企业和个人的优选。
使用云端办公软件不仅可以提高工作效率,还可以节省时间和成本。今天给大家推荐一款低代码一站式平台【Flash Table】,简化了表单相关的开发流程,支持AI一键生成表单,支持私有化部署等众多的特点,更快、更高效率的创建和管理复杂表单,从而进行降本增效赋能业务,如下为本人从0-1从产品介绍、产品体验、产品开发几个角度来进行探索。
本人也是一个比较早期接触计算机行业的码农,从最开始学校学习的Docs系统命令,到windows98、2000的系统,对于存放文字资源信息不是太方便,使用的软盘存储工具,到后面Windows Office和WPS两大软件的的文字处理、电子表格、演示文稿,可以满足日常文档编辑、数据计算和基本演示的需求。
尤其是在初创企业中,Excel更是被广泛的使用,内置了丰富的数据分析工具,如公式、函数、透视表等,能够帮助用户进行复杂的数据分析。可以能够快速进行数据计算、汇总和分析,大大提高了工作效率,但是,Excel的缺点主要包括其在数据处理、协作、权限管理等方面的局限性,以及在使用过程中可能遇到的技术问题。
所以,无论是个人用户还是企业团队,都非常的渴望找到一款既功能强大又灵活的办公软件来满足日常办公的需求,在众多的挑选中,“低代码平台Flash Table”是一款专为高效表单开发设计的工具,通过低代码或无代码方式快速搭建复杂表单,显著提升开发效率并降低技术门槛,接下来一起聊一聊“Flash Table”能给我们带来什么不一样的体验呢?
FlashTable 是一款专为高效表单开发打造的卓越工具,旨在为用户提供简便、快捷且功能强大的表单创建及管理体验。与传统表单开发方式相对比,FlashTable 的优势极为显著,通过简洁直观的交互界面,即便是毫无编程经验的小白,也能轻松驾驭。
使用“FlashTable”平台后,通过基于Web方式完全业务化,用户只需简单的在图形化界面中,通过点击、拖拽等操作,零编码方式业务流程建模与调整实现业务与技术融合,几分钟内即可完成一个设计精美的表单,让更懂业务的业务人员参与应用建设,更好地满足业务需求。
零代码开发无需代码基础,适合业务人员、IT开发及其他各类人员使用,它们通过零代码开发平台快速构建应用,并适应各种需求变化,用户在几天甚至几个小时内就能完成系统的开发、测试和部署,并能够随时调整或更新。
①. 1:1 精准还原:直接导入用户原有的 Word/Excel 模板样式,最大限度保留用户熟悉的工作界面,消除学习成本。
②. 极速开发:将单个表单开发时间从小时级(2-3小时)压缩至分钟级(约3分钟),效率提升高达40倍!
③. 智能加持:集成AI能力,智能推荐组件、自动补全公式(后续版本更新)、简化数据源接入与外部对象引用。
④. 灵活集成:提供 Docker 镜像和 Jar 包两种部署方式,轻松与现有OA、ERP、MES、LIMS、QMS等各类企业信息系统集成。
⑤. 低代码赋能:让开发者和无编程基础的业务人员都能高效协作,快速构建符合业务需求的表单。
正是凭借这些突出的优势与特性,“FlashTable”成为提升工作效率的关键利器,开箱即用的“傻瓜式”操作流程,让表单开发变得更轻松快捷,仅仅只需要三步,就能完成以前几个小时才能实现的表单制作。同时,支持可视化拖拽和智能生成表单、映射同步对接多系统等优势,可以提高开发效率。
通过打开官方下载页面,从帮助文档我们可以看到支持两种模式的安装,分别为“Docker镜像文件安装”、“Jar包安装”2种方式,因为本机环境没有安装java环境,所以,选择Docker镜像安装方式。
点击下载会将官网下载的离线 docker 安装包 (flashtable.zip)下载下来,差不多有1G大小。
从 FlashTable 官网下载的离线 Docker 完整镜像包支持 Linux、Windows 系统,以下文档基于 Linux 系统环境安装 (推荐部署运行在 Linux 操作系统下的 Docker 环境),Docker部署: 容器内包含所需依赖和第三方组件、开箱即用, 简化了部署流程和依赖管理。
Linux 服务器: 架构为 x86_64, Linux 内核版本>5.0, 支持 CentOS/ Ubuntu/ OpenEuler/ OpenKylin 等系统。
在安装FlashTable之前,本地需要先安装好Docker环境,本文使用的是CentOS 7服务器来安装Docker 25.0.5版本的,如果你电脑上没有安装过docker,可以尝试看看我写的番外篇《CentOS 7系统指定版本Docker安装教程》。
因为我是在本地的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
上面我们已经将离线安装包的文件进行解压了,得到了以下的一些文件,先来看一下README.md的文件,感觉操作写的太简陋了一些,可以稍微增加优化一下。
我们通过执行“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这些第三方组件的密码,方面后面我们连接进行数据的查看。
接下来就是创建swarm集群,并且创建网络、构建service相关的服务,可以看到有4个服务器创建起来了,分别是minio、mongoDB、mysql、redis等服务,比如也可以查看有一些端品的映射,这里推荐最好这几个端口不要被占用了。
第一次操作会将一些第三方的组件的工具下载并且创建swarm集群,并且进行初始化,接下来,我们再进行安装services服务,同样也会拉取一些docker镜像下来,这里我理解是java后端和前端相关代码服务。
上面已经将“base基础服务”、“services服务”都已经初始化完成,接着选编号“4”进行退出脚本即可,我们可以查询 FlashTable 容器运行状态, 可以使用“docker service ls|grep cxist”命令查询。
当然,如果觉得想要查看更多的服务部署状态信息,可以直接使用“docker ps”来进行查看,可以看到拉取镜像的名称、什么时候创建的、现在的容器状态是怎么样的,端口详细的映射信息,容器的名称是哪些。
FlashTable 部署成功后默认访问地址为 http://localhost:11000 (本地),如果是远程 Linux 服务器则对应为服务器 IP 地址+11000 端口,例如 http://192.168.33.10:11000
super~到这里“FlashTable”Docker安装离线包就完成了,安装的操作也是比较简单,接下来,我们就可以进行愉快的玩耍了。
这里可以设计一下我们公司需要的采购单,看看“FlashTable”怎么来进行使用的,推荐可以看一下我下面这个视屏文件,是我的全部操作过程。
在熟悉完操作按钮和组件库后,就可以进行样式的调整了,我们也可以看到在几分钟内就完成了一个仓库常用的采购单的设计工作,那么现在表格的设计应该没有太大的问题,就是稍微熟悉一下界面操作即可。
上面介绍了“FlashTable”常用的一些功能,但是往往在企业中,需要跟各种业务系统进行集成,快捷方便的接入到第三方系统中,接下来我们就来演示一下如何将“FlashTable”快速导入到工作中常用的业务系统中。
这里以我们某一个业务后台管理系统系统为例,技术栈是vue3 + vite的。
首先找到官方的文档FlashTable系统集成对接手册v1.0,这里面有详细的说明。
可以通过在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即可。
<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>
运行时页面的ifrmae拼接格式:
http://flashtable:1000/viewer?origin=http://mysystem:2000&id=123&readonly=1
# http://flashtable:1000表示FlashTable域名及端口
# http://mysystem:2000表示自己业务系统的域名及端口
在主系统的前端页面中插入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>
当时,在调试城市时不能进行输入,是由于文档中多了一个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>
在window上监听 message 事件 window.addEventListener('message', (event) => {…}),此方法返回的是模板的生命周期以及回调函数。
将调试模式的元素选择器,选择到iframe这个节点(一定要是这个节点,否则不生效),然后,在控制台中输入“$0.content”会自动看到有一个contentWindow这个命令,接下来输出以下这条命令就可以进行赋值了:
$0.contentWindow.postMessage({command: 'SET_DATA', data: {"city": "武汉"}}, "*")
# city字段表示之前设定的数据模型字段
# 武汉是city字段对应的值
# *号表示忽略跨域问题
通过 command SET_DATA可以设置模板值,在模板设计阶段,可以针对组件名称属性进行修改,默认为:6e430b55字母加数字八位数格式,修改该字段后可以通过设置修改后的字段进行赋值。
例如:将组件名称修改为 testKey,那么在SET_DATA的时候在data中设置 { testKey: 123 },将会对组件名称为testKey的元素进行赋值。
随着AI人工智能、机器学习的不断发展,传统的表单办公与开发也在经历着一场前所未有的变革,在这个过程中,AI低代码一站式智能创建和管理复杂表单的出现为业务人员与开发者们提供了一种全新的交互模式,AI低代码辅助复杂表单管理也已经成为了一个十分备受关注的领域。
接下来分析一下我们在工作中会遇到有哪些问题点,以及这些问题点如何的使用“低代码平台Flash Table”来优化解决?
由于工作中或多或少都会跟办公软件有交集,甚至在招聘中有明确显示需要熟悉各种办公软件的使用,以更快、更熟练的接入工作,所以,经常会被迫学习与行业知识无关的技能储备:
①. 工作中经常会遇到使用Excel或wold表单发送给同事与领导后,发现别人的电脑打开会报错、样式错乱等使用不了的情况。
②. 设计好的报价预算单,发送给客户后,客户打开各种警告与报错,远程无法排查与解决问题,错失良机。
③. 有时候遇到工作没有做完,需要进行带回家继续办公,常见的是使用U盘进行备份,如果丢失资料可能会造成重大损失。
④. 很多初入社会、实习生,在学校中没有太多接触办公软件的机会,往往在刚刚工作时不能快速融入团队,有时候不少“挨批”、“ 受训”。
⑤. 工作中经常会遇到办公软件报错损坏,而往往业务人员并不是专业的电脑管理者,不具备电脑问题的处理能力,只能走流程报修(以我待过的富士康公司来说,报修流程和时间非常繁琐与耗时),往往工作效率低效。
在软件开发和其他工程领域,“重复造轮子”被广泛认为是一种低效的做法,因为它浪费了大量的时间和资源去重新创作已经存在的东西,而不是利用现有的技术和经验去解决问题。
在 B 端开发领域,表单开发长期面临着许多痛点,严重影响开发效率与用户体验,通常增加一行、删除一行,都会涉及到数据结构的变动,且一个表单的开发从需求提出、产品出PRD文档、前后端确定需求、数据结构对接、样式功能呈现、功能测试、功能需求上线会经过一个漫长的等待。
另外一点就是通用性不强,在大多数企业应用中,我们经常“重复造轮子”,对于开发的角度来讲,每个公司都有一套自己的软件代码平台,无非是使用Java体系重构一遍PHP的业务,使用Go的体系重构一遍Java的体系,就会产生以下几个方面的问题。
在开发的过程中,也存在一些相互协作的问题点,比如需要准备不同的环境、开发依赖来运行应用,前后端联调接口的差异化,上线的测试功能回归和bug修复再回归都是影响软件项目交付的因素。
如下为公司团队管理工作过程中,传统团队的表单开发模式存在一些困境,特别在新老员工离职交接过程中,处于一个周期低产出的阶段。
在以往的IT团队开发模式,在业务规模的高峰期为了快速完成系统的开发,帮助业务团队尽快开展工作,往往会成比例的招大规模的团队开发人员来满足现有的需求,这样会导致几个问题,没有一个比较有效的降本的方案:
是否厌倦了传统办公软件的繁琐与限制?在使用WPS和Office时,对于很多用户都是使用破解版本,不安全且容易有法律风险。
①. 微软的Office软件需要进行付费使用,对于个人与中小公司是一笔不小的费用。
②. 金山WPS限免的功能需要付费使用,且使用过程中很多广告弹框,在与领导汇报工作、工作会议、甲方进度汇报时,体验非常不好。
③. 因个人经常需要去产品方案演讲,出差甲方公司洽谈工作时,为了避免版权的问题,个人也是花费了不少的费用。
本文结合实际开发场景,深度解析 FlashTable 如何通过技术创新,系统性解决表单开发难题,为开发者提供可落地的效能提升方案。
“Flash Table一站式AI表单低代码平台”摆脱了传统软件的固定限制性,比如:传统软件的单据、报表等的格式早已由软件公司的程序员定制好,想实现某些功能,就要进行程序开发,而且开发周期也很长、费用也很可观。
在企业项目中完全可以使用起来,可以满足业务的开发,而且门槛也比较低,基本也没有太多的风险点,下面是个人总结的SWOT,可仅大家参考一下。
“Flash Table”能让客户按照自己的需求快速地构建适合该企业的表单管理,可以更好地满足企业定制化开发需求,助力企业低成本打造更加适合组织的自有智能代码助手,进一步大幅提升软件研发体验和效率,极大地提高了产出的效率,让你更专注在表单的业务设计,高质高效地完成表单的开发管理工作,如下是个人在体验中比较直观的感受:
“FlashTable”专为开发者打造的表单开发提效工具,它聚焦于解决一个核心问题——快速、精准地开发符合用户习惯的表单。从企业最关心的问题入手,快速实现整体系统的构建和运行,这样构造出来的系统没有了陌生感、没有了阻碍,作为中间件嵌入自有系统,减少定开成本,快速响应客户需求。
“FlashTable”应用场景极其广泛,适用于企业内部任何涉及表单录入、数据采集的系统,如OA、ERP、MES、QMS、LIMS、其它定制化项目等。
在传统的业务表单开发中,通过对上面的实际开发场景,可以了解到“FlashTable”是怎么通过技术创新,从业务痛点出发,系统性解决大多数表单通用的开发难题,为开发者提供可落地的技术方案。
传统表单开发忽略用户既有操作习惯,往往业务还没有开展,就需要学习各种系统的操作,对于存在一定“肌肉记忆”的用户非常排斥,就算是开展各种系统的讲解培训,也是收益甚微,还是会不停的询问IT开发部“怎么用?”、“怎么加?”、”怎么保存?”,导致业务系统推进阻力大、用户接受度低、效率低下。
用户需求经产品、UI设计、开发多层级需求转化后,由于IT系统分析员没有业务人员那样清楚业务需求,所以会存在理解误差,加上环节多,这种误差会在传递中被进一步放大,最终会导致开发出来的程序不符合业务人员最初的要求,非常容易就会出现需求偏离原始意图问题,导致产出结果不高效,需要反复确认与修改,增加时间与人力成本。
针对传统模式下,单个表单开发耗时 2 - 3 小时,面对大规模需求(如成千上万张表单),人力成本呈指数级上升,难以满足项目交付周期,由于整个开发流程跨度时间长,期间由于业务发生变化或管理进步需要,往往导致需求变更,这样又影响到了开发。
“Flash Table一站式AI表单低代码平台”针对传统开发流程的不足,把流程变成了:业务人员需求整理 -> 分析需求 -> 设计系统 -> 完成 -> 根据需要持续优化与扩展功能,整个流程可能不需要IT程序开发人员的参与,最后完成系统的功能就是业务人员想要的,也就是说业务人员根据自己的意图,不用写一行代码就可以设计出自己想要的系统,并且以后可以根据需要不断优化与扩展,真正做到了“持续优化,因需而变”的目标。
在 B 端开发效能竞争加剧的当下,“工欲善其事必先利其器”,FlashTable通过模板还原、低代码协同、极速引擎三大技术创新,范式重构表单开发流程,打造可视化表单搭建工具、无代码数据采集平台,是突破传统的开发瓶颈、构建核心竞争力的关键。
①. 对用户:降低操作门槛,保障业务连续性。
②. 对开发:压缩开发周期,减少需求沟通成本。
③. 对企业:提升项目交付效率,降低数字化转型成本。
如下是根据“Flash Table”体验后,对于企业级项目使用的一些评估项目,可以看出常用的一些表单,可以零成本进行导入,针对一些可视化的报表现在还不能满足需求,另外,在APP和小程序、H5等技术栈没有看到相关方案。
FlashTable以高效生成复杂表单著称,支持拖拽式设计、动态数据绑定和跨平台兼容性,场景涵盖工厂、教育、电商、金融、医疗等多行业场景,大幅降低开发门槛。
相信大多数人看过《校花的贴身高手》吧,其中前期玉佩元神“焦牙子”,帮助林逸在修炼上引路者,使得人生就像开挂一样。那么,在未来AI作为桥梁纽带的情况下,我们或许可以期待”Flash Table一站式AI表单低代码平台”能够造就一个更加无缝整合高效AI办公的新时代。
“Flash Table一站式AI表单低代码平台”让表单开发与管理变得越来越简单,不管是刚入职场的小白或者从业多年的业务人员、开发技术人员,都能开箱即用轻松上手,可以把更多时间放在业务方向上。
Flash Table则兼具两者优点,不仅支持AI智能生成表单、自动化搭建,极大提升开发效率,还原生支持多数据源集成和复杂交互逻辑,具备较强的定制能力和企业级运维支持,适合对效率、集成和定制化有较高要求的企业级场景。
不管公司规模大小,使用”Flash Table一站式AI表单低代码平台”都能使用它进行快速实现企业数字化转型,伴随着AI不断的发展和低代码的功能不断完善,“Flash Table”会越来越智能,用技术创新加速企业数字化转型来降本增效,成为您成功的坚实后盾。
AI增强摘要:
本文介绍了Flash Table,一款专为高效表单开发设计的低代码平台,它通过AI一键生成表单、支持私有化部署等特点,显著提升了表单创建和管理的效率。文章从产品介绍、体验和开发角度详细探讨了Flash Table的功能,包括其与零代码平台的区别、选择Flash Table的理由、私有化部署方案以及如何快速完成采购表单设计。此外,还探讨了Flash Table在企业内部业务系统集成中的最佳实践,以及传统表单管理和开发中的痛点,展示了Flash Table如何通过其高效、灵活的特性解决这些问题。
内容分类: AI工具使用教程与技巧
适合人群: 企业IT开发人员、业务分析师、项目经理以及对提高办公效率感兴趣的个人用户
原文链接: https://juejin.cn/post/7534568184419057691
原始摘要:
真实项目优化实录:从 5 秒白屏到 1.2 秒加载完成,Vite 项目性能优化全攻略,附可直接复用的代码片段。
| 指标 | 优化前 | 优化后 | 收益 |
|---|---|---|---|
| 首屏加载 | 5.2 s | 1.2 s | ↓ 77 % |
| LCP(最大内容绘制) | 4.1 s | 1.0 s | ↓ 76 % |
| JS 体积 | 1.8 MB | 480 KB | ↓ 73 % |
| 图片总重 | 6.4 MB | 1.9 MB | ↓ 70 % |
// 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];
}
},
},
},
},
});
manualChunks 可以进一步自定义代码分割逻辑。// 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,
},
},
});
console.log 等调试信息。// 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>
<link rel="preload"> 预加载关键字体。<link rel="preload" href="/fonts/Roboto.woff2" as="font" type="font/woff2" crossorigin />
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [vue()],
build: {
assetsDir: 'static',
assetsInlineLimit: 4096, // 小于 4KB 的资源内联
},
});
# 静态资源缓存 1 年
location ~* \.(?:js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|avif|webp)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
<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;
}
}
// 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'], // 必填
}),
],
});
npm install -g lighthouse
lighthouse https://your-site.com --view
import { getCLS, getFID, getLCP } from 'web-vitals';
getCLS(console.log);
getFID(console.log);
getLCP(console.log);
// 避免
const width = element.offsetWidth;
element.style.width = width + 10 + 'px';
// 推荐
element.style.width = element.offsetWidth + 10 + 'px';
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
<div class="fade-in"></div>
通过 Vite + 7 招优化,我们的项目从 5 秒白屏降到 1.2 秒加载完成,性能提升 77%。把这份优化清单贴在工位
AI增强摘要:
这篇文章详细记录了如何通过7个关键步骤显著提升前端项目的性能,特别是针对Vite项目的优化。从代码体积瘦身、资源优化、网络优化到首屏优化,每一步都提供了具体的实现方法和代码示例。文章不仅展示了优化前后的性能对比,还强调了持续监控和优化的重要性。核心观点在于,通过综合应用现代前端技术和工具,可以大幅提升用户体验和页面加载速度。
内容分类: AI工具使用教程与技巧
适合人群: 前端开发者、Web性能优化工程师、技术爱好者
原文链接: 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 开发环境,没有我们就自己造!
打开 PowerShell(以管理员身份),执行:
wsl --install
Windows 10 用户需先更新 WSL 组件,可参考官方文档:learn.microsoft.com/zh-cn/windo…
如果发现安装后还是无法使用,可以试试万能的重启电脑。
从 Microsoft Store 安装 Linux 发行版。选择 Ubuntu 20.04 或更新版本,并完成安装初始化。(设置用户名和密码)
代码放在 WSL 子系统路径中运行,能避免很多路径映射问题,并且可以提高性能。
打开 WSL 终端,进入你的 Linux 系统,执行:
cd ~
mkdir workspace
然后在 Windows 文件资源管理器中,把你的项目文件复制到:
\\wsl.localhost\Ubuntu\home\你的用户名\workspace
这个过程可能会有点慢,可以试着先忽略像node_modules这样的文件,然后当复制到后再 install。
vscode 也针对这种情况出过相关策略,可以安装 Remote - WSL 插件,然后在 VSCode 中按下 F1,输入:
Remote-WSL: Open Folder in WSL
选择你刚刚放进去的项目目录即可。此时你将在 VSCode 中享受到原生 Linux 的开发体验。
如果你的项目使用 Docker 开发,在安装 Docker Desktop 后:
这样你就可以在 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
原始摘要:
引言
隔壁组的小明最近有点不痛快,在设计支付接口时被架构师老李连怼三次,就因为接口的幂等性没有考虑充分。
每次都是自信满满,可每次都被找出问题。
这次我们跟着隔壁小明的视角,循序渐进,彻底搞懂接口幂等设计的精髓。
真的是精髓。
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:
@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");
}
// 其他业务校验...
}
}
说明:
@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记录这段做个简易的说明:
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过。但正是这些经历,让我们学会了思考边界、考虑异常、关注用户体验。
真正的成熟,不是写出多么复杂的代码,而是能在简单与复杂之间找到恰当的平衡。
知道什么时候该用简单方案,什么时候需要复杂设计;明白技术是为了解决问题,而不是炫技。
就像幂等设计一样,人生最好的状态也许就是:无论经历多少次冲击,都能保持内心的那份坚定与一致。
与君共勉。
AI增强摘要:
文章通过小明在设计支付接口时被架构师老李连续三次指出问题的经历,深入探讨了接口幂等性设计的重要性及其实现方法。第一次,小明的支付接口没有考虑重复提交的问题,导致用户可能被重复扣款。第二次,小明尝试使用Redis进行简单去重,但忽略了用户连续支付相同金额和支付失败后key仍存在的问题。第三次,小明引入了幂等token方案,但仍存在并发问题和失败请求无法重试的缺陷。最终,在老李的指导下,小明设计出了一个完善的幂等方案,包括使用分布式锁保证并发安全、状态管理以及核心业务逻辑的正确处理。文章不仅总结了幂等设计的核心要素和技术方案,还强调了在实际开发中避免常见错误的重要性。
内容分类: AI工具使用教程与技巧
适合人群: 后端开发工程师、软件架构师、技术爱好者
原文链接: https://juejin.cn/post/7533861390501314612
原始摘要:
一. 前言
最近在抖音刷到了很多 AI 视频的案例 ,直到刷到其中一个 硬控了3秒才反应过来 ,现在AI视频好像可以面向生产了。
👍👍📍📍 来源于抖音 @ 阿飞乱剪
所以动了心思想了解一下这块的东西, 周末陆陆续续看了很多 ,也试了好些软件 。
花了真金白银的实现结果 ,在这里输出一个报告给大家。主要是国产的 ,国外的只收录了 Google 的案例。
文案内容 (没有专门优化提示词,就作为一个普通使用者的尝试) :
| 工具名称 | 推出厂商 | 付费模式 | 消耗 | 试用套餐 | 主要特点 |
|---|---|---|---|---|---|
| 即梦 | 字节跳动 | 免费+付费版 | 单次10 | 每天送60 | 效果还行 ,操作简单 |
| 可灵 | 快手 | -会员有四个档 ,非会员有水印 | 单次20 | 有7天试用套餐 ,1-5元 | 可以设置多个节点图 ,让视频的内容连贯起来 |
| 海螺 | 稀宇科技 | -会员挡位很多 ,有年费版。 -非会员并发 + 质量限制 | 单次25 | 500贝壳新人礼包 | |
| 白日梦AI | 光魔科技 | -纯文生图,不支持图片传入 -需要选择特定的模板生成 | 开局500积分 | 故事型的AI生成工具 ,适合做新时代漫画 | |
| 腾讯混元AI | 腾讯 | 项目/企业付费 | 没收费 | 没套装 | 很慢 ,而且会中途失败 ,效果自己看 |
| 绘蛙 | 阿里 | -多个会员档次,但是免费的下载无水印 | 单次30 | 赠送300积分新手礼包 | 支持一键换衣等电商领域的功能 |
腾讯混元视频
对比海外 : Google Veo 3
关于其他的
AI增强摘要:
本文探讨了AI生成视频工具的现状和比较,作者通过实际使用和付费体验,对国内几款主流AI视频生成工具进行了详细评测,包括字节跳动的即梦、快手的可灵、稀宇科技的海螺、光魔科技的白日梦AI、腾讯的混元AI和阿里的绘蛙。文章不仅比较了各工具的价格、操作界面、功能特点,还分享了使用心得和技巧,如提示词的重要性。作者认为国内AI视频生成技术已足够成熟,可以投入短视频创作,但也提醒读者需合理预期,充分利用试用套餐进行尝试。
内容分类: AI工具使用教程与技巧
适合人群: 内容创作者、短视频制作人、技术爱好者
原文链接: https://juejin.cn/post/7533471580984770603
原始摘要:
前言
在前端开发中,随着项目规模的扩大,CSS代码的组织和维护变得越来越具有挑战性。开发者常常面临类名冲突、样式覆盖、代码难以维护等问题。为了解决这些问题,各种CSS命名规范和方法论应运而生,而BEM(Block-Element-Modifier)作为其中最流行和实用的方法之一,被越来越多的开发团队所采用。
接下来我就将带大家学习BEM命名规范,编写出更加模块化、可维护的前端代码。
BEM是Block(块)、Element(元素)、Modifier(修饰符)的缩写,是一种基于组件的Web开发方法论。它由Yandex团队提出,旨在帮助开发者创建可重用和可维护的代码结构。
BEM命名规范主要解决了CSS中的命名冲突和样式覆盖问题,通过明确的命名约定,使代码结构更加清晰,便于团队协作和项目维护。
Block是一个独立的组件,可以在项目中重复使用,且不依赖于页面上的其他组件。
命名规则:使用小写字母,多个单词之间用连字符(-)连接。
示例:
.header {}
.menu {}
.search-form {}
Block就像是一个独立的"积木",可以放置在页面的任何位置,并且保持其功能和样式的一致性。
Element是Block的组成部分,不能脱离Block单独使用。
命名规则:Block名称 + 双下划线(__)+ Element名称。
示例:
.menu__item {}
.search-form__input {}
.header__logo {}
Element就像是Block这个"积木"上的某个特定部分,它们共同构成了完整的Block功能。
Modifier用于定义Block或Element的外观、状态或行为。
命名规则:
示例:
/* Block修饰符 */
.menu--fixed {}
.button--large {}
/* Element修饰符 */
.menu__item--active {}
.search-form__input--disabled {}
Modifier就像是给"积木"或其部分添加特定的标签,表明它们处于某种特殊状态或具有特殊外观。
BEM命名方式直观地反映了HTML结构,使开发者能够通过类名就了解元素之间的关系。
<form class="search-form">
<input class="search-form__input">
<button class="search-form__button search-form__button--primary">搜索</button>
</form>
从上面的代码中,我们可以清晰地看出:
search-form是一个独立的块input和button是这个块的元素button有一个primary的修饰符BEM鼓励使用单一类名选择器,避免使用标签名和ID选择器,从而降低了CSS选择器的特异性,减少了样式冲突的可能性。
/* 不推荐 */
form.search-form > input[type="text"] {}
/* 推荐 */
.search-form__input {}
BEM的命名规则使得样式与HTML结构紧密关联,当需要修改某个组件时,可以很容易地找到相关的CSS代码。
BEM鼓励开发者以组件的思维方式构建界面,每个Block都是独立的,可以在不同的项目中重复使用。
以一个简单的导航菜单为例:
<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类名可能会变得很长,影响代码的可读性。
解决方案:
使用简短但有意义的Block和Element名称
考虑使用预处理器(如SASS或LESS)的嵌套功能来简化编写
&符号表示父选择器的引用,可以大大简化BEM风格的CSS编写:.card {
&__header { /* .card__header */ }
&__title { /* .card__title */ }
&__button {
/* .card__button */
&--primary { /* .card__button--primary */ }
&--secondary { /* .card__button--secondary */ }
}
}
当元素嵌套层级较深时,可能会出现命名困难的情况。
解决方案: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>
有时候很难判断应该创建一个新的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设计师、全栈开发者
原文链接: 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);
}
}
这种写法有多恶心?我来告诉你:
最要命的是,这个DataGrid会被频繁创建销毁(用户切换页面、筛选数据等),每次忘记清理就是一次内存泄漏。
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项目里,我封装了一个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应用开发者
原文链接: https://juejin.cn/post/7533150906670841906
原始摘要:
在前端异步编程中,Promise 的静态方法扮演着至关重要的角色。它们为我们处理多个异步操作提供了简洁而强大的工具,让复杂的异步流程变得清晰可控。本文将深入剖析 Promise 常用静态方法的实现原理,带你一步步手写这些方法,彻底掌握它们的工作机制。
Promise 对象提供了多个静态方法,这些方法都是直接通过Promise构造函数调用的,无需实例化。它们的主要作用是对多个 Promise 实例进行组合操作,简化异步流程控制。
最常用的 Promise 静态方法包括:
这些方法在实际开发中应用广泛,比如并发请求数据、设置请求超时、处理多个异步操作的结果等场景都离不开它们。
作为最基础的 Promise 静态方法,resolve和reject用于快速创建处于特定状态的 Promise 实例。
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()与resolve类似,但它返回的是一个处于 "已拒绝"(rejected) 状态的 Promise 实例。
Promise.myReject = function(reason) {
return new Promise((resolve, reject) => {
reject(reason);
});
};
注意reject方法不会像resolve那样检查参数是否为 Promise 实例,无论传入什么值都会作为拒绝原因。
Promise.all()是最常用的 Promise 组合方法之一,它接收一个 Promise 数组 (或可迭代对象),返回一个新的 Promise。当所有输入的 Promise 都完成时,新 Promise 才会完成,结果是一个包含所有完成值的数组;如果有任何一个输入的 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.race()的行为类似于 "赛跑",它接收一个 Promise 数组,返回一个新的 Promise。这个新 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 都 "落定"(settled),即无论是完成还是拒绝,都会等待所有 Promise 处理完毕。它返回的 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()与all相反,它等待第一个 "成功完成" 的 Promise。只要有一个输入的 Promise 成功完成,它就会用该结果完成;如果所有输入的 Promise 都被拒绝,它会用一个包含所有拒绝原因的AggregateError拒绝。
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'));
}
}
);
});
});
};
any和race都关注 "第一个有结果的 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 静态方法,我们深入理解了它们的内部工作机制:
掌握这些方法的实现原理,不仅能帮助我们更好地在项目中应用它们,还能提升我们对异步编程的理解。在实际开发中,选择合适的 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程序员、技术爱好者
原文链接: https://juejin.cn/post/7533109465492914186
原始摘要:
1. 从 “回调地狱” 到 Promise
在前端开发的异步编程领域,我们常常会遇到需要处理多个异步操作的情况。早期,使用回调函数来处理异步操作是一种常见的方式,但这种方式在处理复杂的异步流程时,会带来一个让人头疼的问题 —— “回调地狱”。
假设我们有这样一个场景:李华向他的众多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("李华,这辈子也就这样了");
}
)
}
)
}
)
}
)
这段代码虽然实现了我们的需求,但随着异步操作的增多,回调函数的嵌套会越来越深,代码会变得越来越难以阅读和维护。想象一下,如果这里有更多的文件需要读取,或者每个异步操作之间还有其他的逻辑,代码的复杂度将会呈指数级增长,这就是所谓的 “回调地狱”。
为了解决回调地狱的问题,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,这样就避免了回调函数的层层嵌套,使得代码的逻辑更加清晰,错误处理也更加统一。
在现代前端开发中,Promise 已经成为了处理异步操作的核心机制之一。无论是使用原生的 JavaScript 进行开发,还是使用各种前端框架(如 Vue、React 等),都离不开 Promise。掌握 Promise 的使用,不仅可以让我们写出更优雅、更易维护的异步代码,还能更好地理解和运用其他与异步相关的技术,如 async/await 等。因此,深入学习 Promise 是每一位前端开发者都必不可少的功课。
接下来,让我们深入了解 Promise 的基本概念和用法,看看它是如何工作的,以及如何在实际项目中灵活运用它来解决各种异步编程问题。
Promise 是 ES6 引入的一种异步编程的新解决方案,它是一个对象,代表了一个异步操作的最终完成(或成功)及其结果值。简单来说,Promise 就像是一个容器,里面保存着某个未来才会结束的事件(通常是异步操作)的结果。从语法上讲,Promise 是一个对象,通过它可以获取异步操作的消息,并且提供了统一的 API,使得各种异步操作都能用同样的方式进行处理。
Promise 有三种状态:
状态转换规则如下:
下面通过一个简单的示例来展示 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 传递过来的失败原因并进行错误处理。
then 方法是 Promise 中用于处理异步操作结果的核心方法之一,它允许我们在 Promise 状态变为 fulfilled 或 rejected 时执行相应的回调函数。
then 方法的一个重要特性是它返回一个新的 Promise,这使得我们可以进行链式调用。具体来说,then 方法接收两个可选参数:onFulfilled 和 onRejected。
当我们调用 then 方法时,它会返回一个新的 Promise,这个新 Promise 的状态和值取决于 then 方法中回调函数的执行结果:
通过这种方式,我们可以将多个 then 方法串联起来,形成一个链式调用,每个 then 方法处理前一个 Promise 的结果,并返回一个新的 Promise 供下一个 then 方法处理。
假设我们有一个需求,需要先获取用户信息,然后根据用户信息获取用户的订单列表,最后统计订单的总金额。使用 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 方法会捕获并处理错误。
catch 方法是 Promise 中用于捕获错误的方法,它是 then 方法的语法糖,用于简化错误处理。
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 方法捕获并处理。
在项目中使用 catch 方法进行错误处理时,有一些最佳实践建议:
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 方法中的回调函数都会执行,打印出 '数据加载结束',这样可以确保加载状态的显示与实际的异步操作完成情况一致。
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失败'。
在一个电商项目中,我们可能需要在商品详情页面展示商品的基本信息、评论列表和相关推荐商品。这些数据分别来自不同的 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 方法中统一处理错误。
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 方法,提示请求超时。
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 可以帮助我们统计出成功和失败的服务器更新次数,方便对整个批量更新操作的结果进行评估和后续处理。
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 错误,我们可以根据具体情况进行处理,比如提示用户获取偏好设置失败。
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 块会捕获到错误并进行处理。
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 function getUserAndOrders() {
try {
const user = await getUserInfo();
const orders = await getOrderList(user);
console.log(orders);
} catch (error) {
console.error(error);
}
}
getUserAndOrders();
可以看出,async/await 的写法更加简洁直观,代码结构更接近同步代码,阅读起来更容易理解。
在实际项目中,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 在实际项目中的应用场景和优势,它让异步编程变得更加简单和高效。
Promise 的核心是一个状态机,它的内部机制涉及到状态管理、任务队列以及微任务与宏任务的处理。
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 实现了异步操作的有序处理和回调函数的延迟执行,使得异步编程更加可控和可预测。
为了更深入地理解 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);
}
}
}
在这个实现中:
随着前端技术的不断发展,异步编程将继续在前端开发中扮演重要的角色。希望透过这篇文章让大家理解Promise,Promise 作为异步编程的基础,也将不断演进和完善。希望大家在今后的前端开发中,能够熟练运用 Promise,让我们的代码更加优雅、高效!如果大家在学习和使用 Promise 的过程中有任何问题或心得,欢迎在评论区留言交流,也可以前往我的github 网站查看更多关于 Promise 的内容。
如果您觉得这篇文章对您有帮助,欢迎点赞和收藏,大家的支持是我继续创作优质内容的动力🌹🌹🌹也希望您能在😉😉😉我的主页 😉😉😉找到更多对您有帮助的内容。
AI增强摘要:
这篇文章深入探讨了前端开发中Promise的重要性及其应用。从回调地狱的问题出发,详细介绍了Promise如何通过链式调用解决异步编程中的复杂性和可读性问题。文章不仅解释了Promise的基本概念、三种状态(Pending、Fulfilled、Rejected)及其转换规则,还通过实例展示了Promise的核心方法(then、catch、finally)的使用场景和最佳实践。此外,文章强调了掌握Promise对于现代前端开发者的重要性,以及如何在实际项目中灵活运用Promise来处理各种异步编程问题。
内容分类: AI工具使用教程与技巧
适合人群: 前端开发者、JavaScript程序员、全栈开发者
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章提供了验证的步骤,包括点击视频、小程序、点赞或取消点赞、在看或取消在看等操作。这些步骤旨在确保用户身份的真实性和安全性,防止自动化脚本或机器人的滥用。核心观点是通过简单的用户交互验证来维护平台的安全和秩序。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、安全工程师、技术爱好者
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章可能探讨了网络安全、用户验证流程的重要性,或是如何在异常情况下保护用户数据和服务的稳定性。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全专家、IT管理员、技术爱好者
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具滥用。文章可能探讨了网络安全、用户验证流程的重要性,或是如何在异常情况下保护用户数据和系统安全。核心观点可能集中在如何有效实施验证流程以平衡安全性和用户体验。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全专家、系统管理员、技术爱好者
原始摘要:
AI增强摘要:
文章内容似乎涉及到一个环境异常的情况,提示用户需要完成验证才能继续访问。这可能是一个网络安全措施,旨在防止自动化工具或机器人的滥用。文章还提到了视频、小程序以及点赞和在看的功能,暗示了这可能是一个社交媒体或内容分享平台上的通知或提示。核心观点可能是关于平台安全性和用户互动的平衡,关键洞见在于如何在不影响用户体验的前提下实施有效的安全验证。
内容分类: AI工具使用教程与技巧
适合人群: 社交媒体用户、内容创作者、网络安全爱好者
原始摘要:
修图界的AI应用工厂
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者
原始摘要:
小八怎么跳到我杯子里了😮 (画面由AI生成,仅供娱乐)
这里附上图生视频提示词参考: 电脑屏幕上一个可爱的卡通人物套着游泳圈游泳,从屏幕跳出来,跳到人手拿着的水杯里,溅起水花和浪花,保持微笑的表情,展现了一幕虚实交融的奇妙瞬间。 制作工具:通义万相 体验地址: https://tongyi.aliyun.com/wanxiang/explore
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一过程可能涉及视频或小程序的互动,如点赞或取消点赞、在看或取消在看等操作。文章核心在于提醒用户注意环境异常,并指导用户如何通过简单的互动操作来完成验证,确保服务的连续性和安全性。
内容分类: AI工具使用教程与技巧
适合人群: 互联网用户、技术支持人员、网站管理员
原始摘要:
新榜出品
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。验证过程可能包括点击验证按钮、观看视频、使用小程序或进行点赞等互动操作。这些步骤旨在验证用户的人类身份,而非自动化程序。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、普通互联网用户
原始摘要:
通用Agent落地失败的核心在于“毛坯房逻辑”
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动功能如点赞和在看的操作方式。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网站管理员、网络安全专家
原始摘要:
技术卡位 vs 用户需求,谁优先?
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看功能的互动提示,表明内容可能涉及用户互动或社交媒体功能的使用。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网络安全专家、社交媒体管理员
原始摘要:
北京大学工作人员回应称,感谢网友提出的建议,将及时向学校招生办反映相关情况,后续将研究如何改进。
AI增强摘要:
当前环境出现异常,用户需要进行验证以继续访问。此提示可能涉及网络安全措施,旨在防止自动化工具或恶意软件的滥用。用户需完成简单的验证步骤,如点击按钮或解决验证码,以确保其为真实用户而非机器人。这一机制常见于高流量或敏感操作的网站和应用中,以保护系统安全和用户体验。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网站开发者、普通互联网用户
原始摘要:
“到底还有没有牌子能放心吃啊”。
AI增强摘要:
当前环境异常,完成验证后即可继续访问。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者
原始摘要:
《涌现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
原始摘要:
突然想到很多爆款视频是:如果和10年、20年前的自己对话,你会说什么?
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动(如点赞和在看)的即时反馈机制。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、技术爱好者
原始摘要:
你是不是每天也在用这样的方式,PUA你的大脑?
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户的安全访问或防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看功能的互动方式,暗示了内容可能涉及社交媒体或在线平台的用户交互和安全措施。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网络安全专家、社交媒体管理员
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章可能探讨了网络安全、用户验证技术或是应对网络异常的策略。核心观点可能集中在如何有效进行用户验证以保障平台安全,同时提升用户体验。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全专家、网站管理员、技术爱好者
原始摘要:
AI增强摘要:
当前环境异常,需要完成验证后才能继续访问。这可能涉及到网络安全措施,如防止自动化攻击或验证用户身份。文章内容提示了通过视频或小程序进行验证的可能性,并提到了点赞和在看的功能,暗示了社交互动或内容分享的环节。核心观点在于强调在当前网络环境下,验证过程的重要性以及社交互动的便捷性。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网络安全爱好者、社交媒体用户
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户的互动体验,同时提供了便捷的操作方式。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、产品经理、用户体验设计师
原始摘要:
真正的「高段位」
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户的安全访问或防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的便捷性。
内容分类: 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 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
原始摘要:
AI增强摘要:
该文章内容似乎涉及到一个环境异常的通知,提示用户需要进行验证以继续访问。这可能与网络安全、用户认证或系统访问控制相关。核心观点在于强调在当前环境下,完成验证是继续访问的必要步骤,反映了对安全性和用户身份验证的重视。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全专家、系统管理员、IT支持人员
原始摘要:
网页是品牌构建的第一步,也是对用户的主动筛选。
AI增强摘要:
文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。这可能是一个网络安全措施,旨在保护用户免受潜在的网络威胁。核心观点在于强调在当前网络环境下,验证过程的重要性,以确保访问的安全性和连续性。关键洞见可能包括对网络安全措施的重视,以及用户在面对此类提示时应采取的适当行动。
内容分类: AI工具使用教程与技巧
适合人群: 网络用户、IT安全爱好者
原始摘要:
来听听三位创业老司机带来了哪些深度洞察。
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一过程可能涉及视频验证或小程序互动,如点赞或取消点赞、在看或取消在看等操作。文章核心在于指导用户如何应对环境异常情况下的验证流程,确保顺利访问所需内容。
内容分类: AI工具使用教程与技巧
适合人群: 普通互联网用户、技术支持人员、网站管理员
原始摘要:
热门岗位招聘中RECRUITMENT WORK各位小伙伴大家好,最近我们的老朋友 Stripe 、小宿科技、
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了当前网络环境的安全验证机制和社交媒体互动功能的便捷性。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、社交媒体用户
原始摘要:
你从小用到大的国产软件这次给友商打了个样
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章可能探讨了网络安全、用户验证流程的重要性,或是如何在异常情况下保护用户数据和系统安全。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全专家、系统管理员、技术爱好者
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的简便性。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全爱好者、普通互联网用户
原始摘要:
她还真没忘了自己姓啥
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章内容简短,主要围绕环境异常和验证流程展开,强调了验证的必要性和操作步骤。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、安全专家、普通网民
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化脚本或恶意软件的滥用,确保平台的安全性和稳定性。用户可能会遇到视频、小程序等内容无法正常访问的情况,需要通过点赞或取消点赞等互动操作来完成验证。
内容分类: AI工具使用教程与技巧
适合人群: 互联网用户、网站管理员、网络安全爱好者
原始摘要:
微信读书 App 近期更新了“自动翻页”功能,引入了“划线导读”功能,就是在自动阅读的过程中用划线样式显示当前正在阅读的句子。
包括《如何阅读一本书》在内的诸多权威经典都曾指出过,阅读过程中的眼神飘忽是导致阅读速度慢的一个重要原因,并提出了“指读法”可以有效缓解眼神飘忽的问题并提升阅读的速度。
传统的指读法就是通过手指在书籍或屏幕上移动来实现,我在屏幕上阅读时更容易眼神飘忽,尤其是在大屏显示器上,特别是在排版的行间距较矮时最明显。
有了微信读书的这个“划线导读”功能就相当于自动实现了“指读法”,怎能不给个赞呢。
多年前我就开发了微信读书与 Anki 的一套流程,通过复习把新知变成已知,把当时理解变成将来也能理解。提升知识留存率的同时,也因长时记忆中相关知识的增多而提升了理解能力。搜过往文章或选择最近更新的视频课程便可了解具体用法。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章简要提到了验证的必要性,并提供了完成验证的指引。此外,还涉及了视频小程序中的点赞和在看功能,提示用户可以通过轻点两下来取消这些操作。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网站管理员、网络安全专家
原始摘要:
我们都曾在凌晨两点还坐在艾泽拉斯的月光下,刷着一遍又一遍《魔兽世界》的副本;或者在《巫师3》的大地上,为寻找一
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或机器人的滥用,确保服务的正常运作和用户体验。文章提醒用户进行验证操作,并提供了简单的互动选项,如点赞和在看,以增强用户参与感。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全爱好者、普通互联网用户
原始摘要:
如果你和我一样,在豆瓣上给电影打分已经成了一种生活习惯,或许你早已积累了一份“五星片单”私藏宝库。
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户的互动体验,同时提供了便捷的操作方式。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、产品经理、用户体验设计师
原始摘要:
美国短篇小说之王欧·亨利,用幽默、机智与温情,构筑出一个个小人物的真实世界。他的作品往往篇幅不长,却总能在结尾一击致命,令人莞尔又沉思。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户的安全访问或防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看的功能,这些互动元素可能用于增强用户参与度或内容筛选。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、普通互联网用户
原始摘要:
最近在玩网易云音乐的时候,注意到一个有趣的限时小功能:“复制DeepSeek锐评指令”,可以解析你最近100首
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。验证过程可能包括点击验证按钮、观看视频或使用小程序等互动方式。此外,内容中提到的点赞和在看功能,允许用户通过轻点两下进行互动,这种设计旨在提升用户体验和互动性。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、用户体验设计师
原始摘要:
今天立秋。秋天并不如人们所说,在一夜之间到来。立秋时节天气依然炎热多雨,花草树木依旧繁茂,看不见一丁点秋意,感觉是夏天仍在无尽延续。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提到了通过视频、小程序等多媒体方式进行验证,以及点赞和在看等社交互动功能,这些都可能作为验证的一部分或是增强用户参与度的策略。核心观点在于通过多层次的验证和互动机制,既保障了平台的安全,又提升了用户的参与感和互动性。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网络安全专家、产品经理
原始摘要:
这两年我有种感受正变得越来越清晰,渐渐朝着一个想法蜕变。那就是在绝大多数时候,人对于世界,对于他人是无能为力的,它们总是在自己的控制之外,总是在自己的意愿之外。
AI增强摘要:
当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者
原始摘要:
很多读者可能会很失望,因为他们来到这里想要搜索我对当下热点问题的文章却没有结果。还有的读者留言说:请问你对 XX 事件的看法是什么?
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代数字平台对用户互动行为的即时反馈和调整机制,强调了用户体验的便捷性和互动性。
内容分类: AI工具使用教程与技巧
适合人群: 数字平台用户、内容创作者、用户体验设计师
原始摘要:
我听到一个很奇怪的说法:租房没有尊严。
AI增强摘要:
当前环境出现异常,用户需要进行验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。验证过程可能包括点击验证按钮、输入验证码或完成其他形式的身份确认。此外,内容中提到了视频和小程序的互动功能,如点赞和在看,这些功能允许用户通过简单的操作表达对内容的喜好或关注,同时也提供了取消这些操作的便捷方式。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、普通互联网用户
原始摘要:
上个月 23 号我出过一次门,然后就在家里待到了今天。回想刚来到北京的时候,拿了工资掰着手指头算账,其中有一笔交际费总是令我皱眉。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化脚本或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动功能如点赞和在看的使用说明。核心观点在于强调安全验证的重要性和用户互动的便捷性。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、安全工程师、普通用户
原始摘要:
从数据上来说,这是非常惨淡的一个月,我全靠蹭脱不花和李笑来的流量熬着。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代数字平台对用户互动行为的即时反馈和调整机制,强调了用户体验的流畅性和互动性。
内容分类: AI工具使用教程与技巧
适合人群: 数字产品设计师、用户体验研究人员、小程序开发者
原始摘要:
封面人物:特朗普和鲍威尔
AI增强摘要:
文章内容似乎涉及到一个环境异常的情况,提示用户需要完成验证后才能继续访问。这可能是一个技术性或安全性的提示,旨在保护用户数据或防止自动化攻击。核心观点是强调在当前网络环境下进行验证的重要性,以确保访问的安全性和连续性。关键洞见可能包括对网络安全措施的简要讨论,以及用户在面对此类提示时应采取的步骤。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、IT安全专家、普通互联网用户
原始摘要:
微软旗下 AI 编程助手 GitHub Copilot 累计用户数已达 2000 万。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保用户身份的真实性或防止自动化工具的滥用。文章可能探讨了网络安全、用户验证技术或是应对网络异常的策略。核心观点集中在如何通过简单的验证步骤来恢复访问权限,强调了安全验证在保护用户数据和防止未授权访问中的重要性。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全爱好者、IT专业人员、普通互联网用户
原始摘要:
专为出海互联网人打造的资讯周报。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具的滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户的互动体验,同时提供了便捷的操作方式。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、产品经理、用户体验设计师
原始摘要:
这些问题都迫切需要得到关注。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化脚本或机器人的滥用,确保服务的正常使用。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动(如点赞和在看)的轻点两下取消功能,这些细节强调了用户体验和互动性的重要性。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、用户体验设计师
原始摘要:
那我国有多少种蚊子?
AI增强摘要:
当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者
原始摘要:
我们欢迎更多线索
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了用户互动功能,如点赞和在看,这些功能的轻点两下取消设计旨在减少误操作,提升用户交互的准确性。
内容分类: 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, 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
原始摘要:
解释一下,今天港股和南下资金的大幅背离
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提到了通过视频或小程序进行验证的选项,以及点赞和在看功能的互动提示,这些功能旨在增强用户的参与感和互动性。
内容分类: AI工具使用教程与技巧
适合人群: 网站管理员、网络安全专家、普通互联网用户
原始摘要:
聊聊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
原始摘要:
对普通的个人投资者的建议,只有5个字
AI增强摘要:
文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。这可能是一个技术性或系统性的提示,涉及到网络安全或用户验证流程。核心观点在于强调在当前环境下完成验证的重要性,以确保访问的连续性和安全性。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网络安全专家、系统管理员
原始摘要:
除了两个利空以外,也聊一些正能量
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,这些互动功能允许用户通过简单的操作表达对内容的喜好或关注。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网络安全爱好者、社交媒体用户
原始摘要:
去年法拍房的数量是75万套,今年估计超过100万套,即使法拍房价格是市场价的一半,实际成交并不高,大量房屋砸在银行手里,拉低了整个市场的价格
AI增强摘要:
当前环境出现异常,用户需完成验证以继续访问。此提示可能涉及网络安全措施,旨在保护用户数据和防止自动化攻击。核心观点强调了验证过程的重要性,以确保环境安全性和访问的合法性。关键洞见在于理解此类安全提示的普遍性和必要性,以及它们如何帮助维护网络环境的健康。最实用的技巧是遵循提示完成验证,以确保无缝和安全地继续访问所需内容或服务。
内容分类: AI工具使用教程与技巧
适合人群: 网络用户、IT安全爱好者、网站管理员
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代网络环境中用户交互的便捷性和即时性,同时也展示了平台对用户行为数据的实时监控和反馈机制。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、产品经理、用户体验设计师
原始摘要:
红缨子“519”第七代高粱种的生育期大幅缩短至118天,株高显著降低至210.10厘米,更矮壮、更抗倒伏完美适配机械化收割需要,亩产提升至367.55公斤,支链淀粉含量达到99%,单宁含量降至1.37%。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能还提到了通过视频或小程序进行验证的方法,以及用户互动功能如点赞和在看的操作方式。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网站管理员、网络安全专家
原始摘要:
越是努力生产产品,售价反而越低,利润越微薄。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这反映了现代网络环境中用户交互的便捷性和即时反馈的重要性。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网站开发者、用户体验设计师
原始摘要:
平台提供补贴,本质是争夺用户和市场份额,这种行为过去有,未来还会存在。需要认识到,合理的竞争并不需要干预,而“内卷式”的恶性竞争,必须予以规制,预防“烧钱圈地割韭菜模式”反复重演
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提醒用户进行验证,并提供了取消点赞和在看的操作指南,强调了用户交互的便捷性。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网站开发者、普通互联网用户
原始摘要:
自2023年至今,中国香港特区GDP已连续10个季度录得增长,但不少当地居民似乎感受不到经济增长带来的好处,总就业人数仍在不断减少。有分析认为香港近年经济增长的动力,主要来自对外货物贸易和金融活动,并未直接带来新增的就业机会
AI增强摘要:
当前环境检测到异常活动,用户被要求完成验证以继续访问。这一机制旨在保护系统安全,防止自动化工具或恶意软件的滥用。验证过程简单快捷,用户只需按照提示操作即可恢复正常访问。此外,平台提供了视频和小程序等多媒体内容,用户可以通过点赞或在看等互动方式表达对内容的喜爱或关注,这些互动也可以轻松取消。
内容分类: AI工具使用教程与技巧
适合人群: 互联网用户、网站管理员、网络安全爱好者
原始摘要:
截至2024年末,全国消费金融公司贷款余额达1.35万亿元,同比增长16.66%,增速较2023年的38.2%大幅下降;蚂蚁消金信贷业务余额3108.48亿元,同比增长36.92%
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网络安全爱好者、普通互联网用户
原始摘要:
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
原始摘要:
最近文章更新的少, 播客方便更坦诚、全面的表达自己。
感谢老钱接受邀请, 借播客自述和传播趋势交易的理念。
希望进一步关注趋势动物内容的, 可关注趋势动物pro小程序和@趋势小程序说明书。
Nick 2025/8/5
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。这些功能设计旨在提升用户体验和互动性。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网络安全爱好者、社交媒体用户
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提到了通过视频、小程序等方式进行验证,同时也涉及了点赞和在看功能的互动,暗示了内容可能涉及社交媒体或在线平台的用户互动和安全验证流程。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网络安全专家、社交媒体管理员
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章提醒用户进行验证,并提供了简单的操作指南,如轻点两下取消赞或取消在看,这些操作可能是为了优化用户体验或减少误操作。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网站管理员、用户体验设计师
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了确保网络安全或防止自动化攻击。文章简要提到了视频和小程序的功能,如点赞和在看,这些互动功能允许用户通过轻点两下来取消操作,提供了用户友好的交互体验。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网络安全爱好者、小程序开发者
原始摘要:
AI增强摘要:
当前环境出现异常,用户需完成验证以继续访问。此提示可能涉及网络安全措施,旨在保护用户数据和系统安全。核心观点在于强调验证过程的重要性,以确保环境的正常运作和用户的安全访问。关键洞见包括识别异常环境的能力和采取相应措施的必要性。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、IT安全专家、普通互联网用户
原始摘要:
幻想明星的人生高开低走,是咱儒家社会需要的内在的秩序感,即跨越阶层一定靠的读书、勤奋,其他富贵都是必有灾殃的。
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.
原始摘要:
武大这个事儿,拱火拱的,顾头不顾腚。先讲一个冷知识:在无人注意的场合,2024年的离婚/结婚对数之比,新高了。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具滥用。文章简要提到了视频和小程序的功能,包括点赞和在看的功能,用户可以通过轻点两下来取消这些操作。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网站管理员、网络安全专家
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或恶意软件的滥用,确保平台的安全性和稳定性。用户可能会遇到需要点击验证按钮或完成其他形式的验证步骤,以证明其为真实用户而非机器人。此过程虽然可能带来短暂的不便,但对于维护网络环境的健康和安全至关重要。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、安全专家、普通互联网用户
原始摘要:
当然也是有一点的,但不多。为啥?
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问安全或防止自动化工具滥用。文章简要提到了视频和小程序的功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网络安全专家、普通互联网用户
原始摘要:
福斯特:股东拟减持不超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
原始摘要:
从前年8月收到老宅拆迁的正式通知,11月收到拆迁款,直到上周收到最后的尾款,整整历时两年。
AI增强摘要:
当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者
原始摘要:
志高机械,一签门槛终于能降低点了上周长江电力计划花266亿修航运工程,貌似不会带来什么盈利周末,中国神华停牌了
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化脚本或恶意软件的滥用,确保平台的安全性和稳定性。文章强调了验证的重要性,并提供了简单的操作指南,如轻点两下取消赞或在看,以优化用户体验。
内容分类: AI工具使用教程与技巧
适合人群: 技术爱好者、网站管理员、网络安全专家
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要通过完成验证来恢复访问权限。这一机制可能是为了防止自动化工具或机器人的滥用,确保平台的安全性和用户体验。文章可能探讨了网络安全、用户验证技术或是平台管理策略,旨在提供一个安全、公平的网络环境。
内容分类: AI工具使用教程与技巧
适合人群: 网络安全专家、平台管理员、技术爱好者
原始摘要:
今天看山鹰的公告,他们把股票名称从山鹰纸业改名山鹰国际。其实纸业挺好的,一看起码知道是什么公司,改成国际不知为什么。
AI增强摘要:
当前环境出现异常,用户需完成验证以继续访问。此提示可能涉及网络安全措施,旨在保护用户数据和防止自动化攻击。完成验证后,用户可恢复正常访问权限。此过程强调了网络安全的重要性以及在异常情况下采取的必要步骤。
内容分类: AI工具使用教程与技巧
适合人群: 网络管理员、网络安全爱好者、普通互联网用户
原文链接: https://juejin.cn/post/7534578384338042914
原始摘要:
《匠心千游》 是一款 休闲益智小游戏集。目前已上架微信小游戏,未来发展较好的话,会考虑基于 Flutter 完成全平台应用。经历了三周的业余时间打磨,目前已经完成 23 个经典小游戏的集成。而程序包的总大小仅为 884KB,这足以见得,目前项目中没有引入任何游戏引擎,是纯 Canvas 绘制的小游戏。
而完成这些小游戏的过程中,我
没写任何代码,都是通过自然语言的描述,让 AI 编写的。
| - | - |
|---|---|
AI 让我这个 Flutter 开发者,在完全不懂微信小游戏开发的情况下。创作了一个产品,并上架成功、接入广告,每天还有点小收益。确实不得不感慨 AI 时代对传统编程的冲击。它可以大大提升你的能力上限,让之前很多有心无力的想法,得以通过任何形式落地。
在不远的将来,并不缺乏实现想法的手段。缺乏的是想法本身。
感兴趣的朋友,可以在微信或QQ 的小游戏中搜索 匠心千游 体验~
记得小时候,手机还是数字按键的时代。五子棋、象棋、数独、打靶、贪吃蛇等小游戏,曾丰富了我的童年时光,玩累了歇一歇也没什么负担。而现在的小朋友都开始玩,那些打打杀杀的刺激游戏,抽皮肤、氪金、买礼包,每日任务眼花缭乱,摸到手机后就停不下来。
另外,现在想在手机上找到纯净版的休闲益智小游戏,可以说非常困难,更不用说高质量的合集了。广告充斥着游戏的各个环节,对游戏的侵扰、公平性带来了非常大的影响。游戏本来是用来放松的,现在反而成了负担。
其实接广告也无可厚非,毕竟开发维护,也需要开发者的时间、精力、金钱来维护。只是平衡点非常重要,匠心千游中也有广告,但是:
[1]. 广告默认关闭,对匠心千游支持的朋友可以手动开启。
[2]. 匠心千游中的游戏,都会为广告留下空白区域。保证广告不影响游戏体验。
| - | - |
|---|---|
因为这些游戏是 AI 编写的,所以维护它,我来说也不会花费很多精力。所以对于广告收益来说,只是锦上添花。匠心千游的初心是:
让游戏回归游戏,让经典的智慧与策略得以传承。
回归游戏本质
游戏就是游戏,不需要那么多花里胡哨的东西。五子棋就是五子棋,象棋就是象棋,让用户专心享受游戏的乐趣,而不是被各种干扰打断。
收集真正的经典
什么是经典游戏?就是那些几十年甚至上百年来一直有人玩的游戏。五子棋、象棋、数独、扫雷...这些游戏之所以能传承至今,就是因为它们的玩法经过了时间的检验。
之前在玩 Flutter Flame 游戏开发时,就有意项去做一个游戏盒子,收录经典的休闲益智游戏。但是后面工作比较忙,还有一些别的计划,就搁置了。
可能有人会疑问,既然会 Flutter Flame ,为什么你不用 Flutter 做全平台应用?
怎么说呢,现在客户端应用即使开发出来了,对于个人开发者来说,上架也非常麻烦。即使上架,分享和宣发也是个大问题。倒不如基于腾讯微信的生态,先用微信小游戏试试水。而且休闲小游戏,并不太吃性能,微信小游戏也够丝滑了。如果未来 匠心千游 发展良好的话,再考虑基于 Flutter 做客户端也不迟。
当接触到 AI 编程后,我感觉我的想法可以落地了。开始让 AI 从一个空白文件夹,尝试编写第一批游戏。当时的心里预期是完成基本的玩法,界面上不追求太好看,下面是最初版本的样子:
| 初版·游戏中心 | 初版·五子棋 | 初版·中国象棋 |
|---|---|---|
五个小游戏大概花了三天晚上就搓出来了。也就在这个版本,我提交了第一次审核。代码会审核很快就过了。但离上架还很远呢~
| 初版·游戏中心 | 初版·五子棋 | 初版·中国象棋 |
|---|---|---|
微信小游戏必须进行备案, 接下来就是非常漫长的备案和审核阶段。提交信息、初审、提交管局审核,一共前后花了近一个月。整体来说还是很顺利的,只是需要耐心等待。填写备案资料时真的非常随意,就这几个界面随便写写都没问题 😂
备案审核整个过程,不会有电话回访。
微信认证时,会有微信委托的三方机构,核对一些信息。
| 通过初审 | 通过备案 |
|---|---|
在审核过程中,我也没闲着。希望面相用户的第一版就相对完整,于是继续增加经典的棋类游戏,比如国际象棋、跳棋、斗兽棋等。并且统一了游戏控制面板的表现,看起来像那么回事了。
| 国际象棋 | 跳棋 | 斗兽棋 |
|---|---|---|
接下来继续完成了 2048、拼图、蜘蛛纸牌,三个相对复杂的游戏。此时已经集成了十几个游戏,游戏列表也成了宫格表现。它就像一个 种子 一样, 发芽生长,然后长出一节节的枝干,逐渐繁茂。模块化的开发使得 AI 可以独立开发单个游戏,最后在进行集成,从而避免上下文过多而引发的混乱。
| 2048 | 拼图 | 蜘蛛纸牌 |
|---|---|---|
AI 令我惊艳的瞬间有很多,比如让它实现五子棋的人机对战。然后就得到了我下不赢的五子棋了。另外,最近实现的 消灭星星、七彩连珠 和 炮击砖块 三款小游戏,是相对来说比较复杂的。AI 也可以轻松把握,如果让我自己纯手写,两个星期估计都搞不定,而通过 AI 半天就完成了。
| 消灭星星 | 七彩连珠 | 炮击砖块 |
|---|---|---|
当有了想法,AI 编程从无到有,可以迅速落地。很多人问问你用什么 AI 来做的。其实我并不想打谁的广告。目前市面上的 AI 编程编程工具有很多,关键是谁用,而不是用谁。Trae、Cursor、Kiro 等都是优秀的编程工具。
但永远不要忘记,人是永远在 AI 编程中起到主导作用的,只是角色由编码者,变成了设计者。小马过河的故事告诉我们,水是深是浅,自己试试就行了。找到合适自己的工具,去拓展自己的能力。
在朋友圈和群聊中分享后,感谢大家的支持,目前注册用户的数量已经快 700 人了:
也顺利地接入了流量主,目前每天够喝瓶可乐了,美滋滋~
对应匠心千游,我是有自己的规划的,目前先聚焦前两个阶段。其中第一阶段的上架和集成广告已经完成了。接下来是聚焦完成 30 个小游戏。目前已经有 24 个了,还要几个已经在准备中了,第一阶段应该可以顺利完成。
第一阶段完成后,我将聚焦后端相关的事宜,让单机游戏有成为联机的可能性。同样整个过程都会通过 AI 来编写代码。后端打算采用 Rust 进行开发,因为目前我已经有了一套相对稳定的 rust 服务端项目。第二阶段的终点是完成微信认证,实现游戏排行榜功能。
从一个简单的想法,到一个有 700+ 注册用户、接入广告的小程序,《匠心千游》的整个开发过程对我来说是一段非常有价值的体验。
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 他们的重点都是如何让不同技术栈的项目融合在一起看着像一个项目,这些方案更多的精力就是在解决不同类型的项目融合在一起后如何进行项目之间的隔离,防止不同的技术栈融合在一起后带来的相互影响的问题,如下图。
满帮的集团的Web项目因为在最初项目大量爆发之前就提供了统一的项目摸版和脚手架,虽然创建了很多项目,但是每个项目基本上技术栈,项目结构,都是差不多的,所以满帮的Web项目历史负债相对较少,业界的微前端方案解决多个不同技术栈融合到一起的述求在公司没有太多团队有,所以虽然初期在微前端方案被业界提出的时候,公司内部个别团队在案这个方向探索,但是业界这套微前端方案最终没能在公司更广的铺开,核心还是没有足够的场景。
我们结合满帮集团项目的特点以及我们实际面对的要解决的问题,最终满帮微前端方案落地后的整体架构如下。
可以看到我们相比行业内的微前端架构在公共能力层做的更加的深入,这得益于满帮的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左右。当时每天都定这个这个统计数据看。
上图是我们的web项目在android平台的一个FCP的时间平均值分布图,核心四部分
我们如果想进一步优化,我们想着要做到极致,那就只能把除了业务逻辑之外的内容全部提前运行,结合以前积累的一些优化方式,以及满帮已有Web项目的特点(基础能力基本无差别),我们不仅仅需要提前启动一个webview容器,还得把一个项目基础的能力都提前运行起来。这样通过空间换时间的方式,在业务页面打开的时候,使用已经执行基座的webview容器来加载业务代码运行渲染页面,这样大大加快页面打开速度。
按这个想法我们需要进行web端项目和native项目进行改造
上面是改造之前3个前端项目打包后的产物,包含html入口文件,公共的资源库,以及每个页面的js逻辑代码。如果一个公司里面按照公司的标准规范统一创建的项目,那么大多项目引入的公共资源库在每个项目里面都是一样的。 既然每个项目依赖的公共资源都一样,那我们是否可以想个办法把公共的东西当作一个项目,这个项目根据url的信息,动态加载对应url页面的js来运行,最终渲染页面,按这个想法我们调整了一下架构如下图。
可以看到我们把公共的依赖资源抽离成一个单独的项目,暂且叫做 微前端框架 。通过 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,直接执行。体验上是非常快的。
有想法了。接下来就是找客户端兄弟配合做细节完善了。走找客户端兄弟去。
客户端要做的事不复杂,直接上图,主要关注的问题如下
具体我们内部的流程如下。
App启动就初始化一个微前端容器,容器的html加载完,并且js逻辑执行完后会告诉客户端该微前端容器可用了。这个时候如果App接收到打开一个微前端页面,那么客户端会进过一系列逻辑判断后,给微前端容器发送打开的url信息,并把该微前端容器显示出来。
该微前端框架项目收到客户端的url后,解析url里面的hash,判断是打开什么项目的什么页面,然后在配置里面去加载该页面的js,加载完后执行,并渲染页面,当一个微前端容器使用后又接着初始化一个微前端容器,方便下次使用。
热门活动页面打开的效果图 (测试机型 小米6 普通机器)
在2021年3月我们通过已有的效果推动了公司的7-8个核心项目按这套方案进行了适配,整体的效果在Web前端团队内部还是比较认可的,除了对项目的改造有一些成本外,其他的评价都是比较正向的,这就是满帮微前端架构的雏形形成,叫做满帮微前端方案名字是并不是很贴切,但是又没有更合适的名字了,也就没过于纠结,就叫满帮微前端了。
在2021年3月后一方面继续完善微前端方案,一方面推动更多项目接入,虽然陆陆续续有新的项目接入微前端方案,但是微前端的项目占比一直维持在5%左右,只有1/4的团队了解和使用了微前端方案,无法成为事实上的标准。回头看主要原因是迁移存在成本,业务团队效率优先,无法强力约束
微前端和普通项目存在差异,老项目的迁移成本取决于和微前端基座差别的大小,伴随着满帮融合,以及大多项目在业务团队后,每个项目发展节奏不一致带来和很多差异,这些差异和基础的项目随着这几年积累越来越大,这导致了能平滑迁移的项目很少,大多项目迁移差不多就是新开发。所以这套方案也是更适合新项目的优先选择,老项目基本上就没怎么迁移了
对于2021年虽然体验在一些团队会优先考虑,但是大多团队第一优先级还是确保业务的完成,对Web项目体验会相对原生有差异也是共识的,都是一些非核心场景使用H5选型,所以对于H5的体验不是第一优先级考虑的。这也导致在和业务方商量迁移老项目的时候业务方大多都会因为迁移后涉及到的功能回归对研发,测试都是有很大的投入,而这些投入目前无法满足业务需求从而无限的推迟。
在2021年整个前端行业还处于发展阶段,很多新技术出现,很多新组件出现,尽管每个团队的成员不同,但是他们都想着是在项目中尝试新的技术来解决自己团队的问题,而作为Web基础也没能找到一种能实际约束和规范各个业务项目的发展方向,虽然尝试过定规范,提供脚手架,统一摸版等等手段,但项目一旦到了业务团队,在不断地处理各种业务的实际问题过程中,项目就和原来的摸版慢慢有了差异。 还有一个和公司发展阶段相关事件导致了这件事纯技术侧很难统一,那就是在2021年中,公司人员规模快速扩张加入很多人员,每个人员都希望做出不一样的东西,很多需求明确就要求不要和别的系统一样,各自为阵,不会第一优先考虑是否能复用,这也导致了出了很多新东西。
正是因为这些原因,虽然能微前端方案能带来Web页面的秒开体验,但是那个时间阶段秒开这件事并不是每个团队都优先考虑的,接入的动力一直不足,这个不温不火的状态一致维持了一年多。
转折点在2023年1月,几年快速的割裂的发展,大前端产生了很多相似的东西,比如App页面技术选型有原生,ReactNative,Flutter,Thresh,Web。很多一线研发非常痛苦,团队效率低,恰逢在这个时间点满帮大前端为了解决前端研发技术栈碎片化问题确定了未来大前端整体的架构方向如下图。这次确定了未来前端的项目一次编写,多平台输出,确定了App端内页面高性能的Thresh,以及非核心场景的H5技术栈,并且最为重要的就是这里的H5默认就是微前端。
在这大方针确定下,加之配合强力的项目准入申请制度,确保新的项目全部的按统一标准来,同时微前项目因为又在统一的基座上运行,进一步的加强了项目到业务团队后还能按照统一的标准发展,降低未来割裂的速度,回头看这件事的最终落地除了我们有不断的技术追求外,还需要贴合公司的发展阶段,快速发展阶段鼓励创新推动统一那就逆流而上,稳定阶段重视效率推动统一那感觉就是顺水推舟。
经过2022年一年的时间,对于移动端的项目基本上已经确定未来最佳实践的方式,这个时候回看PC端的项目,还有很多需要优化的空间。 2023年2月我们在做年度规划的时候定的大方向就是要解决中后台研发效率的问题。那时候中后台面临两个主要的效率问题,规范无法统一和基础能力覆盖慢
团队内部每次讨论结论都是要提效,首先的统一规范,虽然这几年一直在尝试统一规范,但在实际过程中发现很难推动,很多时候不仅仅是技术上的问题, 更多的是因为公司在高速发展过程中,处于其中的人或者系统各自有不同的惯性,时间会慢慢放大这些系统和人的差异,如果没有很好地机制来调节各个系统的惯性,那么在时间的积累过程中所有系统就会越来越难统一,比如我们经常提到的设计规范,编码规范,组件规范。
规范统一简单,我们只需要敲定一个规范后面按这个规范来就行,但是如何保障这个规范在未来可持续的统一需要我们更多的思考,我们需要一种能长期管控的方式,而不是简单的规范。
2022年集团发展过程中做了很多埋点对齐,合规,风控,权限多方面的基础能力治理,这些治理过程中涉及到了公司全部的中后台系统,拿埋点库的升级来说,集团500多个项目依赖埋点库,日常使用的150个,每次埋点库的升级,功能的修改都需要联系同步所有后台的负责人,需要他们配合,可能需要调整,可能需要回归,一方面基础库负责人很难快速覆盖基础能力到各个系统,一方面业务放会觉得基础一直在调整,一直在升级,整体来说基础能力在那段时间的迭代推动过程效率很低。
我们思考很久得出这两个问题,核心是缺少长期可持续的集中控制机制。正是因为缺少这个机制,才会导致中后台在长时间的发展中每个中后台的步调不一致,慢慢的就会变得不统一,最终影响各方面的研发效率。我们希望有一个方式能否提供中后台长期可持续的集中控制机制,这个时候在移动端推动两年的满帮微前端方案已然成为我们的最佳选择。
满帮微前端最核心的部分就是有一个各个业务项目依赖的基座,业务专注业务逻辑开发,基座管理项目运行需要的基础能力的迭代更新,比如埋点,水印,安全相关,统计,组件,主题等。业务只使用基座提供的能力进行业务开发。
在统一架构的基础上,我们能提效的方式就有更多了,比如提供一站式的中后台管理平台,从创建,准入,菜单权限,打包,发布等,以前需要多个平台完成,现在只需要一个地方就快速添加。又比如我们把中后台页面按难易程度进行分级,不同级别的页面有最高效率的开发方式,适合前端,以及后端,让更多的角色加入进来,让整个研发链路能提效。
| 中后台创建演示 | L2简单逻辑开发 | L3轻交互页面搭建 |
|---|---|---|
| 专业前端开发 | 非前端开发人员,选摸版,简单修改代码,快速上线 | 非开发人员,选摸版,简单配置,快速上线 |
截止2024年12月,整体的方案在线上已经运行了1年半,在中后台管理平台上又新建了200多个项目,未来还会有更多的项目, 目前运行在基座上的中后台项目拥有很多以前很难想象的能力。典型的场景有如果未来有新的设计师进来有新的设计方案,那么只需要基座进行对接就好,业务项目无需任何投入,集团中后台主题算是做到真正的持久统一。再比如基础做的基础能力的升级可以快速覆盖到这200个项目上,以及我们定了一些检查规范可以约束或者告警业务的代码,是否有风险,最佳实践是什么,可以在开发过程中就能提示出来。减少上线后变成历史无法修护的问题。
AI增强摘要:
本文由满帮集团微前端的发起和推动落地人王坤明分享,详细介绍了满帮微前端从提出方案到落地实践,再到推广成为集团开发Web项目标准方案的整个过程。文章强调了满帮微前端方案的核心在于解决移动端体验问题,通过将公共能力剥离成独立的基座项目,业务项目仅保留业务逻辑代码,运行在统一的基座上,从而在研发效率、性能体验、稳定性和持续性方面带来显著提升。此外,文章还分享了满帮微前端发展过程中的挑战和转折点,以及如何通过解决中后台研发效率问题,进一步推动方案的落地和应用。
内容分类: AI工具的第一人称深度使用经验
适合人群: 前端开发者、技术架构师、Web项目管理者
原文链接: 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说「流程中」,一等就是一个月。这一个月我啥也没干,就刷邮箱等消息,像个傻逼一样。
这时候我才懂范进——你以为自己中了,其实屁都没有。
毕业那年进了个区块链小公司,老板说转正给1万,我他妈高兴坏了——「我同学花两三万培训还找不到工作呢!」
现在看真是蠢。那时候滴滴应届生「白菜价」都20k了,我还在为1万沾沾自喜。
问题不是钱,是起点——你第一份工作在小公司,后面想进大厂,难如登天。
后来跳槽涨了50%,进了个中型公司,终于知道什么叫「团队协作」了。结果没两年公司不行了,领了几万块钱「毕业大礼包」。
2023年再找工作,行情已经烂了。我怕失业,涨了40%多又去了个小公司,继续写垃圾代码。
这时候我才明白:小公司呆久了,你的简历就废了。
今年我认真准备了半年,八股文、项目难点、架构设计,甚至刷了LeetCode。面京东时,人家问「你们日活多少?QPS多少?」
我他妈哪知道?我们公司就几十个人用,需要个屁的高并发!
大厂要的是「大厂经验」,你没有,就是没有。
我现在进了一家还算稳定的公司,薪资也还行,但心里明白——我这辈子可能都进不去大厂了。
不是我不努力,是一开始选错了。如果毕业就进大厂,现在跳槽随便涨50%。但在小公司呆过?难。
真的,这几年每次面试,人家都会问我博客上的东西。那些在小公司用不上的「高端技术」,我全靠自己折腾,写在博客里。
所以如果你也在小公司:
我知道你们想听「坚持就能进大厂」,但现实是——有些人就是没这个命。
我现在马上30岁了,五年经验,没大厂背景,以后更难。
前面卡技术经验,卡大厂背景,后面卡年龄限制,一开始没走好路,后面真的特别艰难
现在还背上了房贷,要结婚,要有小孩,后面压力更大,现在只想稳定一点 😭😭😭
但至少我还能写代码,还能靠技术吃饭。比起范进,我至少没疯。
一直等不到的消息,我都感觉我问烦了
来自群友的关心,我当时已经是范进的心态了
因为别的大厂也没约我面试,除了美团,小红书的外包 😭😭😭
后面会更新一些,新的学习的技术,如果对面经感兴趣的,也可以单独写一篇半年的面试经历以及总结~
AI增强摘要:
这篇文章是一位自学前端五年的开发者分享的个人经历和深刻反思。从最初的区块链小公司起步,到经历裁员、跳槽,最终在京东终面后未能获得offer,作者深刻体会到了选择比努力更重要的现实。文章揭示了在小公司长期工作可能对职业发展的限制,以及大厂对经验和背景的严格要求。作者通过自己的经历,向读者传达了几点实用建议:在小公司工作时要主动挑战有难度的项目、坚持写技术博客以积累可展示的技能和经验、尽早规划职业跳槽以避免简历贬值。尽管作者对自己的大厂梦感到无奈,但他也承认技术博客为他带来了面试机会,并鼓励同行不要放弃自我提升。
内容分类: 中国人跳槽的详细经历或深度第一人称经验
适合人群: 自学转行的程序员、前端开发者、职业规划迷茫者
原文链接: 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 经理,工作地点北京东城区。详细信息与申请方式,请点击链接;
听众投稿:如果你了解身边日常现象的背后原因,欢迎投稿,你的发现可能出现在节目中。
「用声音碰撞世界」,声动活泼致力于为人们提供源源不断的思考养料。
- 我们还有这些播客:声东击西、What's Next|科技早知道、商业WHY酱、跳进兔子洞&跳进兔子洞第三季、吃喝玩乐了不起、不止金钱、泡腾 VC、反潮流俱乐部
- 如果你喜欢我们的节目,欢迎打赏支持,或把我们的节目推荐给朋友
AI增强摘要:
本期声动早咖啡节目涵盖了多个商业科技动态,包括Temu和Shein的成交总额增长、喜茶海外门店的扩张、高盛计划入股哈根达斯母公司、日本奢侈品市场的回落,以及百胜中国、杨国福、OpenAI、特斯拉和加拿大鹅的最新动态。此外,节目还介绍了漫威剧集《猎鹰与冬兵》、《月光骑士》和《鹰眼》在哔哩哔哩的首发情况,这些剧集聚焦于终局之战后的世界,探讨了角色的自我认同和成长故事。节目还推出了新节目「Knock Knock 世界」,旨在为AI时代的青少年提供商业科技和社会人文的深度解读。
内容分类: 垂直领域-播客行业的生意经
适合人群: 商业科技爱好者、漫威粉丝、青少年教育工作者
原文链接: https://www.fxbaogao.com/detail/4984574
原始摘要:
发现报告作为专业研报平台,收录最新、最全行业报告,可免费阅读各类行业分析报告、公司研究报告、券商研报等。智能分类搜索,支持全文关键词匹配,可下载PDF、Word格式报告。
AI增强摘要:
该报告由香港青年协会青年研究中心执行,比较了香港与日本、美国、德国、法国和瑞典13至29岁青年的价值观。研究发现,香港青年与家人同住的比率最高,但结婚和生育意愿最低,对家庭和朋友关系的满意度最高。在校学业方面,香港青年对校园生活的满意度最高,最重视学历资格和证书。约半数香港青年有工作,其中近五成从事高技能职业,大部分对现职工作感到满意。然而,香港青年对社会的满意度较低,对参与社会事务的意愿也较低。报告指出,香港青年的这些特点可能对人口结构和社会政策产生深远影响,建议深入探讨背后原因并制定相应政策。
内容分类: 最新研究论文关于社交技巧
适合人群: 社会学家、政策制定者、青年工作者
原文链接: https://www.fxbaogao.com/detail/4983693
原始摘要:
发现报告作为专业研报平台,收录最新、最全行业报告,可免费阅读各类行业分析报告、公司研究报告、券商研报等。智能分类搜索,支持全文关键词匹配,可下载PDF、Word格式报告。
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 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
原始摘要:
欢迎来到“AI新榜”推出的「AI一周热门」栏目
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容可能涉及视频、小程序的使用,以及点赞和在看功能的互动。核心观点在于强调在异常环境下完成验证的重要性,以及如何在数字平台上进行基本的互动操作。
内容分类: 特定前提下的众生相
适合人群: 数字平台用户、社交媒体管理者
原始摘要:
一杯蜜雪冰城引发的二创狂欢
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增强摘要:
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
原始摘要:
下一代IDE,是“Agent Native”而非“功能堆叠”
AI增强摘要:
该文章内容似乎涉及到一个环境异常的通知,提示用户需要进行验证以继续访问。内容中提到了视频、小程序以及点赞和在看的功能,暗示这可能是一个社交媒体或内容分享平台上的通知。核心观点是用户在遇到访问限制时,需要通过完成验证来恢复正常的访问权限。这可能涉及到平台的安全措施或用户身份验证流程。
内容分类: 特定前提下的众生相
适合人群: 社交媒体用户、内容分享平台用户、网络管理员
原始摘要:
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
原始摘要:
浙江饮料的成功,绝非偶然。
AI增强摘要:
该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序、点赞和在看的功能,暗示这可能是一个社交媒体或内容分享平台的界面提示。核心观点是用户需要通过验证来恢复正常的访问权限,关键洞见在于平台可能采用了某种安全机制来防止滥用或自动化攻击。
内容分类: 特定前提下的众生相
适合人群: 社交媒体用户、内容分享平台的管理员、网络安全爱好者
原始摘要:
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 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不会淘汰人,只淘汰不会用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.
内容分类: 特定前提下的众生相
适合人群: 系统管理员、网站开发者、用户体验研究人员
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。
内容分类: 特定前提下的众生相
适合人群: 互联网用户和技术爱好者
原始摘要:
AI增强摘要:
该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序、点赞和在看等功能,但缺乏具体的文章内容或深度信息。因此,无法生成一个深度摘要。
内容分类: 特定前提下的众生相
适合人群: 普通互联网用户
原始摘要:
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, 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
原始摘要:
热门岗位招聘中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
原始摘要:
不要输钱是一种愿望,不能输钱是一种能力。
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。这一机制可能是为了确保访问的安全性或是防止自动化工具的滥用。文章内容简短,主要围绕验证的必要性和操作提示展开,强调了用户互动(如点赞和在看)的即时反馈机制。
内容分类: 特定前提下的众生相
适合人群: 网络管理员、网站开发者、普通互联网用户
原始摘要:
今天早上,云南航空公司的前同事打来电话,通知我马叔叔骤然离世,距离他退休只剩下一年。
AI增强摘要:
该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序以及点赞和在看的功能,暗示这可能是一个社交媒体或内容分享平台上的通知。核心观点可能是关于用户互动和内容验证的重要性,关键洞见在于平台如何通过验证机制来确保环境的安全性和用户的真实性。
内容分类: 特定前提下的众生相
适合人群: 社交媒体用户、内容创作者、平台开发者
原始摘要:
今天的便携式音乐设备就是手机,加上耳机和一个音乐 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
原始摘要:
封面人物:Ronald H. Coase
AI增强摘要:
文章内容似乎涉及到一个环境异常的情况,提示用户完成验证后可以继续访问。这可能是指某种在线服务或网站的安全验证过程,旨在保护用户和数据的安全。核心观点可能是强调在当前网络环境下,安全验证的重要性以及如何通过简单的步骤(如点击验证)来恢复访问权限。
内容分类: 特定前提下的众生相
适合人群: 网络用户、IT安全爱好者
原始摘要:
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 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股持续回暖,开户数明显回升,券商经纪业务直接受益,但存量竞争下佣金率下降趋势不可阻挡
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盛宴里,上市公司、投行、投资机构等都扮演着重要角色,推动港股形成“IPO融资-二级市场表现-再投资”的良性循环,同时促进行业生态在港股的新周期里产生新的变化
AI增强摘要:
当前环境出现异常,用户需要完成验证后才能继续访问。文章内容涉及视频和小程序的互动功能,如点赞和在看,用户可以通过轻点两下来取消这些操作。
内容分类: 特定前提下的众生相
适合人群: 互联网用户和技术支持人员
原始摘要:
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.
内容分类: 特定前提下的众生相
适合人群: 系统管理员或网络技术维护人员
原始摘要:
8月1日,诺亚方舟全球华人财富管理与传承峰会在新加坡圆满举办!
AI增强摘要:
当前环境异常,完成验证后即可继续访问。 去验证 : , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看
内容分类: 特定前提下的众生相
适合人群: 技术爱好者
原始摘要:
香港金管局新闻稿称,发牌将是一个持续进行的过程,已准备充分并希望尽早获得考虑的机构应于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
原始摘要:
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
原始摘要:
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
原始摘要:
想问问,大神们都挣了多少了?符工不多,挣了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.
内容分类: 特定前提下的众生相
适合人群: 系统管理员、网络安全专家、普通用户
原始摘要:
我看到的最好的回答,是王文的。他的观点是,第一有卓越的智商第二对投资的热爱第三阅历第四长期主义思维对于50岁以上的,增加三项特质要求:好奇心、谦卑感和勤奋。
AI增强摘要:
该文章内容似乎涉及到一个环境异常的通知,提示用户完成验证后可以继续访问。内容中提到了视频、小程序、点赞和在看的功能,暗示可能与社交媒体或在线平台的互动有关。然而,由于提供的文本片段较为零散且缺乏具体信息,难以提炼出更深层次的核心观点或关键洞见。
内容分类: 特定前提下的众生相
适合人群: 社交媒体用户或在线平台使用者
原始摘要:
AI增强摘要:
当前环境出现异常,用户需要进行验证以继续访问。文章内容涉及用户互动功能,如点赞和在看,提供了简单的操作指南。核心观点在于强调用户验证的重要性以及互动功能的便捷性。
内容分类: 特定前提下的众生相
适合人群: 网站管理员和普通用户
原始摘要:
是为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寸的显示器在我们办公室还是挺少见的。包装很扎实,显示器本体比我想象中要厚重一些,但这种分量感反而让人觉得很有质感,不像那些轻飘飘的廉价显示器。
接上电源的那一刻,我就被这块28寸屏幕的显示效果震撼到了。以前用的24寸1080P显示器瞬间显得小家子气。为什么说它是程序员专用呢?用了几天后,我总结出以下几个让我印象深刻的特点:
这块的屏幕比是3:2,分辨率达到了3840×2560,这是什么概念呢?举个实际例子:我现在可以同时打开VS Code编辑器、Chrome浏览器查文档、终端窗口运行命令,还能在右侧放一个API测试工具,四个窗口互不遮挡,再也不用频繁切换Alt+Tab了。
这个分辨率真的改变了我的工作方式。一般显示器的比例是16:9、16:10、21:9,而这款显示器的比例接近3:2。这意味着什么呢?当我在看长代码文件时,比如那些几百行的配置文件或者复杂的业务逻辑,我可以一次性看到更多的代码行数,减少了滚动次数。特别是在code review的时候,能够看到更完整的上下文,理解代码逻辑变得更容易了。
以前没用过这种特殊比例和高分辨率显示器时还没什么感觉,但用了一个星期后,真的是回不去了。最明显的变化是:以前需要在多个桌面之间切换的工作流程,现在在一个屏幕上就能完成。比如做前端开发时,左边写代码,右边实时预览效果,中间还能放个开发者工具调试,整个开发过程变得行云流水。同事看到我的工作效率提升后,也开始考虑换显示器了。
最让我惊喜的是,这款显示器居然还有专门为程序员设计的专业编程模式。刚开始我还以为这只是个营销噱头,但实际体验后发现,这个功能真的很实用。
通过设置编程模式,代码的语法高亮变得更加鲜明,注释和关键字的对比度明显提升。最直观的感受是:以前看代码时偶尔会眯眼睛,现在完全不需要了,即使是小号字体的代码也能看得很清楚。特别是在处理复杂的嵌套逻辑时,不同层级的代码块区分更明显了。
它提供了多种不同的模式,可以自定义到快捷触键中,我用的比较多的是「用户模式」「编程-深色模式」「编程-亮色模式」:
用户模式:这是默认模式,适合日常办公使用,画面比较明亮,看文档和浏览网页都很舒服。
编程-深色模式:这是我的最爱!切换到这个模式后,VS Code的Dark主题显示效果简直完美。代码的语法高亮更加鲜艳,字符串、注释、关键字之间的对比度大幅提升。我现在90%的编程时间都在使用这个模式,特别是晚上加班的时候,眼睛的疲劳感明显减轻了很多。有一次连续写代码4个小时,竟然没有感到明显的眼部不适。
编程-亮色模式:这个模式是为喜欢Light主题的开发者准备的。我试用了几天,发现它在白天光线充足的环境下表现很好。与普通显示器相比,这个模式下的白色背景不会那么刺眼,看起来更像是纸质书籍的感觉。我的一个同事就特别喜欢这个模式,他说用起来眼睛很舒服,不会有那种"被强光照射"的感觉。
RD280U面板的抗反射涂层真的让我刮目相看。我们办公室是朝南的,下午阳光特别强烈,以前用普通显示器时,经常需要拉窗帘或者调整座位角度来避免反光。现在用这台显示器,即使是下午两三点阳光最强的时候,屏幕上也几乎看不到明显的反光。
最实际的体验是:以前在阳光强烈的时候,我经常需要把IDE的主题调得更亮一些才能看清代码,现在完全不需要了。甚至有时候忘记拉窗帘,也能正常工作,这对提高工作效率帮助很大。
这里放两张对比图让大家感受一下:
为了突出强光对比效果,我特意用手机开启闪光灯进行拍摄。可以看到,虽然有强光照射,但RD280U几乎没有反光现象,屏幕内容依然清晰可见,代码的可读性完全不受影响。
而切换到我笔记本的普通显示器时,反光现象就非常明显了。在同样的光线条件下,笔记本屏幕上的反光几乎让人无法正常阅读代码,这种对比真的很震撼。
作为一个经常需要加班到深夜的程序员,蓝光过滤功能对我来说特别重要。RD280U提供了5个级别的蓝光过滤设置,我通常会根据不同的时间段来调整。白天工作时用1-2级,保持色彩的准确性;晚上8点后调到3-4级,减少蓝光对睡眠的影响,也可以设置好昼夜模式,就可以根据日出日落时间自动调整滤蓝光的水平了。
最明显的变化是:以前晚上写代码到11点多,躺下后经常需要半小时才能入睡,现在基本上沾枕头就能睡着。我用配套的Display Pilot 2软件设置了自动调节,到了晚上8点会自动切换到护眼模式,非常贴心。
值得一提的是,RD280U通过了5项德国莱茵认证:Eyesafe2.0、Eyecomfort、无频闪、硬件级滤蓝光和抗反射认证,以及1项国家发明专利:智慧调光专利。这些认证不是摆设,实际使用中确实能感受到护眼效果。
使用明基RD280U两个多月后,我可以负责任地说,这确实是一款专门为程序员量身定制的显示器。它不仅仅是一块普通的大屏幕,而是真正解决了我们日常编程中遇到的痛点。
主要优势总结:
超高分辨率带来的效率革命:3840×2560的分辨率彻底改变了我的工作方式。现在我可以同时打开IntelliJ IDEA、Chrome开发者工具、Postman和终端,四个窗口并排显示,再也不用频繁切换了。据我粗略估算,每天至少节省30分钟的窗口切换时间。
专业编程模式的贴心设计:编程模式真的很实用,特别是深色模式,让我在深夜加班时眼睛舒服了很多。有一次项目紧急上线,我连续编程12小时,眼睛竟然没有以前那种刺痛感。
护眼功能全方位保护:从抗反射涂层到蓝光过滤,再到无频闪技术,每一项功能都能在实际使用中感受到。最明显的变化是睡眠质量提升了,以前晚上写代码后经常失眠,现在很少出现这种情况。
3:2比例的编程友好性:这个比例让我在查看长代码文件时体验极佳。比如查看Spring Boot的配置文件或者React组件时,能看到更多的代码行,理解上下文变得更容易。
真实使用感受:
作为一个每天编程10+小时的后端开发,这款显示器真的改善了我的工作和生活质量。工作效率提升了至少20%,眼睛疲劳感减少了一半以上。
如果你满足以下条件,我强烈推荐这款显示器:
毕竟,我们程序员最宝贵的就是眼睛和大脑,好的工具能让我们在保护健康的同时提高效率,这笔投资绝对值得!
AI增强摘要:
这篇文章详细介绍了作者作为一名程序员,如何通过更换专业显示器(明基RD280U)来改善工作效率和眼部健康。文章不仅分享了显示器的外观和功能特点,如3:2的屏幕比例、3840×2560的高分辨率、专业编程模式、抗反射涂层和智慧蓝光过滤等,还深入探讨了这些功能如何具体提升编程效率和保护视力。作者通过个人体验,强调了这款显示器在减少眼睛疲劳、改善睡眠质量方面的实际效果,并推荐给长时间编程的同行。
内容分类: 程序员的副业或创业经验分享
适合人群: 程序员、软件开发人员、IT专业人士
原文链接: https://juejin.cn/post/7533134306342289471
原始摘要:
🛍️ 一个完全开源免费且功能完善的 Android 电商项目
作为一名 Android 开发爱好者,我在学习 Jetpack Compose 的过程中发现其生态仍有完善空间,因此开发了「青商城」项目。该项目专为国内开发环境设计,旨在为社区提供实用的 Compose 代码参考,帮助开发者快速掌握现代 Android 开发技术,同时也能对我所学的知识进行巩固和分享。
项目涵盖了 Android 开发中的常见场景:
整体架构参考了 Google 官方的 Now in Android 项目,采用当前主流技术栈实现。目前已完成的基础功能包括:
后续将逐步完善优惠券以及商品评价等功能(具体可查看项目中的功能模块计划目录)。
这个项目凝聚了我业余时间的全部心血,从代码实现到 UI 设计再到动画效果,都力求打造流畅生动的用户体验。希望能为开发者提供有价值的参考,同时我也提供了完整的接口文档,期待大家的建议与反馈,共同学习进步。
如果项目对您有帮助,请给个 Star 支持 ⭐ 这对我来说很重要,能给我带来长期更新维护的动力!
💡 说明:由于功能模块较多,截图不下,这里仅展示部分界面。更多功能正在持续完善中...
Release 版本(推荐):点击下载体验
Debug 版本(开发者):点击下载体验
.debug 后缀,与 Release 版本不同,可以共存安装。Leaks(内存泄漏)和 Open Chucker(网络监控)。为确保能接收到 Chucker 的实时网络请求通知,建议开启应用的通知权限。支持系统:Android 8.0 及以上
更新说明:预览版本会不定时更新,可能不会完全同步最新的代码变更
项目采用了当前 Android 开发的主流技术栈:
项目采用模块化架构,参考 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/ # 导航模块
模块化的优势:
状态说明:
已完成- 功能页面已完整实现并可以正常使用待完善- 功能页面基本实现,但还需要进一步优化和完善待优化- 功能页面已实现,但需要性能优化或体验优化仅页面- 只完成了页面UI,功能逻辑尚未实现待开发- 功能页面尚未开发,陆续实现中
主模块 (main)
待完善已完成已完成待完善认证模块 (auth)
已完成已完成已完成仅页面已完成用户体系模块 (user)
仅页面待开发已完成已完成已完成订单模块 (order)
已完成待完善待完善已完成待开发待开发待开发商品模块 (goods)
已完成待完善待开发已完成营销模块 (market)
待开发客服模块 (cs)
待优化反馈系统 (feedback)
待开发待开发通用模块 (common)
仅页面已完成启动流程模块 (launch)
待开发待开发欢迎所有对 Android 开发感兴趣的朋友参与项目贡献!
如果这个项目对你有帮助,请不要忘记给个 ⭐ Star 支持一下!这对我来说意义重大,也是我持续更新的动力源泉。
让我们一起在 Android 开发的道路上不断学习、共同进步! 🚀
AI增强摘要:
这篇文章介绍了一个基于 Kotlin 和 Jetpack Compose 的 Android 完整电商开源项目「青商城」。该项目专为国内开发环境设计,旨在为社区提供实用的 Compose 代码参考,帮助开发者快速掌握现代 Android 开发技术。项目亮点包括100% Kotlin 开发、Jetpack Compose UI、模块化架构、完整电商功能等,涵盖了用户认证、商品展示、购物车、支付、订单等常见场景。文章详细介绍了项目的技术选型、架构设计、功能模块以及如何参与贡献,旨在为开发者提供有价值的参考,并鼓励社区共同学习和进步。
内容分类: 程序员的副业或创业经验分享
适合人群: Android 开发者、技术爱好者、创业者