Bobi.ink
2019-07-16
最近在SegmentFault热心解题,一个问题比较让我比较印象深刻:一个初学者试图在浏览器中导入Node.js的net模块。结果就是在控制台打印后是一个空对象。
对于有点Javascript经验的人来说,这是一个‘弱智’问题,怎么可以在浏览器端运行Node程序呢?因为这些node模块经过webpack处理, 所以变成了一个空对象,更好的处理应该是抛出异常.
仔细反思一下,对于这些刚入门Javascript的或者从其他语言切换过来的,他们压根就没有概念,比如Python、Ruby、Java这些语言都有强大的标准库,可以满足80%的开发需求,不管它在什么环境、什么平台运行,都可以统一使用这套标准库。而Javascript目前的现状就是不同的运行环境API结构是割裂的。
Javascript这门十几天开发出来的、专供浏览器的语言,可能当初设计是根本就没有考虑标准库这些玩意,比如文件系统,网络等等。因为这个背景, Javascript不具备独立性,它深度依赖于浏览器这个运行环境, 处于一种给浏览器打辅助的角色, 所以Javascript很多年没有走出浏览器玩具语言这个范围. 当然这既是劣势,也是优势, 现在没任何语言能撼动Javascript在浏览器中的地位。
我想很多人跟我当初一样将浏览器提供的Web API等价于Javascript的标准库, 比如console.log
、setTimeout
(下文会介绍这些功能都不在Javascript规范里面). 正如当年那些把JQuery当成Javascript的人.
直到NodeJS的出现,Javascript才走出浏览器约束,延伸到服务器领域, 不再是一个’沙盒语言’。NodeJS定义了很多模块来支撑服务端的开发, 如fs、os、Buffer、net。但是这些和WebAPI一样不是标准的、也就是说NodeJS !== Javascript.
再到后来,学不动了,NodeJS原作者吐槽了一通NodeJS,又搞出了一个Deno, 它也会有自己标准库,会定义自己的文件系统、网络API。从名字上就暗示着这些API不可能和NodeJS兼容。Ok,现在回到文章开始那个问题,如果deno发展起来,说不定哪天又有人尝试在浏览器引用Deno的模块?
如上图, Javascript其实是有一层比较薄全局的、通用的、标准的、核心的API层,即标准内置对象
,这是一些语言核心的内置对象,可以全局访问。关键的是这些是标准的,它们在ECMAScript规范中被定义. 在这个基础之上,不同的运行环境拓展了自己的API。
以浏览器为例:
浏览器端的Web API是一个非常复杂API集合,上图总结了一下基本就包含两块东西:
WebAPI基本概览:
如果你有留心查看MDN文档下面的规范引用,你会发现有些规范引用了W3C, 有些则引用了WHATWG. 到底谁说了算?
如果你掀开锅盖,就会发现这是一场闹剧. 如果前阵子有关注新闻,会看到这些标题‘WHATWG 击败 W3C,赢得 HTML 和 DOM 的控制权’、’W3C将与WHATWG合作制定最新HTML和DOM规范标准’. 大概可以猜出这两个组织之间的关系. 本文就不扯这些‘八卦’了,相关背景可以看这篇文章WHATWG 击败 W3C,赢得 HTML 和 DOM 的控制权
相对而言, 语言层则由ECMAScript规范定义的,比较独立, 近些年成果也比较显著.
这些全局基本对象数量很少, 平时我们使用的非常频繁的定时器和Console都不再此列. 这些对象是每个JavaScript开发者必须掌握的.
这些对象只能满足很基本开发需求, 根本不能和其他语言的标准库相比. 当然这和语言的定位也有一定关系,JavaScript最初的定位就是浏览器脚本,谁知道它现在发展得这么快?
标准库是什么没有一个规范化的定义,按照Wiki的说法标准库就是该语言在不同实现中都按例提供的库, 比如Ruby官方实现和基于JVM的JRuby都应该按照规范实现标准库。 标准库怎么设计,需要包含什么内容取决于语言各自秉持的哲学和定位。 我认为标准库应该有以下特征:
至于标准库需要包含什么内容,可以参考其他语言的实现。比如:
大概分析一下,它们标准库大致都有这些内容:
大部分语言的核心都很小(C++除外),我们学一门语言,大部分时间是花在标准库上,但是你会发现这些标准库一般都是大同小异,这就是为什么有经验的开发者可以很快地入手一门语言.
显然上面这些功能大部分在NodeJS中已经实现了,鉴于NodeJS这么广泛的使用率,NodeJS可以算是事实上的标准了
显然是需要的,但是要结合当前的背景来辩证地考虑。
有标准库有什么好处?
标准库可能会有什么问题?
如何设计标准库? 标准库推进进程可能会有什么障碍?
本文从一个SegmentFault上的一个问题开始,对比其他语言,揭露Javascript没有标准库的窘境. 接着介绍Javascript的API结构,最后介绍什么是标准库,辩证考虑标准库的优缺点,以及推行上面可能会遇到的阻碍.
Javascript发展非常快,已经不再是当初的玩具语言,相信有一天可以实现一直用一直爽.
Please enable JavaScript to view the comments powered by Disqus.