文章目录
参考视频
简介
NodeJS是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。
Node大部分基本模块都用JavaScript编写。在Node出现之前,JS通常作为客户端程序设计语言使用,以JS写出的程序常在用户的浏览器上运行。
Node主要用于编写像Web服务器一样的网络应用,这和PHP和Python是类似的。但是Node与其他语言最大的不同之处在于,PHP等语言是阻塞的而Node是非阻塞
Node是事件驱动的。开发者可以在不使用线程的情况下开发出一个能够承载高并发的服务器。其他服务器端语言难以开发高并发应用,而且即使开发出来,性能也不尽人意。
返回目录
NodeJS下载安装
下载
选择LTS版,按照电脑操作系统下载相应版本。
安装
1.下载node-v14.16.0.pkg
2.双击node-v14.16.0.pkg
安装提示一步一步安装。
NodeJS与WebStorm整合
打开WebStorm,打开’首选项’,搜索’node’,选择Node.js and NPM,右边选择Node interpreter 解释器路径,点"OK"。
勾选Coding assistance for Node.js, Package manager会勾选npm,在这里稍微等一会儿,会自动选定npm路径。 [返回目录](#anchor)CommonJS规范
ECMAScript标准的缺陷:没有模块系统、标准库较少、没有标准接口、缺乏管理系统。
CommonJS规范的提出,主要是为了弥补当前JavaScript没有模块化标准的缺陷。其对模块的定义是:1.模块引用;2.模块定义;3.模块标识。
模块
JS模块分成两大类:
-
核心模块
-
由node引擎提供的模块
核心模块的标识就是,模块的名字,如fs,require(“fs”);
-
文件模块
-
由用户自己创建的模块
文件模块的标识就是文件的路径(绝对路径,相对路径),如require(’./node.js’);
模块化定义
- 在Node中,一个js文件就是一个模块;
- 在运行环境中,提供了exports对象用于导出当前模块的方法或者变量,并且它是唯的导出的出口;
- 在模块中还存在一个module对象,它代表模块自身,exports是module的属性。
模块引用
- 在node中,通过require()函数来引入外部的模块,文件路径字符串作为参数;
- 可以使用绝对路径或相对路径,相对路径中.(当前目录)或…(上级目录)不可省略,文件后缀可省;
- require()函数返回值是一个对象,代表引入的模块。
模块标识
模块标识其实就是模块的名字,也就是传递给require()方法的参数,它必须是符合驼峰命名法的字符串,或者是以.或…开头的相对路径、或者绝对路径。
node中的对象
global
node中有一个全局对象 global,它的作用和网页中window类似。在全局中创建的变量都会作为global的属性保存,函数都会作为global的方法保存。
当node在执行模块中的代码时,模块代码会被包裹在function (exports, require, module, __filename, __dirname) {}
中。
- export:该对象用来将变量或函数暴露到外部;
- require:函数,用来引入外部的模块;
- module:代表的是当前模块本身,exports就是module的属性,模块的属性或方法可以使用 exports 导出,也可以使用module.exports导出;
- __filename:当前模块的完整路径;
- __dirname:当前模块所在文件夹的完整路径
exports 和 module.exports
可以exports 或 module.exports暴露模块的属性或方法。
//方式1
exports.name = 'Tom';
//方式2
module.exports.name = 'Tom';
//方式3
module.exports = {
name:'Tom',
age:8
};
//注,exports不能直接通过{}来赋值暴露的属性或方法
exports = {
name:'Tom'
};//XXX.name引用的结果是undefined
属性方法引用
- 在Node中,每一个js文件中的js代码都是独立运行在一个函数中而不是全局作用域,所以模块中的变量和函数在其他模块中无法直接访问
- 通过 exports 来向外部暴露变量和方法
//node1.js文件
exports.x = '暴露的x';
y = '非暴露的y';
exports.fn = function(){
console.log("暴露的函数fn");
};//暴露的函数
console.log('模块的代码');
//node2.js
var node1_obj = require('./node1.js');//模块的代码
console.log(node1_obj);//{ x: '暴露的x', fn: [Function (anonymous)] }
console.log(node1_obj.x);//暴露的x
console.log(node1_obj.y);//undefined
node1_obj.fn();//add暴露的函数fn
返回目录
问1:如何说明模块中直接定义的变量属于局部变量?