free 不知道大家听没听说过,它的核心作用是通过深度调教提升手机性能和流畅度。软件为开源社区搬运的,也是海外开发的,面向全安卓手机。 首先我们准备这个版本的 free, 因为这个版本 bug 少,迅雷搜索机主保库即可获取所需文件, 然后随便找一个激活工具激活。 free 进去后只需要在意这三个。 第一个额外优化,通过调用安卓原生的 art 翻译,类似于 sin 的 翻译,可以设置每日运行,但操作过程中时间会有点长,并且手机会发热,翻译后就没问题了,也可以重置优化。 然后是自适应降级,说白了就是改比例,对于大家玩身法的可以试试给大家看一下游戏效果。 然后是禁用臃肿应用,简单来说也是冻结应用,把自己用不到的应用可以进行冻结。
粉丝4183获赞9.5万

一个被马斯克折磨出来的 spacex 的 技术狂人,因为受不了画电路板太慢,反而离职,搞出了一个硬件界的阿发 go, 要用 ai, 把硬件工程师从繁琐的布线中解放出来。 一块包含八百四十三个原件的复杂电脑主板,如果让人类自身工程师来画,需要六到八周,耗时四百二十八个小时。但一个 ai 只用了二十七个小时,算上人工前期准备和后期微调,总共也就三十八个小时。 更恐怖的是啊,这块由 ai 设计的主款,一次流变成功通电,就能跑 linux 系统。这个把硬件开发初期从月变成天的 ai 叫 qlter, 他的创始人是个绝对的狠人。他之前在哪工作的? spacex, 负责猎鹰九号火箭的航空电子设计。 在马斯克手下干活啊,讲究的是什么呢?唯快不破,软件迭代那是日新月异。可他发现,一旦涉及到电路板 pcb 的 设计啊,整个线嘛,就被卡死了。因为画板子太难了,高速信号散热、电磁干扰成千上万条线。 必须啊,一条条人工去拉,哪怕用最好的 e d a 工具啊,本质上还是人工辅助画图小伙受不了了,我们连火箭都能回收了,为什么画个电路板还得像在绣花? 于是啊,他辞职创立了 quarte, 发誓要搞出硬件 ai 变音器。为什么说它是硬件界的 alpha go 呢?大家注意啊, quarte 绝对不是你熟悉的 excel gpt。 excel gpt 啊,是大语言模型,它靠的是概率预测。 它画出来的电路板可能看着像是那么回事,但根本不通电,因为它是瞎蒙的。而 quarte 走的是强化学习加物理,反正的路子 和夏维奇的 argo 一 模一样。它的棋盘就是电路板。它的游戏规则啊,是 max 韦方程组借尔霍夫定律和热力学原理。它不是在模仿人类怎么画线,而是在吃透物理规则后啊,在规则允许的范围内,经过数百万次的自我博弈和退演,算出那个上帝视角的解。 一旦散热不达标,信号有干扰,系统自动扣分重来,直到找到那个完美的最优解。这意味着什么?快的创始人啊,提出了一个伟大的概念,硬件编程器。几十年前啊,程序员写代码要手写汇编语言,累死累活。后来有了编程,程序员只管逻辑编程器,负责生成机器码。 软件行业这才大爆发,快来的,现在做的就是把硬件开发带入到高级语言时代。未来的硬件工程师啊,不需要去纠结每一根线怎么走,你只需要定义好我要什么功能,什么性能,什么芯片,剩下的一键翻译 也要帮你搞定所有物理实践,让人类的大脑回归到最宝贵的架构创新和产品定义上。当硬件迭代的速度啊,像软件一样快。当创业团队不再被昂贵的 pcb 设计费啊拖垮,一场硬件行业的生产革命啊,正在悄然拉开序幕。 好了,关于这个硬核的电动版阿尔法狗,今天就聊到这里,这里是智能家居情报局,关注我,带你发现更多改变世界的黑科技!


我尝试用最新的 esp 三十二 p 四强行复刻 oppm, 本以为是降维打击,结果差点翻车。其实我向官方提过这个方案,但被以算力不足直接回绝。 官方不做,那我就自己试一试。第一步是代码,那手术我强行删掉了上万行荣誉驱动,接入了全新的 spv, 有 框架,开着变异锐志飞速滚动,心跳也跟着加速。最折磨的是 usb 协议握手, 新版 i d e 协议不兼容,我只能逻辑抓包伪装 v i d 强行回退版本,才终于建立起这条生命线。经过四颗真理,从一针慢慢爬升到十五针,每一针的突破都是对软件逻辑的极限挖掘,我还掉进了硬件解码器的深坑。 为了解决那十六字节的 d m a 对 其报错,我对手册扣了整整一页 m i p i 摄像头虽然规格高,但在一千零八十 p 下, usb 传输宽带直接成了瓶颈,分辨率陷阱让实际体验大打折扣。为了验证硬件边界,我手搓了一块 d v p 并扣板子, 从设计到手工焊接,每一处布线都是为了那极致的宽带表现,但最终我还是选择了放手。 p 四确实很强,但缺乏 n p o 是 不可逾越的鸿沟, 有时候放弃也是一种即刻的理性。这次折腾不止是写了几行代码,更多的是对底层内存协议和硬件权衡的深刻复盘项目在去分存,但 p 四探索不会停止, 新的挑战已经在路上,我们江湖再见。如果你也喜欢这种硬核折腾,点赞关注就是对我最大的支持,评论区见,告辞!

cloud code 刚刚上线了官方插件市场, and fropic 亲自维护,一键安装就能让 cloud 获得超能力。 以前用 cloud code 写代码,改完一个文件类型报错要自己跑翻译器才知道。现在装一个 lsp 插件, cloud 改完代码自动检测错误,发现问题当场修复。目前官方已经支持十一种语言, python, type script, go, rest, java 全都有。 除了代码智能,官方插件还打通了十多个主流平台, github 管代码 gera linear 管项目 figma 搞设计, sentry 查监控,甚至 slack notion 也能直接连一句话就能跨平台操作,不用再切来切去。 还有几个实用的工作流插件, canmake commands, 帮你一键提交和创建 pr review toolkit, 专门做代码审查。 plug in def, 让你自己造插件, 所有插件都在斜杠 ploggin 命令里, discover 标签页直接浏览安装 plogcoat, 插件生态正式起步,追星不盲从,实测出真知!

呃,今天的话给大家讲一期关于这个 c 下铺啊被反编 e 的 这么一个问题啊,那么我之前的话讲过一句话啊,就是说软件呢都是可以被破解的啊,那么有同学啊,他又提出质疑了啊,他说我拿个软件,哎,你,你把它破解了,我给你一百块钱。 那么我其实我讲这一句话的意义呢是在于说这个没有绝对无法被破解的软件,我们的目标呢是让这个破解的成本呢要高于我们的这个软件的售价。想要安全性更高的话,我们 c 叉五的话通常会采用这个混淆代码,第二个的话是 a o t a o t, 然后再加上一个服务端的一个验证啊,我们三重保障啊,使我们的这个, 嗯, c 下铺的这个安全性更高啊。那么我这里的话,今天的话给大家讲一种啊,我常用的一个啊,就是防止反变异的一种手段啊,那么我们会使用 c 加加跟这个 c 下铺啊混合编程的一种模式啊,我们将核心的代码呢给它写到这个 c 加加里面去,然后呢我们使用 c 下铺来调用它啊,那么我今天的话 来给大家看一看我们 c 下铺如何来调用这个 c 加加的这个代码啊,那我这里的话选择这个 c 加加,选择 c 加加,然后呢我们找到这个动态链接库啊,也就是我们可以把 c 下铺的一些核心算法,或者说我们这个图像算法之类的,我们把它写到这个 c 加加里面来,我这里给它改一个名字啊, taste 啊, taste ok, 我 们创建完这一个 c 加加的这个动态链接库之后呢,我们会在它的这个原文件这里面啊,我们添加一个,哎,新建项啊,那这个呢?是我们的 c p p 文件啊,添加, 点击添加,比如说我现在啊,我定义一个函数啊,定义一个函数,那这里的话我就不手搓代码了啊,那我这里的话就复制一下啊,复制一下。 那在写这句代码之前的话,我们需要包含一个 p c h 啊, p c h 这一个头文件, 哎,我们包含这个头文件,那这里的话它会写了一个这个,哎,前面这一句啊是什么意思啊?这个呢是禁用 c 加加的名词修饰啊。禁用 c 加加的名词修饰,它是什么意思?就是为了让我们导出的这个代码呢,保证它是按的这个函数啊,按的这个函数,然后它这里还有一个啊,这个 这一个又是什么意思啊?他是申名为导出符号啊,申名为导出符号,这一句申名为导出符号,怎么去理解?他就是说我这个函数呢,就是暴露给外部来使用的,因为我要使用这个 c 下部来调用它啊,调用它,那么我们先编一下啊,生成解决方案, 哎,现在生成成功了,生成成功了之后,我们在这个地方啊,在它的第八个这地方找到这个退色点,第二它就生成了一个动态链接库给我们用,那我们在 c 下部端怎么来使用它?哎,我先把它粘贴出来啊,然后我们打开我们的 vs 创建新项目, ok, 然后我们找到我们的 c 下部啊,我们创建一个,随便创建一个啊, windows 啊, windows 程序啊,我的地址啊,这个路径,给它更改一下,更改到我的桌面啊,桌面啊名字我也懒得改了啊, 然后啊,然后我们在它的这个生成的这个 bug 这个路径下面呢,我们把这个动态电机库呢丢到这边来,丢到这边来,然后呢这个由于它是 c 加加的这个库啊,我们想在 c 下部里面直接去引用它,肯定是引用不了的啊,那这个时候呢,我们可以这样子使用啊,这样子使用哎,比如说我就在这个窗体里面要使用它,要使用它, 我在这个 form 这个类里面要使用它,那我们可以这样子去写它啊,我直接复制下来了啊, 那其实这一个哎,我们把复制过来之后,这里是有一个报错的啊,有个报错的实际上是这个,哎,第二的这个啊,这个特性啊,它不属于这上面的这个秘密空间,我们需要手动去引用一下这一个啊,这个这个秘密空间啊,我们引用了它的之后啊, 前面的这一个,哎,这个是我们都类似平台下面的这个 c 下铺的这个特性啊,特性,那么它的意思就是标记该方法定义在非托管代码 c 或者是 c 加代码中啊。然后这个是你想要 调用哪一个动态链接库啊?我们调用的动态链接库是这个啊, taste 点第二,我们更改一下 taste 点第二,然后后面这一句啊,后面这一句,这个呢是我们的一个调用的一个约定啊,规定参数的一个传递方式和堆栈清理的一个责任方啊, 然后这个样子,我们相当于就把 c 下 c 加加的这个,哎,动态电机库里面的函数呢,就拿到我们 c 下库里面来了,那我们试试啊,能不能使用它啊?我在这个窗体出式化漏的下面啊,我定义两个变量啊,应他一个 a 啊,那这个 a 呢?等于五,再应他一个 b 啊, b 等于十,那么我们打印一下这个函数啊,我们调用这个按的这个函数啊,你看这个按的它是有个返回值的啊,其实这里你看这个它在 他在定义这个按钮的时候呢,他外这里使用了这个关键字,这个关键字呢就是代表我们的这个函数呢,是外部的啊,是外部的这个函数啊,然后我们把这个 a 和 b 给它传进来 ab 啊, 然后它返回,这是一个整形的,我们需要把它显示的话,我们要把它转换成这个字母串格式啊,字母串格式啊, ok, 这样子就写好了啊,当然刚刚忘记给你们讲这个 c 加加的这部分代码啊,我这部分代码,你看 前面这两个,我们解释解释了啊,后面这个就是 c 的 这个标准的这个函数的这个声明啊,函数的这个实线啊,我们把这个 a 和 b 啊,最终输出了 a 和 b 的 这个和啊,然后我们再反过来看一看啊,我们这里 a 是 五, b 是 十,那我们调用它呢,这个值应该是十五,我们看一看是不是这个啊? ok, 看到没有,这里的这个弹窗 m c g box 秀,它就给出了这个十五啊,这就是我们的这个呃, c 下铺要用 c 加加外部库的这么一个过程啊,那么我们使用这种混合编程的方式呢?这个它要想做这个反变意的话,它的这个难度是比较大的啊,比较大的,当然啊,当然 如果说你想要既然是为了安全的话,我们的这个外部库啊, c c 下部的这一端,我们建议啊把这几个啊给它加上啊,把它加上啊,也就是说写的时候呢,你后面多加一点啊,这里的这个,这个你多加一点啊,这个 ok 啊,今天就是今天的内容啊。

这可是我们国家头部的云服务厂商呀,居然 sdk 都不能翻译,不过老法师动作还是迟了呀,想要来合个影的,结果我们看一下这边 啊,这个衣秀里面已经全都被关掉了,现在还只剩三个,但是我们已经不能去进行任何评论或者提交新的衣秀了。你不能提交衣秀的话,那你这个项目开源的意义是什么呢?你直接打包给用户用得了,这个项目应该也不是一个特别常用的,所以两天前这个帖子它已经是排在最前面的衣秀了。 自己发布的东西,自己的产品,这些人自己不用的吗? 都已经不让再说话了。不过 game have 有 个好处啊,这些 e q 它只能关闭,它不能删掉,华山派那一招在这边是根本用不了的。 哎呀,可惜啊,这么大的事件,没有办法去合个影。当然这件事情肯定不能怪华为的工程师,这玩意大概就是赶鸭子上架,上边那帮领导肯定又是拿屁股决定捣蛋。这边老法师就给你们一个千万年薪的建议啊,直接把这个仓库删了,重新开一个呀,这样大家就看不到这个音效了呀,嘿嘿。

我刚接触 c i c d 那 会儿,也被这两个字母组合给搞蒙了,查了一堆资料,全是专业术语,越看越迷糊。今天我用五分钟用大白话把 c i c d 讲清楚,小白也能听懂。第一, c i c d, 它不是单一的工具, 而是持续集成、持续交付部署的自动化理念和流程,也就是持续集成。简单说就是开发人员把写好的代码频繁合并到团队共用的代码仓库里,每次合并后 自动做代码检查、翻译、测试,确保代码能正常运行,不用和别人的代码冲突。 c a 的 核心价值就是提前发现代码冲突和漏洞,减少返工,让团队协助更流畅。 c d 这是两个概念的集合统称, 分别是持续交付和持续部署。我们先讲交付,就是把经过 c a 检测合格的代码自动打包成可以上线的版本,做好上线前所有准备,最后手动点击发布按钮就能上线。 而持续部署就是在交付的基础上再升级,连最后的点击发布的手动步骤都省了,只要代码通过了,手有测试,就能自动部署到生产环境上,全程不需要人工干预。 那我们再来看一下 c c d 的 流程。第一步就是开发,写代码,写完提交到代码仓库,然后 c a 工具自动触发,拉取代码,做检测、翻译测试。第三步,测试通过后,自动打包成现成的版本。第四步,持续交付,把版本包放到上线仓库, 等待手动发布。持续部署则是自动把版本包部署到服务器,直接上线。最后,我们要说 c a、 c d 的 实际价值,这是面试的时候必问的点,以前没有 c a、 c d 的 时候,开发代码 合并靠手动容易冲突,测试靠人工,效率还低,容易出错。但是有了 c a、 c d 之后,这些步骤完全自动化,冲突能更早发现,测试能更高效,上线也能零失误。 所以总结下来, c a 是 持续集成, cd 是 持续交付和持续部署。这些基础的概念看似很简单,却是学习运维前的第一步。散会前多说一句, 不要自己瞎琢磨,授人以鱼不如授人以渔。我把我当年的笔记整理出来了,还有几百节内部视频,从怎么安装到项目怎么做,手把手的教学,学会之后达到我这种水平完全没有问题。只要是我粉丝,扣三个一我分享给你。

那所以接下来就是编一原理最核心的一个内容,它会贯穿始终,叫什么呢?叫 a s t, a s t, 全称叫 abstract, abstract c text tree 叫抽象语法数啊,抽象语法数 好,如果大家对于抽象语法数这个点不理解的话,那我给大家举另外一个例子,就直接什么呢?类比于大家都知道的 dom 数, 那 dom 树,它的结构, dom 树是干什么呢?同学们知不知道 dom 树是用来描述 dom 结构的?好,那接下来我们再进一步,那抽象语法树呢? a s t 是 用来干嘛的?它是用来描述代码结构的 啊,用来描述代码结构。好,描述代码结构。那如果我现在让你来去描述我这一段代码,我们先来简单的啊, const a 等于一,我怎么样去描述这段代码呢?我们有工具,有什么工具有对应的 babel 工具,我给它拿出来, a s t explorer, 我把这个先给它拿过来,这个大家后面也可以自己去看一看。这个工具很好用的啊,我们直接 const a 等于一,你看普普通通的一段代码,它就会帮你去生成这样一个 json 结构,这个 json 结构最终这个对象,它就是用来去描述你这一串代码的一个 具体的阶梯数据。这个就是 a s t, 叫抽象语法数啊,这个叫抽象语法数。好,那对应到这个抽象语法数,它是不是只有一个版本呢?并不是,它有很多种,有 babel 的, 有 type script 的, 它们都不一样,那它们的抽象语法数都不一样。所以为什么 这个 void zero 啊?就是尤玉熙现在搞这个公司,他想要去把整个工具链做一个统一,就是为了 a s t 啊,还有这些关键工程化环节上面的一些内容能够附用,这是它最大的一个目标原因啊。好,那这个对象的话,就是我们讲的 a s t, 它可以去 清晰地描述你这段代码的结构。那假设这样子的啊,那如果说我们是 babel 的 pass 的 话,它的结构就是这样。 首先它是一个变量声明,同学们来看是吧?变量声明,声明什么呢?它的类型是什么呢? const, 怎么声明的? variable, declaration decorator。 好, 然后呢?就是数字,那叫 numerical, 那 然后呢?是一,所以最终你的结果就是 const, 那然后呢? a 等于一这个结果, a 是 identify, 然后呢? american literal 是 你的结果一,所以最后它们连起来就是 const, a 等于一这个结果啊,这部分结果。

hey, 大家好,今天我们来聊一个特别酷的项目,你想过没有,用 rust 完完全全地用 rust 来写一个 chrome 扩展, 听起来是不是有点疯狂?但 oxide chrome 这个项目就把这事给办成了。它就是一个让你能用 rust 写出类型、安全,而且还能编辑成 web assembly 的 chrome 扩展的框架。 好,要想搞明白 oxymoron 到底牛在哪,咱们得先看个老朋友毁掉地狱。估计写过前端的朋友们看到左边这个代码, dna 都动了吧,一层套一层,简直是噩梦。 现在你看右边,这是用 oxecrom 写的 rust 代码。哇,一下就清爽了。标准的 a sync slash、 await 代码,从上到下,逻辑一目了然,而且最重要的,编码器会帮你检查类型,安全感爆棚。这可不只是韵法堂啊,这完全是两个时代的开发体验。 所以你看 oxecrom 的 目标就特别直接了,让你少写废话代码,多做有用的事儿,交付出来的扩展也更稳定。 而且最耍的一点是啥?就是你一个字母的 javascript 都不用手写了。没错,零手写 js ok! 今天咱们的路线图大概是这样,先看看老方法斜扩展有多痛苦,再聊聊 oxychrom 是 怎么解决这些问题的。然后呢,我们会深入它的架构和那些神奇的红。当然了,光书不练假板式,我们还会一起写个小例子,最后再拔高一下,看看这东西到底为什么这么重要。 行,第一站,咱们先回到过去,看看传统的开发方式。天呐,那叫一个折腾,你得手写一个 manifester jason, 这玩意语法要求贼严,少个逗号,整个扩展就直接罢工。 然后呢,您还得写一大堆 javascript 的 胶水代码,就是为了把背景桥啊、弹窗啊、事件监听器啊这些玩意给粘在一起。这个过程怎么说呢,又繁琐又特别容易出 bug, 好吐槽。完了旧时代,我们来看看第二部分, oxymoron, 这才是现代化的解决方案,它的核心思想就是给你一个统一的类型、安全的环境。也就是说,你从头到尾就待在 rust 的 这个舒服的生态里,哪儿也不用去。 那他到底是怎么做到这么爽的体验的呢?关键就在这几个特性上。首先,他用了 rust 的 过程红,这东西极大地改善了开发体验,我们后面会细讲。然后,所有的 crow api, 它都给你包了一层类型安全的接口。代码呢,全部编入成高性能的 web assembly。 ui 方面,它集成了 laptops 这个响应式框架。最后,你只需要一个命令,就能完成所有构建工作。当然,最关键的还是那句话,零手写 java script。 好, 各位坐稳了,现在我们要进入今天最硬核的部分了,架构深浅,我们来看看这东西内部到底是怎么运作的。 octrom 设计得非常漂亮,它的强大之处就在于它的职责划分特别清晰, 整个项目其实是由五个独立的 cray 组成的,它们各司其职,配合得天衣无缝。 大家看这张表,这里面藏着 oxymoron 最核心的设计哲学,我称之为两阶段构建。咱们一步步来看。首先是翻译时 oxymoron, microsoft 这个 cray 会干活,它会解析你写的那些宏,然后生成 wisem binding 需要的导出函数。 好,这是第一步。然后是运行时, oxecrom core 提供了跟 chrome api 打交道的底层 rust 的 封装,但真正的黑魔法发生在构建阶段。这时候 oxecrom build 这个 crate 会再次解析你的原作成。 注意,它不是去翻译,而是把你的代码当成纯文本来读,从中提取出像版本号,全网本来读,从中提取出像版本号,全网本来读,然后用这些信息去生成 manifest, json 和那些烦人的 js 胶水代码。 这个设计最牛的地方在哪?它把你的 rust 代码变成了唯一的单一事实来源。你再也不用担心代码改了配置忘了改,所有的一切都由红和构建工具自动同步,从根源上杜绝了配置出错的可能,这就是架构之美 好。刚才我们提到了红这个黑魔法到底是怎么回事呢?这就来到了我们的第四部分,红的魔力。 简单来说, rust 的 过程红就是一种圆编程,它允许你的代码在翻译的时候去生成另外一些代码。这正是 occm 能帮你消除那么多重复工作的秘密武器。 我们来看第一个关键红 at occm extension, 它的作用非常简单直接,就是用来定义你这个扩展的身份证,比如它叫什么名字,版本号是多少,需要哪些权限等等。 然后构建工具就会读到这些信息,自动帮你生成那个 manifest 到 json 文件。你看,在代码里,你只要在一个空的 struct 上面像这样加上一个属性红就行了。 所有的配置信息都明明白白地写在 rest 代码里,而且还是类型安全的,你想想,这跟你手动去抠那个 json 文件相比,是不是又清楚又安全?简直天壤之别。 然后,咚!当这就是结果。我们上一页写的那么点 rust 代码,一构建,就自动生成了这么一个完全标准的 manifest 点 json 文件,从 rust 到 json, 整个过程全自动无缝衔接,是不是很酷?好,我们再来看第二个重要的红。 这个红是干嘛的呢?它专门用来帮你注册 chrome 事件的颠挺器,你只要把它加在你的异步函数上,它就会在背后帮你做两件大事, 第一,生成底层的 wasn't bender 导出代码。第二,也是更关键的,自动生成所有必要的 gs 胶水代码,把你这个 rust 的 函数和对应的 chrome 事件给绑起来,这些脏活累活它全包了。 所以你看,在代码里就变成了这样。你只需要在你的异步函数上简单地加一个属性,比如 runtime, iphone uninstalled, 那 么这个函数就会在扩展被安装的时候自动执行。你的代码意图超级清晰, 所有那些复杂的事件注册逻辑全都被这个红给封装好了。 ok, 理论讲了这么多事后动手了。我们进入第五部分,来真刀真枪地写一个扩展。我们就用一个最经典的计数器例子,看看从零开始悟步之年,怎么搞定一个能用的扩展程序。 整个流程特别简单,就这么几步,第一,安装它的命令行工具。第二,用命令行工具出使画一个项目。第三,写你的 rust 代码。 第四,运行构建命令。最后一步,把生成出来的那个 disk 文件夹拖到 chrome 里加载就行了。搞定 好,我们直接来看代码,首先还是老样子用。首先还是老样子用。 add extension 红定义我们扩展的名字,并且声明我们需要用到 storage 权限,因为要存那个技术值嘛。 然后我们用 add on runtime on installed 注册了一个聆听器。这个函数的作用就是当用户第一次安装这个扩展的时候,我们往存储里写入一个叫 counter 的 键,给他一个出示值零,这样就做好了初步化。 接下我们来看 ui 这块儿。这里我们用到了 laptops 框架里的一个核心概念,叫做 rw signal, 你 可以把它理解成一个会魔法的变量,它不只是存着我们那个计数器的数字,更重要的是,一旦你改变了它的值,界面上所有用到这个数字的地方都会自动更新,你不需要手动去操作动物, 这就是所谓的响应式编程。那么问题来了,我们的 ui 组建怎么拿到一开始存好的那个技术值呢?你不能直接在组建函数里调用异步 api, 那 不符合相似编程的规则。所以这里我们用到了 laptops 提供的另一个工具 effect, 你可以把 effect 理解成一个副作用处理器,它会在组建第一次渲染的时候执行一次你传给他的代码。所以我们就在这里面安全地启动一个异步任务,去调用 oxymoron 的 storage get, 把那个技术值给读出来,然后用读到的值去更新我们刚才说的那个 count 信号, 这样初始状态就加载好了。最后当用户点击那个增加按钮的时候,这个 increment 函数就会被调用。他干了两件事儿,逻辑非常清晰, 第一,它更新了 count 这个信号的值,这一步会立刻让界面上的数字加一。第二,它又启动了一个异步任务,把这个新的数字通过 oxycrom storage 点 sent 再写回到 crm 储储存里去,这样就保证了数据被持久化。下次打开弹窗,数字还是对的。 好了,代码也看完了,我们来到最后一部分,聊一聊这整套东西到底为什么这么重要。 在我看来啊,它可能真的代表了浏览器扩展开发的未来。它的优势主要体现在三个方面, 第一,类型安全。这意味着很多低级错误在翻译的时候就被干掉了,你不用等到半夜上线了才发现 bug。 第二, web assembly 带来的性能,你的核心逻辑能以接近原生的速度运行,而且还自带杀伤,更安全。 最后,也是我觉得最重要的一点,就是无与伦比的开发者体验。你不用再在 javascript、 jason、 html、 css 之间来回切换了,就安安心心地待在 rust 的 世界里,用它强大的工具链和生态,这就够了。 所以,最后让我们用 oxymor 夏末自己的口号来做个总结,我觉得他说得特别到位,用过程宏和 leptos 来写类型安全的 chrome 扩展翻译到 webassembly, 全程零手写 javascript。 这其实也给我们所有开发者留下了一个很有意思的问题,值得我们去思考。当 javascript 不 再是你开发浏览器扩展的瓶颈时,你能用这些新工具去创造出怎样更强大、更复杂的应用呢? 我想这正是 chromix 这样的项目为我们打开的一扇新的大门。