node.js开发,对引入module(模块)的理解
什么是node.js?
nodejs开发项目就是利用EcmaScript(JavaScript)、第三方开源库和nodejs平台环境API进行编程。 使用node最重要的一步就是要
安装模块
,有系统内置模块
(例如:fs,http),有第三方模块
(如npm安装的)
特别说明:
在node.js 中,并没有报的概念,虽然里面有个文件叫 package.json ,这是一个配置文件。
正所谓“入乡随俗”, 在node.js 上开发,就要用node.js 方言。
node.js 用到的第三方,称之为: 模块(module);
用法: require('module');
Java 用到的第三方,称之为: 包 (jar 包,package);
用法: #import "package";
C 用到的第三方,称之为: 库 (lib、library);
用法: #include "fileName"
为什么要安装第三模块?
当用JavaScript编写前端页面时,常用到 document对象,不错,document可以在浏览器里很好的运行。那是因为document这个接口对象是挂在浏览器window对象上的,实际上是window.document,只是这里的window可以省略而已。
因此在使用接口方法或者接口对象时不是随便写的,这些接口都是有出处的,出自某个对象(浏览器端的window对象)。通常,我们不写这个对象,即便是不写这个对象,但并不代表这个对象不存在,这就要看运行载体(语境和作用域)了。
由于我们编写的前端代码是运行在浏览器端,浏览器端靠window对象来执行,因此可以省略这个window。当浏览器解析到该接口方法时,会一层一层往上找,当每一层都没有找到定义该接口的方法时,它就会往window对象上找。
如果连window对象上都没找到,肯定会报undefined
的错误。
也许你曾经遇到过这种情况,在一个js文件中有一个方法前面加了一个window,而且这个window去掉还会报错,那是因为这个方法其实是你自己定义的(例如window.haha=function(){}),这个haha不像alert()是系统内定的,所以必须要加window。
接触过node.js 的都知道,Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境(runtime)。这个V8引擎是从chrome浏览器里移植出来的,它脱离了浏览器也就没有了window对象,因此浏览器里的window的方法在这里都不能使用。
你可能有疑问,怎么就不能使用了呢?我在node环境里运行js文件时使用了console.log(),没有跟在某个对象上也没有报错呀!
我在node里使用setTimeout(), clearTimeout(), setInterval(), clearInterval(),这四个定时器函数也完全没有问题呀!
这个问题提的好,几乎每一个node.js 初学者,都会遇到这样的疑惑。其实当你对nodejs有了一定的了解后,就会发现在node环境里使用的console.log()和定时器函数,与在浏览器里运行的,它们不是同一个方法。
这里就要提出nodejs的全局对象和全局函数了,什么是node的全局对象和全局函数呢?
顾名思义只要你语法没有错误,在node环境里任何地方都能使用的对象和函数。其中console就是nodejs的一个全局对象(node还有两个全局对象global和process)。
哦!原来如此。此console非彼console,浏览器运行的console是window对象上的,这里的console本身是nodejs的一个全局对象。虽然他们的名字一样功能也很相似,但是并不是同一个东西。
而在node环境运行的setTimeout(), clearTimeout(), setInterval(), clearInterval()这四个函数其实是node.js 的全局函数(require()也是nodejs的一个全局函数),它们四个和console其实是一样的情况,也不是window对象上的,是node.js自己封装,只不过功能、名字和浏览器端一样而已。
前面说了一大堆,终于引出要说的重点了。使用nodejs开发“为什么要安装模块呢”?
在本文的第一句话就说了“使用nodejs开发项目就是利用EcmaScript(JavaScript)、第三方开源库和node平台环境API进行编程”,其中的第三方开源库就是“模块”。
因为,在开发中node的项目全局对象、全局函数、全局变量,并不能够解决所有问题,比如我想实现个读取或者写入文件的功能,突然间就不知道怎么操作了。这时候,就可查查那些高手给你准备好的东西了,这就是模块
。
模块通常也分为两类,内置模块和第三方模块(还有一种自己写的模块我就不说了,如果你会手写的话,本文你也就可以不用读了)。其中读写文件就是要用到fs内置模块,fs模块上的readFile()和writeFile()就是读写文件的接口。内置模块需要nodejs的全局函数require()引用就可以使用。而第三方模块需要$npm install "xxx" -g 安装后才能引用。
说白了,node开发本身不像浏览器端开发一样,浏览器开发很多都是在浏览器window对象深加工结合,构造成一个个自己想要实现某个功能的方法,然后在在浏览器端执行。node的全局对象,经常用于检查,监听。而真正去做事的往往是模块对象的api构造的文件或者方法。
用nodejs开发项目,当需要某个功能时,就要知道对应的api,有了api,我们要知道它所依赖的模块,知道了这个模块,我们就可以安装“模块”,然后就可以使用了。
从哪里查找第三方模块呢?
当然不是从百度上搜索,而是到npm 官网上,如下:
image.png