NodeJS模块化
Node.js模块化开发
JavaScript开发弊端
JavaScript在使用时存在两大问题,文件冲突和命名冲突。
软件中的模块化开发
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行
Node.js中模块化开发规范
Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到。
模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块。
模块成员导出和导入
导出:
// a.js
// 模块内部定义变量
let version = 1.0;
// 模块内部定义方法
const sayHi = name => `您好,{name}`;
// 向模块外部导出数据
exports.version = version;
exports.sayHi = sayHi;
导入:
//b.js
//在b.js模块中导入模块a
let a = require('./a.js'); //可以省略文件后缀名
//输出b模块中的version变量
console.log(a.version);
//调用b模块中的sayHi方法 并输出其返回值
console.log(a.sayHi('哒哒哒'))
注意:在使用 require
加载用户自定义模块时,可以省略文件后缀名。
let a = require('./a')
示例:
a.js:
const add = (n1, n2) => n1 + n2
exports.add = add;
b.js:
const a = require('./03.module-a.js')
console.log(a.add(10, 20))
另一种模块成员导出的方式
module.exports.version = version;
module.exports.sayHi = sayHi;
或者:
module.exports = {version, sayHi}
exports
是module.exports
的别名,导出对象最终以module.exports
为准
系统模块
什么是系统模块
Node运行环境提供的API都是以模块化的方式进行开发的,所以我们又称Node运行环境提供的API为系统模块(内置模块)。
例如:fs、path、http等模块。
系统模块fs文件操作
const fs = require('fs')
读取文件内容
fs.readFile('文件路径/文件名称'[,'文件编码'], callback)
示例:
const fs = require('fs')
fs.readFile('./03.module-a.js', 'utf-8',(err,doc)=>{
//如果文件读取出错 err是一个对象包含错误信息
//如果文件读取正确 err是null
//doc是文件读取的结果
console.log(err)
console.log(doc)
})
写入文件内容
fs.writeFile('文件路径/文件名称', '数据', callback)
示例:
const fs = require('fs')
fs.writeFile('./demo.txt', '要写入的内容', err => {
if (err != null) {
console.log(err);
return;
}
console.log('文件内容写入成功')
})
系统模块path路径操作
路径拼接语法
path.join('路径', '路径', ...)
示例:
const path = require('path')
const filePath = path.join('pubic','uploads','avatar')
console.log(filePath) // pubic\uploads\avatar
第三方模块
什么是第三方模块
别人写好的,具有特定功能的,我们能直接使用的模块即第三方模块。
第三方模块有两种存在方式:
- 以js文件的形式存在,提供实现项目具体功能的API接口。
- 以命令行工具形式存在,辅助项目开发。
获取第三方模块
https://www.npmjs.com
:第三方模块的存储和分发仓库
npm
(node package manager):node的第三方模块管理工具,不需要下载,集成在Nodejs中
查看npm版本:npm -v
下载第三方模块:npm install 模块名称
第三方模块 nodemon
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
使用步骤:
-
1.安装:npm install nodemon -g
-g:代表全局安装
-
2.在命令行工具中用nodemon命令替代node命令执行文件
查看使用帮助:
nodemon -h
Node.js模块的加载机制
模块查找规则-当模块拥有路径但没有后缀时
require('./find.js');
require('./find');
1.require方法根据模块路径查找模块,如果是完整路径,直接引入模块
2.如果模块后缀省略,先找同名js文件再找同名js文件夹
3.如果找到了同名文件夹,再找同名文件夹中的index.js文件
4.如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件
5.如果指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到
模块查找规则-当模块没有路径且没有后缀时
require('find')
1.Node.js会假设它是系统模块
2.Node.js会去node_modules文件夹中查找
3.首先看是否有该名字的js文件
4.再看是否有该名字的文件夹
5.如果是文件夹看里面是否有index.js
6.如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件