常用DOS命令
dir 列出当前目录下的所有文件
cd 目录名 -切换目录
目录:. / - 当前目录
…/ - 父目录
md 文件夹名 -创建文件夹
rd 文件名 -删除文件夹
ping ip --查看网络是否连通
ipconfig -查看自己的ip
终止一直在运行的命令ctrl+c
清空窗口内容命令cls
模块
CommonJs规范
为什么制定CommonJS规范
- CommonJs规范的出发点:JS没有模块系统、标准库较少、缺乏包管理工具;为了让JS可以在任何地方运行,以达到Java、C#,C++这些后台语言具备开发大型应用的能力;
- CommonJS规范的提出,主要是为了弥补JavaScript没有标准的缺陷,已达到像Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。
在CommonJS规范中
- 一个文件就是一个模块,拥有单独的作用域;
- 普通方式定义的变量、函数、对象都属于该模块内;
- 通过require来加载其他模块;
- 通过exports和modul.exports来暴露模块中的内容;
CommonJS模块规范主要分为三部分:模块引用、模块定义、模块标识
模块引用
var math = require('math');
模块定义
在模块中,上下文提供require()方法来引入外部模块。对应引入的功能,上下文提供了exports对象用于导出当前模块的方法或者变量,并且它是唯一导出的出口。在模块中,还存在一个module对象,它代表模块自身,而exports是module的属性。在Node中,一个文件就是一个模块,将方法挂载在exports对象上作为属性即可定义导出的方式:
exports.add = function () {
var sum = 0, i = 0,args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
在另一个文件中,我们通过require()方法引入模块后,就能调用定义的属性或方法了
var math = require('math');
exports.increment = function (val) {
return math.add(val, 1);
};
exports
module.exports
属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports
变量
//a.js
var a = 100;
module.exports.a = a;
//b.js
var result = require('./a');
console.log(result);//'{ a: 100 }'
为了方便,Node为每个模块提供一个exports变量,指向module.exports。造成的结果是,在对外输出模块接口时,可以向exports对象添加方法。
//a.js
let name = 'andy';
function sum(a,b){
console.log(a + b);
}
exports.str = name;
exports.fn = sum;
不能直接将exports变量指向一个值,因为这样等于切断了exports
与module.exports
的联系
模块编译
编译和执行是模块实现的最后一个阶段。定位到具体的文件后,Node会新建一个模块对象,然后根据路径载入并编译。对于不同的文件扩展名,其载入方法也有所不同
- js文件——通过fs模块同步读取文件后编译执行
- node文件——这是用C/C++编写的扩展文件,通过dlopen()方法加载最后编译生成的文件
- json文件——通过fs模块同步读取文件后,用JSON.parse()解析返回结果
- 其余扩展名文件——它们都被当做.js文件载入
- 每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache对象上,以提高二次引入的性能
模块标识
模块标识其实就是传递给require()方法的参数,它必须是符合小驼峰命名的字符串,或者以.、…开头的相对路径,或者绝对路径。它可以没有文件名后缀.js
模块的分类
-
核心模块(Node提供的模块)
-
文件模块(用户编写的模块)
核心模块部分在Node源代码的编译过程中,编译进了二进制执行文件。在Node进程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。
文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速度比核心模块慢。
Node模块中的加载
使用require()方法来引入
require(‘文件路径/模块名称’)
let obj = require(‘./test.js’)
或者如下写法均可以:
let obj = require(‘./test’)
注意:如果没有指定导入模块的类型, 那么会依次查找.js .json .node文件
无论是三种类型中的哪一种, 导入之后都会转换成JS对象返回给我们
导入模块时,需要注意:
导入"自定义模块"模块时前面必须加上路径
导入"系统模块"和"第三方模块"是不用添加路径