当前位置: 时代头条 > 正文

Node.js 乱流中的几个标准操

关注“教授学苑

教授带你走一趟不同的开发!

Node.js 乱流中的几个标准操

Node.js的乱流要从它的.js即(JavaScript)说起,来先上一个简短的历史课。


乱世出英雄

故天将降大任于斯人也...

JavaScript从出生就注定了它一生的不平凡,约是在1995年的时候Netscape发现他们发布的Navigator1.0需要有一种可以嵌入网页的脚本语言,用来控制浏览器某些行为。为啥呢?当时网速慢啊,那个时候的网络还不叫宽带,并且呢上网贵,按流量计费... :-( 有些操作比如用户忘记填写了“用户名”,就点了登录。如果发送到服务器再发现就太晚了,(严重的情况下用户的一套房子都没了~),当然了最好能在用户在点登录的时候,就告诉用户:“请填写用户名”,中国程序员习惯性的提示是:“用户名不能为空!”。对就需要这样一段小程序,可以和浏览器交互,让浏览器检查每一栏都填了,才真正的把数据发送到服务器去。

当时Netscape的管理层对这种浏览器脚本期望是:功能不需要太强,语法越简单越好。当时的编程语言的成熟度并不像现在这么高。他们就找到了Sun,因为Sun在1995年发布了革命性的Java语言,并且推广方面非常的成功吸粉无数。两个公司的管理层就坐在一起喝了会咖啡,聊了会人生..

Sun : “让浏览器支持嵌入Java小程序(后来的Java Applet)".

Node.js 乱流中的几个标准操

Sun: "你们要搞的那个小程序也用Java语言吧,Java跨平台做的是那是杠杠滴."

Node.js 乱流中的几个标准操

Netscape当时感觉不需要Java这么“重”的语法,又开始深深的思考:

Node.js 乱流中的几个标准操

Netscape决定了先自己搞一搞,他们招了个程序员叫Brendan Eich,这个Eich呢有着很强的函数式编程背景,希望以Scheme语言(LISP的一种方言)为母本,实现这种新语言。

Brendan Eich的魔法秀开始了,他只用了10天,就设计完成第一个版本。其实就是个大烩菜:

  • 语法方面借鉴了C和Java。

  • 数据结构方面借鉴了Java,如原始值和对象两大类。

  • 函数的用法借鉴了Scheme和Awk,把函数当成第一等公民,引入了闭包。

  • 原型继承模型借鉴了Self(Smalltalk的一种变种)。

  • 正则上面借鉴了Perl。

  • 字符串和数组处理上借鉴了Python。

是的就是这个上古大神,用了10天做了个大烩菜。但是又缺点关键的调料,比如块级作用域、模块、子类型等等...但又可以利用现有的功能找出解决办法。这个先天性的不足,直接导致了后来的JavaScript使用者的一个显著特点:“对于其它语言,使用者需要学习语言的各种功能,而对于JavaScript却需要学习各种解决问题的模式”。JavaScript从出生就注定是个混血。

Netscape给这种语言起了个名字叫Mocha,后来又改了叫LiveScript,但总感觉不够霸气。快到圣诞的时候,这两个公司的管理层又坐在了一起,同样的喝一喝咖啡,聊一聊人生...

Sun :“你们的那个语言啊,叫JavaScript吧.”

就这样JavaScript的名字才确定下来,但Sun只授权Netscape使用,Sun也成了“冠名爹”。

时间轴到了1996的3月,Navigator2.0浏览器发布时已经正式内置了JavaScript语言。

大家再回想,这个时间点上还有一个大事件,那就是1995年8月24号Win95的推出,微软封神。微软在发布Win95之后一直也没有闲着,大约在1996年8月的时候,微软模仿了JavaScript,搞出了个JScript,内置于IE3.0。IE呢又捆绑在在Win95上面。Netscape感觉风声不妙,别说是浏览器脚本语言的主导权,就是浏览器本身也是“泥菩萨过河”。

Netscape打算把JavaScript过继给国际准化组织ECMA,希望JavaScript靠这个干爹发扬光大。

1997年ECMA发布了第一版本:ECMAScript1.0。改名字总体说来有两个的原因:

  1. “冠名爹”的存在。

  2. ECMA自己认为,ECMA才是这个语言的爹(亲、干都是次要的)。

ECMA持续的养着这个儿子。每年给一次生活费,就这样连给了三年。到了1999年。ECMAScript3.0版本发布。JavaScript也成了通行的标准,得到了广泛的支持。ECMA说:"你可以自己出去闯江湖了".

JavaScript就这样开始了自己的江湖生涯,一路打怪升级.

JavaScript出门没几天就碰到了燃烧军团的大BOSS道格拉斯(Douglas Crockford),几场大战下来发现自己使用的XML格式完全不敌人家JSON格式。虽没有打过,但也学到了JSON(JavaScript Object Notation,JS对象标记)。JavaScript说我需要原生支持这种格式,不需要额外的代码。

JavaScript接着又碰到了Mozilla,把Mozilla打成了FireFox。

JavaScript碰到了乔布斯,帮助乔布斯弄出来Safari的第一个版本。

到了2004年JavaScript碰到了Google,和Google弄出来个Gmail,促成了互联网应用程序(Web Application)的概念。同时Dojo框架的诞生,为不同的浏览器提供了统一的接口。这标志着JavaScript第一关已经通关了..JavaScript编程框架的时代已经来临。

JavaScript在第二关的时候也就是2005年收复了Ajax,从此如虎添翼,直接打出来了个Web2.0。

到了2006年时候JavaScript到了一个贵人(John Resig)赠送了JavaScript一杆火尖枪(JQuery),这让JavaScript操作DOM得心应手。并且让JavaScript语言的应用难度大大降低,这个时候江湖上才认识到这玩意原来还真是门语言。

2007的时候道格拉斯(Douglas Crockford)又回来了,这次不是打架来的。带着他的圣经《JavaScript: The good parts》来为JavaScript游说来了。他带着教父式的口气说:“软件行业现在开始请严肃对待JavaScript语言,大家都把他的语法再学习一下!....” 貌似有很多,但大家都在看神,没有记住,但有一个学霸叫Google,他记住了,他悄悄历时一年给JavaScript打造了一副风火轮(V8)从此JavaScript如获神器,运行速度变得非常的快...

还有一点要说一下:2007年的时候ECMA装B失败,发布的ECMAScript4.0草案,各大公司都不鸟...除了ECMAScript的版本,很长的一段时间里,Netscape公司以及继承它的Mozilla基金会有内部依然使用自己的版本号。这就是JavaScript的乱世:

一直都未被重视,但一直又都未被放弃.

到了2008年,才有Node.js的啥事,创始人Dahl(打哈了)因为Flickr项目上一款上传进度条的问题。整合了V8,JavaScript和一个底层I/O API搞出了个Node.js。并且拿出去在inaugural European JSConf秀了一把。大家都一致性大声喊牛。但大家却没有把名字记好,有记成Node、有记成NodeJS的,还有一部分记成了Nodejs...不要紧,看了这篇文章之后请一定记住是Node.js(要不你baidu搜问题是找不到正确答案滴.)

捡重点说,讲完Node.js被“火并王伦”之后马上进入标准操,我们加快点.

话说有个Node.js专案的贡献者,希望在2015年3月时候能够有一个稳定版本(姐还等着用呢)。但又对Node.js的管理模式不满,他希望能够采用开放治理的方式进行管理,同时他倾向于不断更新以使用最新版本的V8,没有办法,他就搞出来了个分支。用现在流行的话说就是fork一个,这个就是io.js组织。

但没过多久大约在2015年5月时候,io.js组织就是否将io.js重新合并到Node.js发起了一次公投。吃瓜群众们当然点的是:“赞、赞、赞”。

就这样到了2015年9月时候。Node.js的0.12版本和io.js的3.3版本合并出了Node 4.0,并且引入支持了ECMA组织在2015年6月发布的ECMAScript 6。就这样io.js上演了一场“火并王伦”。

Node.js的乱流在于Node.js的构成体系过于分散,语言的标准是ECMA制定的。核心引擎是Google打造的,编译环境又依赖于不同平台的C++编译器。而Node.js本身只有核心的库函数。还有一个不少的Noder是从写HTML,CSS开始的..对他们来说,这是他们的全栈之路...还记得JavaScript的先天性不足么?JavaScript里没有标准答案,造就了JavaScript五花八门的解决方案....


标准操

原地踏步走:1234....

第一节:起式

上文中《maven 别让你的工程输在起跑线》上讲了Maven的起式,在这儿也说一下Noder的起式..

请使用npm init创建一个工程

init 命令会创建package.json,并且会设置一些常用的初始值。

mkdir icloud-node

// 交互式的输入

cd icloud-node

npm init

在package.json中可以使用script属性设置脚本,默认情况下,npm init会生成start和test。你可以使用npm start和npm test执行他们。

当然也可以定义自己的脚本,使用npm run-script 执行。







Node.js 乱流中的几个标准操

Node.js 乱流中的几个标准操

第二节:环境变量

在生产和开发环境可能需要设置不同的环境变量,最通常的做法是通过NODE_EVN来分别设置为production或staging。当然也可以利用process.evn中使用其他的环境变量,也就是在一个对象中包含用户环境信息。可以参与《Node.js文档》

第三节:风格指南

Node.js 乱流中的几个标准操

Standard Style

一个图说明这个有多牛?

Node.js 乱流中的几个标准操

WebStrom原生支持这种风格

第四节:使用好的同步模式

Node.js 乱流中的几个标准操

async

这个不用说,写JS同志一般都知道!

第五节:错误处理

错误主要分为两种:运行错误和程序编写错误。 对于运行错误如:

  1. 请求超量

  2. 系统内存不足

  3. 连接远程服务失败

对于运行错误,请启用日志,记着 Log everything!

对于程序编写错误,即就是程序的Bug,请尽量避免。比如:

  1. 调用异步方法时没有使用回调

  2. 无法读取undefined的属性。

第六节:关于回调(callback)

应该暴露错误优先的回调接口:

Node.js 乱流中的几个标准操

callback中的第一个参数总是err,这是大家共同的约定。

总是检查回调中的错误

为了理解这一点,我们从一个违反的例子开始:

Node.js 乱流中的几个标准操

readJSON函数的最主要的问题是,如果在执行过程中发生Error,它并不会检查这个错误,这个只能是一个实验型的代码。

改进一下:

Node.js 乱流中的几个标准操

在回调中返回

上面代码仍然存在的问题是,当Error发生的时候,程序的执行并不会在if语句中停止,而是会继续。这回导致很多意料之外的问题。记着总是在回调中返回!

再改一下:

Node.js 乱流中的几个标准操

这样的代码可以算是一个demo版本。处理了大多数的问题,离产品化还差不一步,因为JSON.parse在无法将指定的字符串格式化为JSON格式的时候会抛出一个异常。

只在同步代码中使用try-catch

因为JSON.parse是一个同步函数,因此我们可以将其包围在try-catch语句块中。一定要注意的是,只有同步代码块才能使用try-catch,你不能用在回调中

最后产品化的代码:

Node.js 乱流中的几个标准操

第七节:避免this和new

在Node中与指定的上下文绑定并不是总是个好事,因为在Node程序中经常涉及到传递回调函数,并且会经常使用高层函数管理工作流。函数风格的编程方式会帮你避免很多麻烦。

第八节:收尾(创建小模块)

使用Unix的方式:

Developers should build a program out of simple parts connected by well defined interfaces, so problems are local, and parts of the program can be replaced in future versions to support new features.

保持模块足够小(内聚),模块应该只做一件事!

关注“教授学苑”

教授带你走一趟不同的开发!

最新文章

取消
扫码支持 支付码