写点什么

不需要更多 JS 框架了

  • 2014-12-28
  • 本文字数:1564 字

    阅读完需:约 5 分钟

现在,JavaScript 框架已成为 Web 项目开发不可或缺的一部分。那是因为很长一段时间以来,各种浏览器之间有很大的差别,人们不得不编写框架对此进行屏蔽。问题在于,各种浏览器甚至在基本问题上都难以取得一致,以致框架还要针对浏览器该如何工作设计自己的模型,比如如何传播事件、如何与 DOM 交互等。于是出现了许多框架,常见的有 jQuery、Dojo、MochiKit、Ext JS、AngularJS、Backbone 、Ember、React 等。对于这种情况,谷歌工程师 Joe Gregorio 博文中写道:

我认为是时候重新考虑 JS 框架模型了。没有必要发明另外一种做事方式,只要使用 HTML+CSS+JS 就行了。

Joe 认为,在过去的十年中,浏览器变得更好了,它们对标准的支持也得到了改善,每个版本的功能都比上一个版本强大,而且还支持一些新标准,如 HTML Imports Object.observe Promises HTML Templates 。而人们之所以还在编写 JS 框架,可能是出于惯性和习惯。

在进一步阐述观点之前,他对 Web 框架相关的三个概念进行了简单的区分。Gist 是一段简单的代码,库是一个更大代码的集合,而框架不只是库的简单集合,它还有自己的事件、DOM 交互模型。接下来,他说明了不需要 JS 框架的原因:

  • 框架是对 Web 平台的抽象,但由于存在“抽象漏洞(abstraction leak)”,开发人员有时候必须诉诸于 HTML+CSS+JS,而且有时候还需要深入研究框架才能找出问题所在。这样一来,开发人员除了要学习 HTML+CSS+JS 之外,还需要花费大量的时间学习和研究框架。
  • 框架的另一个卖点是可以利用 Widgets 库,而实际上,框架并不是必须的,每个 Widget 都应该是独立的。语法高亮代码编辑器 CodeMirror 就是一个很好的例子。它用 JavaScript 构建,可以用在任何地方,而不需要框架。
  • 框架提供的数据绑定特性并不是必须的,即使需要,也应该以库的形式出现,而不是框架。
  • 框架最终会发展成为一个筒仓,为 A 框架创建的 Widgets 不能用于框架 B,这会造成浪费。

Joe 提出,后 JS 框架时代的基本思路是,开发人员应该使用 HTML+CSS+JS 的功能构建 Widgets。这些 Widgets 相互独立,可以组合使用。 Web 组件为这一切提供了可能。HTML Imports、HTML Templates、Custom Elements 和 Shadow DOM 等技术允许开发人员创建可重用的元素和功能。要了解更多信息,请查看下列文章和库:

而使用 Web 组件首先要有针对相关功能的 Polyfills。他特别强调,Polyfills 并不是框架,它们没有引入自己的 Web 开发模型,而是使 HTML 5 模型可用。同时,它们也弥补了浏览器实现与现有标准在某种程度上的偏离。 MDN 上经常有一些简短的、单功能的Polyfills

构建一个大型的HTML 5 Polyfill 库是有好处的,但更好地是能有一套工具可以根据项目需要生成一个完整HTML 5 Polyfill 库的子集。这样,开发人员就可以混合和匹配不同来源的Web 组件和库,如X-Tag 的和Polymer 的。关于如何获取这些自定义元素,感兴趣的读者可以查看 Brick 的 GitHub 页面 X-Tag 下载页面。Joe 指出,这并不是说创建自定义元素就需要创建自定义的打包器,那不是一个具有可扩展性的思路,而是说需要改变开源方式,一个 Widget 可以不是一个项目,一种更加轻量级的、类似 Gist 的共享方式可能更合适。在这方面,项目 Asset Graph 也许是个不错的开端。所以,他认为,现在需要三样东西:

  1. 构建可重用组件的习惯做法和指南;
  2. 可以遵循这些习惯做法编译 HTML、CSS 和 JS 的工具;
  3. 可扩展的 HTML 5 Polyfill,可以根据需要进行裁剪。

按照 Joe 的观点,将来,开发人员不再需要学习最新的框架,只需要引入能够满足特定需求的自定义元素或库来构建他们的应用。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-12-28 07:198323
用户头像

发布了 1008 篇内容, 共 448.1 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

阿里云张新涛:异构计算为数字经济提供澎湃动力

阿里云弹性计算

XR 元宇宙 视觉计算

mark:vscode 无法远程访问连接

webrtc developer

vscode

[Day44]-[回溯]-括号生成

方勇(gopher)

LeetCode 回溯算法 数据结构算法

使用 Provider 改造屎山代码,代码量降低了2/3!

岛上码农

flutter ios 安卓开发 跨平台开发 5月月更

干货| 四种渲染到底是啥?终于有人讲明白了!(下)

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

[Day43]-[回溯]-解数独

方勇(gopher)

LeetCode 数据结构算法

M-DAO开辟区块链全新战场,或成DAO赛道龙头

小哈区块

linux之sed使用技巧

入门小站

Linux

直播预告丨OpenHarmony标准系统多媒体子系统之视频解读

Anna

OpenHarmony

DPU芯片企业中科驭数加入龙蜥社区,构建异构算力生态

OpenAnolis小助手

芯片 生态 龙蜥社区 CLA 中科驭数

小红书信息流推荐多样性解决方案

小红书技术REDtech

推荐 SSD 多样性 KDD

在线文本代码对比工具

入门小站

工具

css 学习笔记【三】浮动,不脱离文档流,继承和层叠

恒山其若陋兮

5月月更

银行需明确低代码与无代码开发平台差异,以在技术上降低试错成本

易观分析

银行

SPDK QOS机制解析

天翼云开发者社区

JVM进阶(十六)——JAVA 双亲委派模型

No Silver Bullet

类加载 双亲委派模型 5月月更

Hoo研究院|币海寻珠—5月区块链行业投资机构动向(上)

区块链前沿News

区块链 投资 虎符 Hoo

Redis「8」实现分布式限流与延时队列

Samson

redis 学习笔记 5月月更

中国电子云数据库 Mesh 项目 DBPack 的实践

峨嵋闲散人

分布式事务 分库分表 读写分离

首发!高性能数据访问中间件 OBProxy(一):功能模块及特性详解

OceanBase 数据库

oceanbase

天翼云高可用虚拟IP(HAVIP)实践

天翼云开发者社区

时序数据库在桥梁监测领域中的应用

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

六、云原生可观测性

穿过生命散发芬芳

可观测性 5月月更

在线HTML转Excel工具

入门小站

工具

Liga 讨论: ToB产品可不可以免费?

LigaAI

SaaS

大画 Spark :: 网络(7)-Spark网络中的“四次握手”Executor注册到Driver过程中的TransportClient与细节过程

dclar

大数据 hadoop spark 架构设计 源代码

netty系列之:在netty中使用native传输协议

程序那些事

Java Netty 程序那些事 5月月更

不需要更多JS框架了_JavaScript_谢丽_InfoQ精选文章