写点什么

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:402671
用户头像

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

关注

评论 1 条评论

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

Sitemap的重要性

源字节1号

软件开发 网站优化

如何优雅的记录操作日志

flyhero

Java Spring Boot 后端 造轮子 4月月更

去中心化的 React Native 架构探索

Shopee技术团队

前端 去中心化 React Native

STI生态迎来新进展,登录Gate.io意味着什么?

西柚子

初创企业需要CRM系统的原因

低代码小观

初创公司 企业管理系统 CRM系统 客户关系管理系统 初创型企业

腾讯二面:Linux操作系统里一个进程最多可以创建多少个线程?

Java全栈架构师

Linux 程序员 架构 面试 操作系统

大数据培训Hive如何控制map个数与性能调优参数

@零度

hive map 大数据开发

从趋势到必选项,探讨企业数字化转型方式方法

华为云开发者联盟

数据 数字化 企业数字化转型 业务数字化

【高并发】一文秒懂Happens-Before原则

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

问题来了!拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗?

Java全栈架构师

程序员 架构 面试 计算机网络 底层知识

借品牌升级之际,谈一谈技术开发者为什么选择 InfoQ 写作社区

宇宙之一粟

4月月更 InfoQ写作社区2周年

VNC中文是什么意思?全称是什么?

行云管家

运维 服务器 vnc

一张长图带你看懂物联网产业十数载“江湖风云”!

亚马逊云科技 (Amazon Web Services)

物联网

OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架

OpenHarmony开发者

OpenHarmony 动画效果

用uniapp写一个内外循环的全选与反选,不会的赶紧围观

CRMEB

hash,bloomfilter,分布式一致性hash

Linux服务器开发

分布式 hash 后端开发 Linux服务器开发 C++后台开发

STI即将登录Gate.io,我们有哪些期待?

小哈区块

云智慧10年资深架构师带你了解:普通程序员向架构师成长必经之路

云智慧AIOps社区

程序人生 架构师 Meetup 晋升 成长计划

省掉80%配置时间,这款Mock神器免费又好用

Liam

前端 前端开发 Postman 前端教程 web前端开发

亚马逊云科技 loT 百亿连接力量

亚马逊云科技 (Amazon Web Services)

亚马逊云

科创中国开源创新榜单发布,EMQX 获评“年度优秀开源产品”

EMQ映云科技

开源 物联网 IoT emq emqx

web前端培训nginx配置规则

@零度

nginx 前端开发

恒源云(Gpushare)_自动化训练小技巧白送给你,不要吗?

恒源云

OSS SSH hy-tmp

java培训SpringBoot自动装配原理

@零度

JAVA开发 springboot

看板的作用是什么?任务看板如何跟进

阿里云云效

云计算 阿里云 持续交付 看板 项目协作

记一次CPU持续增长的问题解决

BUG侦探

Python py-spy CPU增长问题

多个私有云设施管理用什么云管理软件好?

行云管家

云计算 私有云 云管理 多有云

企业如何搭建一个有效的知识管理系统

小炮

企业知识管理 企业知识管理工具

48天打造你的专属 Twilio——浅谈运营商通信中台

网易云信

通信

踩了个DNS解析的坑,但我还是没想通

捉虫大师

DNS 问题排查 4月月更

进阶篇|有了这招,用文本编辑器搞前端代码都能保证格式统一

Jianmu

运维 前端 自动化 工作流 格式化

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