什么是框架?


假设你正在构建一个小型网络应用:账户、信息流、设置页面。在你自己的想法出现在屏幕上之前,你需要将 URL 转换为页面的代码、与数据库通信的代码、保护密码安全的代码,以及当某些内容改变时重新绘制屏幕的代码。这些都不是你的应用的核心想法。每个应用都需要它,而且大多数内容在项目之间基本相同。
你可以自己编写所有这些基础设施代码,人们确实这样做过,多年来都是这样。这很慢,微妙的 bug 就隐藏在其中,每个团队最终都会得到一个略有不同、略有破损的相同机制版本。框架是积累的答案:共享的基础设施代码,经过一次编写并由数千个项目强化,以告诉你自己代码放在哪里的结构打包。你构建使项目成为你自己的部分;框架处理每个项目重复的部分。
框架不是网络专属的东西。它们存在于构建程序的任何地方,本章讨论的是这个想法本身,适用于任何语言和任何领域。
什么是框架(和什么是库)
这个词使用得很宽泛,所以这里是真正重要的区别,在代码中:
// 库:你的代码负责,在需要时调用库。
const label = dateLibrary.format(order.createdAt, "MMM D");
// 框架:框架负责,调用你插入的代码。
export default function OrdersPage() {
return listOfOrders();
}第一行是你在掌控:你的程序运行,它为一项工作借用工具。第二行则不同。你永远不会自己调用 OrdersPage。你编写它,将其放在框架期望的位置,框架在正确的时刻调用它,这里,当访客打开订单页面时。
这个转变有一个名字:控制反转。对于库,你的代码控制程序的流程并借用辅助工具。对于框架,框架控制流程,你的代码填充它为你留下的空白。一个有用的简化说法:你调用库;框架调用你。
同样的形状出现在编程的每个角落。Django 接收网络请求并调用你的视图函数。Flutter 运行应用并询问你的小部件要绘制什么。Unity 运行游戏循环并每一帧调用你的脚本。pytest 找到你的测试函数并为你运行它们。不同的领域,一个想法:框架拥有引擎,你提供它被设计来容纳的部分。
如果图片有帮助的话:库就像一个工具箱放在你身边,当工具有用时你就伸手进去。框架更像一栋建筑的框架,当你到达时已经站立。墙壁、电气和管道有其位置,你的工作进入使建筑成为你自己的房间。两者都为你节省了努力;区别在于谁决定了建筑的形状。
框架给你带来什么,花费什么
框架的案例是具体的。需要花费你数周时间的问题已经解决了,并由首先遇到硬边缘情况的人解决:密码处理、表单验证、路由、渲染。你的项目得到一个新队友可以在几分钟内认出的结构,因为它与该框架上的所有其他项目的结构相同。你继承了一个生态系统:插件、教程、回答的问题和已经熟悉其内容的人的招聘库。
成本同样具体,值得同样直视。框架是一个你无法控制的大型依赖,有自己的 bug、自己的步伐和自己的观点。在你的第一页呈现之前有一个学习曲线,你学到的一些是关于框架的知识而不是关于编程的。你的代码弯曲适应它的形状,这使得你停留越久就越难离开。框架会移动:主要版本到来,模式被重新考虑,保持更新是你在普通代码中没有的持续工作。
两个列表都不能单独赢得胜利。平衡完全取决于项目,所以对任何框架要问的问题是"这个框架是否让这个项目更简单"。框架通过让你的项目更简单来证明其价值。 当它这样做时,乐意使用它。当它没有时,接下来的两章是关于尽早认出这一点。
接下来的内容
有了这个想法,自然的下一个问题是实际上那里有什么:框架的类型参观主要系列,从网络到游戏到测试,以及每个中最受欢迎的选项。之后,选择和学习框架变得实际关于选择一个、学习一个,以及知道何时根本不需要一个。如果上面的 JavaScript 例子感到陌生,JavaScript 轨道涵盖了语言本身,这是在任何在其上构建的框架之前的正确第一步。

