跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) LLM(84) angular(83) 大语言模型(67) 人工智能(56) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(34) Go基础(29) Python(24) Vue(23) Web开发(20) 深度学习(20) Web技术(19) 精选资源(19) Java(19) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) LLMOps(11) 聊天机器人(11) 安卓(11) ChatGPT(10) typescript(10) 资料精选(10) mlops(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) RAG(9) Go语言中级开发(9) 自然语言处理(9) PostgreSQL(9) 区块链(9) 安全(9) 全栈开发(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 智能体(7) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) 提示工程(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 生成式AI(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) kafka(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) nextjs(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) RAG架构(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) 编程语言(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 模型评估(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) 数据分析(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

我最近遇到一个论点,认为新的web开发不应该使用前端框架(Angular、React、Vue等),因为要跟上新版本的依赖关系,需要承担维护负担。理由是这种维护负担是不合理的,因为大多数应用程序不再需要前端框架了。

这是真的吗?让我们在一家中大型公司的典型开发车间的背景下研究一下这一说法,该公司负责许多应用程序,包括面向企业和面向消费者的应用程序。我将使用Angular作为我的框架示例。

从不需要框架

争论的关键在于,由于JavaScript、CSS和浏览器功能的进步,不再需要框架。但我认为这在一定程度上夸大了事实。做任何事情都不需要框架。前端框架提供JavaScript(JavaScript中嵌入HTML)和CSS。因此,框架从来没有做过单独使用JavaScript/CSS无法完成的事情。他们只是让这些事情变得更容易,因此速度也更快。

它与非常相似。NET框架。什么时候NET发布后,它所能做的一切都是C/C++所不能做的。这个NET框架使它更容易,因此可以更快地进行Windows开发。我还记得当时的一些反击。NET源于C/C++开发人员,他们认为你应该咬紧牙关学习C/C++。我记得一开始我觉得自己有点不如那些开发人员,因为我使用的框架的既定目的是让事情变得更容易,这感觉像是“作弊”。

但企业希望快速见效。因此,一个使开发更容易、更快的框架将流行起来,这就是发生的事情。NET。很难证明在什么时候投入时间来学习和开发C/C++是合理的。NET要容易得多,这正是公司所寻求的。

我认为前端JavaScript框架的情况过去(现在)是相似的。当然,你可以用简单的JavaScript/CSS/HTML做任何事情,但当有更容易学习和实现的替代方案,并且可以更快地提供解决方案时,很难不走这条路——至少对于那些必须用有限资源提供许多应用程序的公司来说是这样。

框架功能

诚然,JavaScript和浏览器功能已经取得了进步,其中许多都是由前端框架驱动的。ES6对类和模块的支持为我们提供了一种用纯JavaScript构建代码的方法。创建封装功能并通过自定义事件进行通信的自定义元素的能力使我们能够创建可重复使用的组件。这些进步使使用普通JavaScript的开发比过去更容易。

但我不相信,在快速构建复杂的web应用程序方面,普通JavaScript与前端框架不相上下。

例如,让我们看看计数器组件的自定义元素示例。计数器组件是您可以实现的最简单的反应组件之一,通常用于演示目的。左边是计数器组件的实现,它是一个只使用普通JavaScript的自定义HTML元素。右边是使用Angular组件(v17)的相同实现。

自定义图元和Angular构件之间的比较

Angular组件使用的行数不到自定义元素的一半。此外,Angular生成了组件的样板,因此我只需要在红框中编写代码。此外,使用Angular解决方案,我可以选择将模板移动到自己的HTML文件中,这是我非常喜欢的。如果我们看到最简单组件的实现有这么大的差异,那么复杂组件会是什么样子?

另一件需要注意的事情是,Angular在将值注入DOM之前会对其进行净化,以防范XSS漏洞。这对这个组件来说不是必要的,但对许多其他组件来说是必要的,这是团队必须以可重用的方式为自己实现的功能的一个例子。

此外,JavaScript不是一种类型安全的语言——也就是说,直到运行时才会发现类型错误,而且你几乎没有得到有用的智能感知。类型检查是否重要是一个单独的话题,但许多人认为它是重要的,这就是为什么Angular使用TypeScript来进行编译时类型检查并提供强大的智能感知。当然,您可以在不使用前端框架的情况下使用TypeScript,但您必须自己处理转换。

最后,像Angular这样的框架提供的不仅仅是一种更容易创建自定义组件的方法。它们还提供服务和其他功能。仅举一个例子,在Angular中,很容易创建一个可以用来修改所有HTTP请求的拦截器。这样的拦截器对于添加API调用的身份验证头值等操作非常有用。让我们在下一节中看看我们如何自己实现这样的东西。

依赖关系不会消失——它们只是发生了变化

让我们回到上一节中刚刚提到的HTTP拦截器的例子。如果我只是使用普通的JavaScript,我将如何实现这一点?

起初,我可能会在提出请求的任何地方重复逻辑。我很快就会意识到我违反了DRY原则,我会把这个逻辑移到一个共享模块中,然后把这个模块导入到我想使用的任何地方。但后来我会意识到,我希望我公司的其他应用程序都能使用这个功能,所以我会把它做成一个库,这样所有应用程序都可以以版本化的方式使用它。

然后我会意识到不同的应用程序有不同的用例,所以我需要对代码进行配置,以便它能在不同的场景中工作。然后我会意识到,能够对同一个请求多次执行此操作会很好,因此我会想出一种方法,将多个更改应用于同一请求,并按照开发人员确定的顺序执行。

每次我对库进行更改时,我都必须了解使用库的不同方式,并注意不要破坏现有的实现。如果本机webRequest浏览器API以某种基本的方式发生了变化,或者被其他东西取代,我将希望利用库中的这些变化。事实上,如果某些更改影响了浏览器支持,即浏览器更新将导致我的解决方案不再工作,我可能会被迫做出这些更改并迅速做出。

但我可能无法以100%向后兼容的方式做到这一点。因此,在这种情况下,我将不得不保留向后兼容的实现,同时还要实现一个新的解决方案,并找出迁移库的使用者的方法。所有这些都是在没有任何第三方依赖关系的情况下进行的。但现在我所在组织中的应用程序依赖于这个库,我必须自己维护它。显然,这只是共享功能的一个例子,当然还有很多其他例子。

接受开放标准是好事

但我确实认为,如果我们能够做一些得到本土支持的事情,我们就应该尝试本土做。我相信Angular同意这一点,随着JavaScript、CSS和浏览器的发展,他们会定期放弃自己的自定义实现。

例如,一旦不再需要自定义解决方案,他们就不赞成使用自定义的flex box解决方案,而赞成使用纯CSS。他们还介绍了一种配置HttpClient以使用本机fetch API的方法。Angular也不再使用自己的模块,因为ES6支持这些模块。

结论

我们是使用别人提供的解决方案,还是推出自己的解决方案?这不是一个新问题。一般来说,我认为公司选择使用其他公司提供的解决方案来加快开发,因为他们没有资源(在技能或数量方面,或者两者兼有)来实施自己的解决方案。

然而,这确实带来了一种权衡,即您必须跟上引入的依赖关系。但我认为,对于许多实现企业应用程序的公司来说,平衡仍然有利于使用前端框架。

文章链接