Node.js的模块系统
Node.js中使用"Module(模块)"来规划不同的功能对象。
模块的分类:
(1)核心模块——nodejs的内置模块
(2)第三方模块(https://www.npmjs.com 常用的第三方模块:express、less、grunt...)
(3)自定义模块: 每一个被加载的.js文件对应一个模块对象,包含相应的功能和函数。
模块中声明的变量或函数的作用域是“模块作用域”,不是golbal的成员,默认只能在当前js文件(即当前模块)中使用。
Node.js启动时运行的第一个模块,称为“主模块”。——mail module,也是自身模块。
除主模块之外的其他模块,称为“子模块”。
获取主模块对象:process.mainModule require.main
每一个模块都可以导出(exports)自己内部的对象供其他模块使用,也可以引入(require)并使用其他模块中导出的对象。
每一个模块内部都可以使用一个变量叫“module”,指向当前模块自己。
判断当前模块是否是主模块:module===process.mainModule
创建模块:文件式自定义模块
加载模块:其他js文件中调用
预定义的模块作用域成员:
__dirname 当前模块文件所在的目录
__filename 当前模块文件所在目录及文件名
module 指向当前模块的引用
module.exports 指向当前模块中待导出的供其他模块使用的对象
exports 指向module.exports对象的引用
require 引入其他模块,使用其他模块的module.exports对象
自定义模块:
(1)文件模块
没有后缀的文件模块,被作为js文件加载;.js后缀的文件模块,被作为js文件加载; .json后缀的文件模块,被作为JSON字符串加载,自动转换为对象;.node后缀的文件模块,被作为C/C++二进制加载;
(2)目录模块:在引入是只需要引入目录名的四种形式:
包含package.json文件的目录:package.json中包含一个main属性,指向该模块的js文件——> {"main":"xx.js"};
包含index.js文件的目录;
包含index.json文件的目录;
包含index.node文件的目录;
模块查找顺序:(1)文件/目录模块的缓存;(2)原生模块的缓存;(3)原生模块;(4)文件/目录模块;
包(package):是根据CommonJS规范,对模块进行标准封装;
包规范:包是一个目录;目录中包含一个包说明文件package.json,存放于包顶级目录下;目录中包含js文件,放在lib目录下,如果有index.js,可以放到顶级目录下;二进制文件应该放到bin目录下;文档应该放到doc目录下;单元测试文件应该放到test目录下;
CommonJS规范要求,包应该位于当前目录或者父目录下的node_modules文件夹下,require函数由近及远进行查找。
npm——包管理器
Node.js的包管理工具,用于下载、安装、升级、删除包,或者发布并维护包。
npm官网:www.npmjs.com
包的下载安装:
(1)下载到当前目录:npm install 包名 会安装到指定目录下的node_modules文件夹下 查看目标路径:npm root
(2)下载到全局:npm install 包名 -g 会下载到npm目录下 查看目标路径:npm root -g
包的生成:使用npm init 命令可以在当前目录下生成一个package.json文件;
包的发布:将自定义的包发布到npmjs.com上:
(1)在www.npmjs.com注册账号;
(2)使用npm adduser命令注册或者登陆已有账号;
(3)进入到配置完成的包目录,使用npm publish命令发布包;
(4)搜索或下载使用;
更新包:npm update 包名; 删除包:npm uninstall 包名;
Node.js核心模块
1、console
global.console 用于向stdout和stderr执行输出
console class console模块中的Console构造函数,可以向任意输出流(文件)中执行输入
2、Query String:提供了处理url中“查询字符串”部分的相关操作
parse() //从查询字符串中解析出数据对象,参数为要解析的查询字符串
stringify() //将数据对象转换为查询字符串格式,参数1,要转换的对象;可选参数2,指向键值对之间的分隔符;可选参数3,执行键和值之间的分隔符;
3、Url模块: 提供了处理url中不同部分的相关操作
parse() //解析出url中的各个组成部分,参数1:要解析的url字符串;可选参数2:将查询字符串部分(query)解析为对象,值为true或false
format() //将对象反向格式化为url格式,参数为url对象
resolve() //根据基地址解析出相对url,参数1:基地址;参数2,相对地址
4、Path模块:提供了对文件路径进行操作的相关方法
parse() //解析一个路径为对象,参数为路径字符串
format() //将路径对象格式化为字符串,参数为路径对象
resolve() //根据基础路径解析出一个目标路径的绝对地址,参数1:基础路径;参数2,目标路径
relative() //根据基础路径,获取目标路径与其的相对关系,参数1:基础路径;参数2,目标路径
5、Dns模块: 提供了域名到IP地址的双向解析功能
lookup() //将一个域名解析为IP地址,从操作系统中查询(缓存)
resolve() //将一个域名解析为一个dns记录解析数组,从dns服务器上查询
reverse() //把一个IP地址反向解析为一组域名(很多情况下解析不出来你没)
6、Util模块:工具模块
format() //使用带占位符的方式格式化字符串
inspect() //返回一个对象的字符串表示
inherits() //实现构造方法之间的继承
7、Buffer: 缓冲区,一块专用于存储数据的内存区域;它是全局对象Global的成员,使用时无需引入。
8、fs模块:fs模块提供了文件读写、更名、删除、遍历目录等操作
常用class:
fs.stats //文件或目录的统计信息描述对象
fs.ReadStream //stream.Readable接口的实现对象
fs.WriteStream //stream.Writeable接口的实现对象
fs.FSWatcher //可用于监视文件修改的文件监视器对象
---------------------------------------------------------------------------------------
常用方法:
fs.mkdir() //创建目录
fs.rmdir() //删除目录
fs.readdir() //读取目录下的内容
fs.readFile() //读取文件的内容
fs.writeFile() //向文件中写入内容
fs.appendFile() //向文件中追加内容
fs.unlink() //删除文件
fs.rename() //重命名文件
fs.stat() //用于返回一个文件或目录的统计信息对象(fs.stats对象)
以上方法中都有异步和同步(Sync)两种;所有的异步方法都有一个回调函数,回调函数中的第一个参数都是I/O错误对象err
---------------------------------------------------------------------------------------
fs.stat() & fs.statSync() //用于返回一个文件或目录的统计信息对象(fs.stats对象)
fs.stats对象方法:
stats.isFile() //是否为文件
stats.isDirectory() //是否为目录
---------------------------------------------------------------------------------------
操作目录:
fs.mkdir() & fs.mkdirSync() //创建目录
fs.rmdir() & fs.rmdirSync() //删除目录
fs.readdir() & fs.readdirSync() //读取目录下的内容