首先 很多小伙伴都会提问的一个问题:什么是node?node是干啥的?
Node简介
官方给出的解释是:Node.js是一个开源和跨平台的JavaScript运行时环境。
Node并不是一门语言,就是一个运行JavaScript的舞台,Node中只能使用ECMAScript语法本身,Node提供了内置模块,Node也可以作为中间层,可以在Node中处理服务器返回的数据及解决跨域问题。
加载模块
在Node中既可以使用文件路径也可以使用名称来引用模块,除非是核心模块,否则用名称引用的模块最终都会被映射为一个文件路径(Path),Node核心模块将一些核心函数暴露给程序员,它们在Node进程启动时会被预先加载。
不管什么类型的模块,被导入当前脚本之后,程序员都可以使用期对外暴露的一组公共API,不管使用什么模块,都可以使用require函数。
var module = require("module_name")
上面代码会导入一个核心模块或者由npm安装的模块,require函数会返回一个对象,该对象表示模块对外暴露的JavaScript API,根据模块的不同,该对象可能是任意的JavaScript值(函数、对象等)。
加载核心模块
Node中有一些以二进制形式发布的模块,这些模块被称之为核心模块。核心模块只能通过模块名引入,而不能通过文件路径引用,即使已经存在一个预期同名的第三方模块,也会优先加载核心模块。
const http = require("http")
上面代码会返回http模块对象,他实现了由Node API文档描述的HTTP API
加载文件模块
此外,还可以通过提供绝对路径或者相对路径从文件路径中加载非核心模块。
const myModuleA = require("/xxx/a");
const myModuleB = require("../../xxx/b")
注意代码中可以省略文件扩展名js,如果没有找到这个文件,Node会在文件后面加上js扩展名再次查找,所以如果当前目录中存在js文件,那么下面两条语句是等效的
const myModuleA = require("/xxx/a")
const myModuleA = require("/xxx/a.js")
加载文件夹模块
还可以使用文件夹路径来加载第三方模块。
const myModule = require("/xxx")
如此一来,Node就会在指定的文件夹下查找模块。Node会嘉定该问价是一个包,并视图查找包定义。包定义包含在名为package.json的文件中。如果文件夹中不存在包定义文件,那么包的入口文件会假定默认为index.js,就上市里会在/xxx路径下寻找index.js文件。反之,如果文件夹中存在package.json文件,那么Node就会尝试解析该文件并查找main属性,将main属性当做入口点的相对路径。
{
"name": "myModule",
"main": "./lib/myModule.js"
}
小结
Node取消了JavaScript默认的全局名称空间,而用Common Js模块系统取而代之,这样可以更好的组织代码,也因此避免了一些安全性问题和错误,可以使用require函数从文件或者文件夹加载模块。