大多数我发布的工具都只是一个HTML文件。内联CSS、内联JavaScript,没有构建步骤,没有打包器,没有CDN,没有npm安装。你下载文件,打开它,它就能运行。离线、永久,在任何浏览器上都能用。
到现在我已经用这种方式做了几百个工具。我想把这种约束到底带来了什么、又牺牲了什么说清楚,因为互联网上对“我该不该用框架”的默认回答,往往是非此即彼的,没什么帮助。
![]()
零依赖腐烂
一个没有依赖的文件,就没有什么可坏的。没有传递性漏洞警报,没有废弃的包,没有因为工具链升级而停止工作的构建。我两年前写的工具今天打开,行为完全一致。如果你维护过任何带node_modules目录的项目超过几年,你就知道这值多少钱。
分发就是一个文件
没有托管,没有部署流水线,没有运行时间。你可以邮件发送它,放进U盘,提交到仓库,丢进Slack频道。它从file://协议直接运行。对付费工具来说,这就是整个产品:客户拥有这个产物,不会因为我做的任何事情而失去访问权,包括我倒闭。
真正的隐私,不是隐私政策
没有服务器,就没有服务器端日志。用户输入什么,就留在他们自己的标签页里。对于任何涉及文档、密钥、财务数据或客户工作的东西,“这不可能离开你的机器,因为它没有地方可去”这句话,比一个承诺要强得多,而且一句话就能解释清楚。
不用费力就能得到的速度
一次请求,没有水合,没有瀑布式加载。没有什么可优化的,因为本来就没有什么可优化的。
可审计性
查看源代码,整个程序就在你面前。对安全工具来说,这是一个真正的特性。任何人都可以一口气读完整个程序。
但如果我把这说成是免费的,那就是在撒谎。
没有共享状态
每个文件都是一座孤岛。在一个文件里修好的bug,只在这一个文件里修好。我用生成和模板化而不是运行时共享来解决这个问题,这等于用构建时的纪律换掉了运行时耦合。而这个交换之所以成立,只是因为我让工具保持足够小。
文件之间没有组件复用
同一个页头写在八十个文件里。当页头设计变了,八十个文件都要改。还是那句话:靠工具化,不靠架构。
复杂度有真实上限
这种做法在某个点之前都很好用,过了那个点就不行了。任何需要认证、跨设备持久化、协作,或者真正复杂状态的东西,都不应该做成单个文件。我大致把上限设在3000行左右,一旦某个东西想越过这条线,那就是一个信号:它想成为一个真正的应用了。
没有生态
没有组件库,没有状态管理,没有路由。对大多数单一用途的工具来说,你根本不需要这些。而如果你确实需要,那和上面是同一个信号。
我实际使用的规则
当问题能装进一个屏幕的概念里时,就用单个文件。计算器、转换器、检查器、生成器、格式化器、分析器。一个输入,一些处理,一个输出。
一旦它需要登录或者数据库,它就不再适合这个形态了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.