对nodejs开发为什么要使用“包”的理解

nodejs开发项目就是利用EcmaScript(JavaScript)、第三方开源库和nodejs平台环境API进行编程。


使用node最重要的一步就是要“安装包”,有系统内置包(例如:fs,http),有第三方包(如npm安装的)


为什么要安装包?
因为JavaScript在运行时(runtime),比如在浏览器端使用接口对象时,例如document可以在浏览器里很好的运行。那是因为document这个接口对象是挂在浏览器window对象上的,实际上是window.document,只是这里的window可以省略而已。


因此在使用接口方法或者接口对象时不是随便写的,这些接口都是有出处的,出自某个对象(浏览器端的window对象)。通常情况下我们不去写这个对象,并不是代表这个对象不存在,这就要看运行载体(语境和作用域)了。
由于我们习惯了写在浏览浏览器端运行的代码,而这写代码是在浏览器端window对象执行,因此可以省略这个window。而当浏览器解析到该接口方法时,会一层一层往上找,当每一层都没有找到定义该接口的方法时,他就会往window对象上找。
如果连window对象上都没找到,肯定会报undefined的错误。
可能有的同学遇到过这种情况,在一个js文件中有一个方法前面加了一个window,而且这个window去掉还会报错,那是因为这个方法其实是作者自己定义的(例如window.lcp=function(){}),这个lcp不像alert()是系统内定的,所以必须要加window。


我们接触过node的同学都知道Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境(runtime)。这个V8引擎是从chrome浏览器里移植出来的,他脱离了浏览器也就没有了window对象,因此浏览器里的window的方法在这里都不能使用。
可能这里又有同学有疑问了,怎么不能使用了,我在node环境里运行js文件时使用了console.log(),没有跟在某个对象上也没有报错。我在node里使用setTimeout(), clearTimeout(), setInterval(), clearInterval(),这四个定时器函数也完全没有问题。


这个问题很问的很好,我开始接触nodejs时,也很疑惑。其实当你对nodejs有了一定的了解时,就会发现在node环境里使用的console.log()和定时器函数,和在浏览器里运行的不是同一个方法。


这里就要提出nodejs的全局对象和全局函数了,什么是node的全局对象和全局函数呢?
顾名思义只要你语法没有错误,在node环境里任何地方都能使用的对象和函数。其中console就是nodejs的一个全局对象(node还有两个全局对象global和process)。
哦!原来如此。此console非彼console,浏览器运行的console是window对象上的,这里的console本身是nodejs的一个全局对象。虽然他们的名字一样功能也很相似,但是并不是一个东西。
而我们在node环境运行的setTimeout(), clearTimeout(), setInterval(), clearInterval()这四个函数其实是nodejs的全局函(require()也是nodejs的一个全局函数),它们四个和console其实是一样的情况,也不是window对象上的,是nodejs自己封装,只不过功能、名字和浏览器端一样而已。


前面说了一大堆,终于引出要说的重点了使用nodejs开发“为什么要安装包”?
在本文的第一句话就说了“使用nodejs开发项目就是利用EcmaScript(JavaScript)、第三方开源库和node平台环境API进行编程”,其中的第三方开源库就是“包”。

因为我们在开发中node的项目全局对象、全局函数、全局变量,并不能够解决所有问题,比如我想实现个读取或者写入文件的功能,突然间就不知道怎么操作了。这时我们人气最旺的包就一个个出现了。也就是我们通常所说的模块。模块通常也分为两类,内置模块和第三方模块(还有一种自己写的模块我就不说了,如果你会手写的话本文你也就可以不用读了)。其中读写文件就是要用到fs内置模块,fs模块上的readFile()和writeFile()就是读写文件的接口。内置模块需要nodejs的全局函数require()引用就可以使用。而第三方模块需要$npm install "xxx" -g安装后才能引用。

说白了node开发本身不像浏览器端开发一样,浏览器开发很多都是在浏览器window对象深加工结合,构造成一个个自己想要实现某个功能的方法,然后在在浏览器端执行。node的全局对象,经常用于检查,监听。而真正去做事的往往是一个个模块对象的api构造的文件或者方法,说白了node就像Java运行的虚拟机一样。


总结:用nodejs开发项目时需要某个功能,就要知道对应的api,有了api,我们要知道他所依赖的模块,知道了这个模块,我们就可以安装“包”使用了。


注:由于本人也是在学习中,如果本文与官方有出入的地方,一切以官方为主,也欢迎大家前来指点,在这里我先对给我提出错误的同学表示感谢。

你可能感兴趣的:(nodejs)