JavaScript由三部分组成,ECMAScript,DOM,BOM。
Node.js是由ECMAScript及Node环境提供的一些附加APl组成的,包括文件、网络、路径等等一些更加强大的API。
node.js模块化开发
JavaScript在使用时存在两大问题,文件依赖和命名冲突。模块化开发能解决这个问题。
-
文件依赖不明确,文件的依赖关系是由引入先后顺序决定的,复用的时候完全不知道啊,文件依赖于哪个文件,分析繁琐复杂。
-
命名冲突,依赖关系中,a文件和b文件如果存在命名冲突,会覆盖,很麻烦。
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行。
Node.js中模块化开发规范
- Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到。
- 模块内部可以使用
exports
对象进行成员导出,使用require
方法导入其他模块。
// a.js文件
// 定义变量
var fa = 'hello node.js';
// 定义函数
const fn = name => `您好,${name}`;
// 向模块外部导出数据
exports.fa = fa;
exports.fn = fn;
// b.js文件
// 在b.js模块中导入a模块
let a = require('./a.js');
// 调用输出a.js中的变量
console.log(a.fa);
// 调用输出a.js中的函数,并输出返回值
console.log(a.fn('xxx'));
模块导入的时候,后缀(.js)是可以省略的。
模块成员导出的另一种方式:
把模块成员作为module.exports
对象的属性值就可以了
module.exports.fa = fa;
module.exports.fn = fn;
⭐exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准。详解:
module.exports
和exports
指向的都是同一个对象,这两句是等价的。
然后我给module.exports
重定义一个对象,那么就指向了另一个对象,哪怕再给exports
重定义一个对象,结果也是以module.exports
为准。
系统模块
Node运行环境提供的APl.因为这些API都是以模块化的方式进行开发的,所以我们又称Node运行环境提供的API为系统模块。
比如:文件模块(fs)(file system 文件操作系统):读取文件、写入文件、创建文件夹
const fs = require('fs'); //使用之前导入模块
- 读取文件内容:
fs.readFile('文件路径/文件名'[,'文件编码'],callback);
[] 是可选参数
callback 这里是回调函数
案例:
const fs = require('fs');
fs.readFile('../js/a.js','utf-8',(err,doc)=>{
if(err == null){
console.log(doc);
}
});
- 文件写入内容操作
fs.writeFile('文件路径/文件名','数据',callback);
callback 这里是回调函数
案例:
const fs = require('fs');
fs.writeFile('../js/a.js','//写入',(err,doc)=>{
if(err != null){
console.log(err);
return;
}
console.log('文件写入成功!');
});
系统模块path
路径操作
为什么要进行路径拼接?
不同操作系统的路径分隔符不统一
- /public/uploads/avatar
- Windows上是 \ /
- Linux上是 /
path.join('路径','路径',...);
案例:
const path = require('path');
let lujing = path.join('shopping','img','logo.png');
console.log(lujing); //shopping\img\logo.png
相对路径VS绝对路径
- 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录,并不是代码的相对路径,所以使用的时候用绝对路径
- 在读取文件或者设置文件路径时都会选择绝对路径
- 使
__dirname
获取当前文件所在的绝对路径
案例:
拼接路径完成完整的绝对路径进行文件选取,文件操作。
const fs = require('fs');
const path = require('path');
fs.readFile(path.join(__dirname,'a.js'),'utf-8',(err,doc)=>{
if(err == null){
console.log(err);
console.log(doc);
}
});
第三方模块
别人写好的、具有特定功能的、我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包。
第三方模块有两种存在形式:
- 以js文件的形式存在,提供实现项目具体功能的API接口。
- 以命令行工具形式存在,辅助项目开发
获取第三方模块
npmjs.com
第三方模块的储存和分发仓库
npm(node package manager):node的第三方模块管理工具
安装命令:npm install 模块名称
卸载命令:npm uninstall 模块名称
全局安装:npm install -g 模块名称
安装分为本地安装和全局安装,本地安装只有当前项目可用,全局安装将模块安装到公共目录,所有项目都可以使用,一般来说:
命令行工具:全局安装
库文件:本地安装
修改全局模块默认路径(先新建两个文件夹):
npm config set prefix "D:\Program Files\node12\node_gobal"
npm config set cache "D:\Program Files\node12\node_cache"
下载的时候默认下载到命令当前执行的目录下,所以尽量在安装目录下执行命令。
获取过程中黄色为警告可以无视,红色为报错。
nodemon(第三方模块)
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
nodemon可以修改文件后,就会执行该文件。
使用步骤
- 使用npminstall nodemon-g下载它
- 在命令行工具中用nodemon命令替代node命令执行文件
如果安装后执行报错,添加环境变量,变量目录包含nodemon.cmd,重启cmd即可。
nrm(第三方模块)
nrm(npm registry manager):npm下载地址切换工具
npm默认的下载地址在国外,国内下载速度慢
国外:npmjs.com
国内:npm.taobao.org
切回国内源
- 安装
npm install -g nrm
- 查询可用地址列表
nrm ls
- 切换地址
nrm use taobao