模块化开发是为了解决js文件中命名冲突和文件依赖的问题。
软件中的模块化开发:
一个功能就是一个模板,多个模板可以组成完整应用,抽离一个模块不会影响到其他功能的应用。
例如:
一个应用模块分为用户管理模块,文章管理模块,商品管理模块,用户管理模块又分为添加用户管理模块和删除用户管理模块,商品管理模块分为查找和添加模块。各模块之间相互独立,可维护性较强。
Node.js中模块化开发规范
Node.js规定一个js文件为一个模块,模块内部定义的函数和变量在模块外部无法访问,因此需要在模块内部通过exports对象进行导出,在模块外部通过require方法进行导入。
(注意:exports是一个对象,require是一个方法!!!)
exports对象导出方法
例如:a.js文件中代码为
const version=1;
const hello = name =>`hello,${name}`;
exports.version=version;
exports.hello=hello;
b.js文件中代码为:
let b=require('./a.js');
//在外部通过reqiure进行导入,require为一个方法
console.log(b.version);
console.log(b.hello('lala'));
最终通过powershell运行结果为:
module.exports对象导出方法
用module.exports对象也可以导出模块。
在上述事例中将a.js文件的代码改为:
const version=1;
const hello = name =>`hello,${name}`;
module.exports.version=version;
module.exports.hello=hello;
两者的区别
exports是module.exports的别名,两者指向同一对象同一地址,若两者不同,最终导出对象以module.exports为准。
例如:
a.js的代码为
const version=1;
const hello = name =>`hello,${name}`;
exports.version=version;
exports.hello=hello;
//exports指向的对象是带有version和hello属性的对象
module.exports={
name:"zhangsan"
}
//module.exports指向的对象是带有name属性的对象
b.js的代码为
let b=require('./a.js');
console.log(b);
最终结果为
命令行中调用时应为:node 文件名称
系统模块
系统模块指的是node运行环境提供的API,因为这些API都是用模块化的方式开发的,于是称为系统模块。
fs:文件操作系统模块
导入模块:
const fs=require('fs');
读取文件内容:
例如:
//读取上一级css目录中的base.css文件
//文件编码是可选参数
fs.readFile('../css/base.css','utf-8',(err,doc)=>{
//err为读取过程中的错误信息,doc为文件内容
if(err==null){
console.log(doc);
}
});
写入文件内容:(会覆盖之前的内容)
例如:
fs.writeFile('./a.js', 'content', (err) => {
if(err==null){
console.log('文件写入成功');
}
else{
console.log('文件写入失败,'+err);
}
});
追加文件内容:(不会覆盖之前的)
//添加一个flag为a的参数则为追加,flag为w时则为写入
fs.writeFile('./a.js', 'content',{'flag':'a'}, (err) => {
if(err==null){
console.log('文件追加成功');
}
else{
console.log('文件追加失败,'+err);
}
});
path:路径操作系统模块
路径拼接
不同操作系统中路径分隔符不同,path系统模块可通过分析电脑的操作系统选择合适的路径分隔符,并对路径进行拼接。
路径拼接语法:
path.join('路径','路径',...)
例如:
//引入path系统模块
const path=require('path');
const finalPath=path.join('public','uploads','avatar');
console.log(finalPath);
绝对路径和相对路径
写文件路径时最好使用绝对路径,这样文件移动时仍然能对文件进行操作。
例如:
__dirname表示当前文件所在的绝对路径
const fs=require('fs');
const path=require('path');
console.log(__dirname);
console.log(path.join(__dirname,'a.js'));
fs.readFile(path.join(__dirname,'a.js'),'utf-8',(err,doc)=>{
if(err==null){
console.log(doc);
}
console.log(err);
});
第三方模块
第三方模块是别人写好的,具有特定功能的模块,又名包。
第三方模块获取方式
第三方模块下载方式分为命令行下载和网站下载。
网站下载:
国内网站地址(速度较快):点此下载
命令行下载:
用npm(第三方模块管理工具)以命令行方式下载第三方模块:
下载地址默认为命令行当前位置。
安装方式分为本地安装和全局安装(本地安装多指在网站上下载第三方模块,全局安装多指在命令行中下载)。
npm install 模块名称
卸载第三方模块
npm uninstall 模块名称
nodemon第三方模块
nodemon可以帮助在文件保存时自动运行文件,较为方便。
安装命令
npm install nodemon -g //-g表示全局安装
运行文件命令:
nodemon 文件名称
按 ctrl+c 退出当前监控环境。
nrm第三方模块
nrm: npm下载地址切换工具
使用步骤:
- 使用npm install nrm -g对其进行下载。
- 查询可用下载地址列表 nrm ls
*表示当前下载地址 - 对其进行切换 nrm use 下载地址名称
最终完成对npm下载地址的切换。