QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

Web 平台能从 Node.js 学到什么

  • 2015-12-24
  • 本文字数:2480 字

    阅读完需:约 8 分钟

Will Binns-Smith 是一位热爱 JavaScript 的全栈工程师,喜欢通过技术来解决实际问题。他开发了 Bonobos.com 的前端购物车功能。Will 喜欢与设计师一对一工作,将 PC 网站转换为针对更小的触摸设备的站点。近日,Will 撰写了一篇文章,谈到了Node.js 有哪些做法和特性值得Web 平台学习。

作为一名Web 开发者,我们会非常感激jQuery 之类的库,因为他们消除了底层平台的各种不一致与笨拙的情况。曾几何时,构建一个XMLHTTPRequest 对象需要好几行代码,但现在只需一行$.ajax 调用即可;通过jQuery 与DOM 交互很少需要我们针对特定的平台采取一些非常规手段,因为这一切jQuery 都帮我们做好了。

使用过Python 或是Java 语言的开发者都知道这些语言自带了标准库。在浏览器端,jQuery 就是这样的标准库,此外还有诸如underscore 之类的工具集。就像大多数标准库一样,我们所编写的代码都会严重依赖于他们。当越来越多的代码开始依赖这些APIs 时,我们就很难在不破坏既有Web 的情况下向前迈进了。不要妄图为了兼容性而包含进这些库的多个版本,他们常常会有30KB 的大小,而且默认情况下会向全局的window 对象写入。

过去,我认为这是软件开发不可避免的一个问题。但现在一切都变了,至少对于我来说是这样的,因为Node.js 生态圈出现了。

小模块与组合的出现

Node 是一个构建在 Chrome V8 引擎之上的 JavaScript 运行时,它几乎没有多少标准库。相反,其他生态圈中的那些标准库都不在其核心平台中,而是通过 npm 获取的。

在 npm 中,小模块已经成为了标准,像是 substack Sindre Sorhus 这样的用户分别已经发布了 685 和 760 个模块,这些模块都遵循着 UNIX 一次只做一件事,并将这件事做好的原则。像是 array-union(返回两个数组的并集)与 svg-create-element(提供了用于在 DOM 中创建 SVG 的优秀 API)这样的模块都是非常小的,看起来应该与语言或是平台一同发布。

Sindre 甚至还有一个名为 negative-zero 的模块,它只是判断一个值是否是 -0,实现只有一行代码。看起来为这样简单的功能创建一个包有些极端,因为用户可以在自己的代码中实现这样的功能,不过通过这种方式,我们可以集中修改代码,而不必重复实现细节。Sindre 对此有个很详尽的介绍,感兴趣的读者可以看看。

甚至连非常流行的 Express Web 框架也只提供了 Web 应用的核心功能而已。与诸如 Ruby on Rails 或是 Django 这样的大型框架不同(本身带有模板、ORMs、csrf 防护,以及其他特性),Express 本身只提供了托管静态文件的中间件。相反,应用开发者可以自由使用他们喜欢的这些特性的实现,并将其组合起来创建应用。随着想法的不断改进,很多中间件包创建又消亡,一些发展起来了,另一些则消失了。这就是Node 的哲学。

因此,小模块(以及由这些模块所构成的应用)会拥有非常庞大的依赖图(比如说,Bitbucket 的前端包含了1000 多个JavaScript 模块,其中一些是内部模块,另外一些则来自于npm)。

这些模块最棒的一点就是他们并没有紧密绑定到平台上:他们不会受到标准库的影响,借助于语义版本化,他们可以对其API 进行迭代而不会对依赖他们的用户造成困扰。

流介绍

Node 包含了流,它是异步流动数据的一个抽象,常常用于连接和转换 I/O 源。Node 对流的初始实现(随 Node 0.4 发布)并不完善,使用不当会导致数据丢失。为了解决这一问题,Node 0.10 对流进行了修正(也叫做Streams2)。不过,Streams2 并不是对流模式的一个简单迭代,实际上在Node 0.10 发布前经历了很多的变化。在发布时,它与运行在Node 0.8 上的应用兼容。

这怎么可能呢?Streams2 源自于 readable-stream 模块,一开始它就是 Isaac Schlueter在2012 年7 月发布的独立模块,这距离 2013 年 3 月它随着 Node 0.10 的发布已经相隔很长时间了。它经历了多次迭代,在这个过程中 API 与功能也不断成熟,Node 社区发现它非常适合于作为流的实现。

时至今日, readable-stream 的最新实现也是作为用户模块在 npm 中维护的,可用于 Node 0.8 及之前的版本中。很多用户都喜欢使用用户模块而不是绑定的模块,这样可以实现生态圈的兼容性。

一系列不幸的APIs

与此相反,JavaScript 与Web 平台中现有的APIs 都是很难改变的。对JavaScript 语言的迭代变更(不能有任何的向后不兼容变化以防止现有系统出现问题)必须要通过添加新特性来实现。比如说,在发现Mutation Events API 的性能问题后,人们引入了Mutation Observers 来解决这个问题;废弃WebSQL,拥抱更加底层但使用起来却略显笨重的IndexedDB;逐步淘汰Application Cache,拥抱更加底层但更通用的ServiceWorker。Object.observe 是ES2016 的一个提案,通过它可以观测对象的属性,不过在React 的单向数据流逐步流行起来并为主流所采用后,Object.observe 提案则被撤回了。

对这些感到困惑么?我们不应该期待着一下子就将事情做对,不过我们需要一个平台,通过这个平台可以试错,然后逐步向好的方向迭代。

平台演化

可扩展的Web 宣言的支持者们希望Web 能够像Node 那样提供弹性的用户试错空间。其使命是让平台提供尽可能多的底层构建块,这样浏览器之外的库就可以自由尝试,从而避免正式的标准化流程所经历的代价高昂且冗长的过程。其中一种这样的底层原语就是 Web Components 的 APIs,它向开发者提供了通过 JavaScript 来创建动态自定义元素与属性的能力,这一切都是通过封装来实现的。一个库无论大小都实现了对话框功能,不过 API 的迭代可以交给用户来完成,一开始无需放在平台内部实现。借助于底层原语,用户可以通过小模块的形式自由探索更高层次的抽象。换句话说,我们不再需要AppCache 了。

幸好,我们已经看到了这种做法的好处。我们无需再陷入诸如AppCache 这种实际使用很少的特性了。相反,我们有了一个 Promises A+ Specification 的标准化实现,npm 中的 Q 已经证明了这一点,并且在年初已经成为了 ES2015 的一部分。WHATWG 也在制订流的规范,在很大程度上它受到了来源于 Node 的流的演化的影响。

就像平台的其他方面一样,这些新标准是很难改变的,不过幸运的是,其想法与 APIs 都是通过用户来实现的,这一切都要归功于 Node!

2015-12-24 06:402693
用户头像

发布了 88 篇内容, 共 266.1 次阅读, 收获喜欢 8 次。

关注

评论 1 条评论

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

Java单元测试浅析(JUnit+Mockito)

京东科技开发者

Java 单元测试 代码 JUnit Mockito

如何将Excel文档转换为PDF文档

Geek_249eec

Java Excel PDF

任务管理-轻松搞定 IoT 设备重启、资源包更新、固件升级等业务——实践类

阿里云AIoT

json 物联网 数据格式

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

亚马逊云科技 (Amazon Web Services)

数据库 存储

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

墨菲安全

漏洞分析 软件供应链安全

F5 分布式云服务为软银集团的私有基础设施带来云原生能力

F5 Inc

IoT 物联网平台如何实现 100万/秒 消息广播?——实践类

阿里云AIoT

小程序 监控 物联网 传感器 测试技术

数据治理如何做?火山引擎DataLeap帮助这款产品3个月降低计算成本20%

字节跳动数据平台

大数据 数据治理 数据研发 企业号 2 月 PK 榜

MQTT 5.0介绍

EMQ映云科技

性能 物联网 IoT mqtt 企业号 2 月 PK 榜

天翼云推出爬虫管理,助力企业安全高效发展

极客天地

软件供应链受威胁下的应对方法——供应链安全管理平台的五大工具能力

墨菲安全

SCA 供应链安全

CVE-2023-23752 Joomla未授权访问漏洞分析

墨菲安全

漏洞分析 软件供应链安全

接地电阻要小于4Ω,你知道是为什么吗?

元器件秋姐

科普 元器件 电阻 接地电阻

DevEco Studio端云协同开发之云数据库

白晓明

云数据库 HarmonyOS 端云协同

有没有夫妻相?刷一下脸就知道!

华为云开发者联盟

人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟

电信NB-IoT设备对接阿里云IoT平台实战——实践类

阿里云AIoT

大数据 监控 物联网 存储 数据格式

墨菲安全参与信息通信软件供应链安全社区成员大会并获自主研发创新成果奖

墨菲安全

供应链安全 安全情报

基于SpringBoot实现操作GaussDB(DWS)的项目实战

华为云开发者联盟

数据库 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

Python基础练习题(一)

漫步桔田

【监控运维】消息轨迹全景图详解-独门秘籍——实践类

阿里云AIoT

运维 监控 物联网 数据可视化 消息中间件

Python 基础练习题(二)

漫步桔田

NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

NFT Research

数据库 NFT

LoRaWAN设备接入阿里云IoT企业物联网平台实战——实践类

阿里云AIoT

物联网 传感器

智多星RPA重塑业务流程,全面赋能企业商业创新

YonBuilder低代码开发平台

被骂惨了!复旦版「MOSS」服务器挤崩,一口吃不成ChatGPT

引迈信息

人工智能 AI ChatGPT MOSS

TDengine 发布主流时序数据库对比分析报告,与 InfluxDB、TimescaleDB 展开全面对比测试

TDengine

tdengine 时序数据库 数据库·

研发效能DevOps推荐书单

laofo

DevOps cicd 研发效能 持续交付

PDF电子书下载 和 企业物联网实例 视频讲解——实践类

阿里云AIoT

运维 监控 物联网

CodeArts Repo:6大特性助力企业代码稳定可靠安全无忧

华为云开发者联盟

云计算 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

如何有效的解决代码的圈复杂度

京东科技开发者

代码 计算 圈复杂度 点边计算

脑洞|ChatGPT加持下,ChatOps将如何革新团队协作与运维管理?

极狐GitLab

团队管理 DevOps 团队协作 ChatOps ChatGPT

Web平台能从Node.js学到什么_语言 & 开发_张龙_InfoQ精选文章