目录
Node.js笔记
一、fs文件系统模块
1.导入
const fs = require('fs')
2.读取指定文件中的内容
fs.readFile(path,[options],callback)
- 参数1:path必选参数,表示文件路径
- 参数2:可选参数,表示以什么编码格式来读文件
- 参数3:必选参数,文件读取完成以后,通过回调函数拿到读取失败和成功的结果 err dataStr
const fs = require('fs')
fs.readFile('./files/11.txt','utf8',function(err,dataStr){
//如果读取成功,则err的值为null
//如果失败,err为错误对象,dataStr为undefined
})
err.message:返回错误信息
3.向指定文件写入文件内容
fs.writeFile(path,[options],callback)
- 参数1:path必选参数,表示文件路径
- 参数2:写入的内容
- 参数3:可选参数,表示以什么编码格式来读文件,默认是utf8,可不写
- 参数4:必选参数,文件读取完成以后,通过回调函数拿到读取失败和成功的结果 err dataStr
const fs = require('fs')
fs.readFile('./files/2.txt','abcd',function(err){
//如果文件写入成功 err的值为null
//如果写入失败 err的值为错误对象
if(err){
return console.log('文件写入失败'+err.message)
}
console.log('文件写入成功')
})
__dirname 表示当前js文件所处的目录位置
writeFile方法只能创建文件不能创建目录
- 创建文件夹:mkdirSync(‘dirname’,callback())
重复调用fs.writeFile()会覆盖前内容
- appendFile() 追加
二、path路径模块
1.导入
const path = require('path')
2.路径拼接
path.join([…paths]) 把多个路径片段拼接为完整的路径字符串
- 参数:可以传递任意多个路径片段
const path = require('path')
//注意 ../会抵消前面一个路径 不加/则会自动添加
const pathStr = path.join('/a','/b/c','../','./d','e')
console.log(pathStr) // \a\b\d\e
路径拼接尽量都使用path.join
3.获取路径中的文件名
path.basename(path[, ext]) 把多个路径片段拼接为完整的路径字符串
- 参数path必选:表示一个路径的字符串
- 参数ext可选:表示文件扩展名
- 返回:表示路径中的最后一部分
const path = require('path')
//注意 ../会抵消前面一个路径 不加/则会自动添加
const fpath = '/a/b/c/index.html'
const fullName = path.basename(fpath)
console.log(fullName) //打印全部文件名,包括后缀名.html
const nameWithoutExt = path.basename(fpath,'.html') //移除扩展名部分
console.log(nameWithoutExt)
4.路径拼接
path.extname(path) 可以获得路径中的扩展名部分
- 参数:传递路径
const path = require('path')
//注意 ../会抵消前面一个路径 不加/则会自动添加
const fpath = '/a/b/c/index.html'
const fext = path.extname(fpath)
console.log(fext) // 输出.html
路径拼接尽量都使用path.join
三、http模块
1.导入
const http = require('http')
2.创建一个基本的web服务器
const http = require('http')
const server = http.createServer()
//为服务器实例绑定request事件
server.on('request',function(req,res){
console.log('Someone visit our web server.')
})
//启动服务器
server.listen(8080,function(){
console.log('server running at http://localhost:8080')
})
3.req请求对象
req是请求对象,包含了与客户端相关的数据和属性
req.url
是客户端请求的url地址,从端口号开始的地址
req.method
是请求的method类型
5.res响应对象
res是响应对象
res.send(arg)
向客户端发送指定内容,并结束此次请求
6.解决中文乱码问题
添加header:Content-Type,text/html;charset=utf-8
const str = `您请求的url地址为${req.url},请求的method为${req.method}`
res.setHeader('Content-Type','text/html;charset=utf-8');
res.send(str)
四、模块化
1.加载模块
使用强大的require()方法可以加载所需要的内置模块,用户自定义模块,第三方模块进行使用
//加载内置模块
const http = require('http')
//加载自定义模块
const custom = require('./custom.js')
//加载第三方模块
const moment = require('moment')
当使用require加载其他模块时会运行被加载的模块
在使用require加载用户自定义模块期间可以省略.js后缀
2.模块作用域
每个模块的变量互不干涉
每一个模块都有一个module对象
-
向外共享模块作用域中的成员
在自定义模块时,可以通过module.exports对象将模块内的成员共享出去,供外界使用
外界使用require()方法导入自定义模块时,得到的就是module.exports所指向的对象
自定义模块.js
//在一个自定义模块中,默认情况下,module.exports = {} //向module.exports对象上挂载username属性 module.exports.username = 'zs' //向module.exports对象上挂在username属性 module.exports.sayHello = () => { console.log('Hello') }
test.js
//在外界使用require导入一个自定义模块的时候, //得到的成员就是那个模块通过module.exports指向的那个对象 const m = require('./自定义模块') console.log(m) //{username:'zs',sayHello:[function]}
使用require方法导入模块时,导入的结果,永远以module.exports指向的对象为准,即exports指向什么对象就导出什么对象
-
exports对象
exports和module.exports指向的是同一个对象 简化了向外共享成员对象的代码
-
注意
require()模块时,得到的永远都是module.exports指向的对象
exports.username = 'zs' module.exports = { gender:'男', age:20 } // require {gender:'男',age:22}
module.exports.username = 'zs' exports = { gender:'男' age:20 } //最终require得到的对象是{username:'zs'} 因为永远都是module.exports指向的对象
exports.username = 'zs' module.exports.gender = '男' // require: {username:'zs',gender: '男'}
如果两个指向同一个对象时,可以同时修改对象的值
如果两个指向的对象不为同一个时,以module.exports指向的对象为准
exports只是存储module.exports的一个引用变量,改exports改不了module.exports
exports = { gender:'男', age:20 } module.exports = exports module.exports.username = 'zs' //require得到的对象时{gender:'男',age:20,username:'zs'} 与以上推论相符
3.模块化规范
-
CommonJS 规范:
① 每个模块内部,module变量代表当前模块
② module变量是一个对象,他的exports属性是对外的接口
③ 加载某个模块,其实是加载该模块的module.exports属性。require()方法用于加载模块
4.npm与包
-
包
Node.js中的第三方模块又叫包,由第三方个人或团队开发的
包是基于内置模块封装出来的
-
npm初体验
npm install 安装具体的包
可简写 npm i 完整的包名
npm i moment
导入需要的包
const moment = require('moment') const dt = moment().format('YYYY-MM-DD HH:mm:ss') console.log(dt)
-
install后多地文件夹和文件
node_modules文件夹 用来存放已安装到项目中的包。require会从这个目录中查找并加载包
package-lock.json 配置文件 用来记录node_modules目录下的每一个包的下载信息 :名字、版本号、下载地址等
-
安装指定的版本的包
npm i moment@ 版本号
npm i moment@2.22.2
第一位数字:大版本
第二位数字:功能版本
第三位数字:Bug修复版本
版本号提升规则:只要前面的版本号增长了,则后面版本号归零
五、包管理配置文件
package.json记录项目中安装了哪些包
1.快速创建package.json
//在执行命令所处的目录中,快速创建package.json文件
npm init -y
//项目名称不能有中文和空格
2.dependencies节点
专门用来记录npm install安装了哪些包
npm install moment jquery art-template
"dependencies": {
"art-template":"^4.13.2",
"jquery":"^3.4.1",
"moment":"^2.24.0"
}
3.一次性安装所有的包
当我们拿到剔除了node_modules的项目时需要导入所需要的包
//执行 npm install 命令时会读取package.js下dependencies下的所有包
//npm包管理工具会一次性全部安装所有包
npm install
4.卸载包
使用npm uninstall 具体的包名
成功后会把卸载的包自动从package.json的dependencies中移除掉
npm uninstall moment
5.devDependencies节点
如果某些包只在项目开发阶段会用到,在项目上线后不会用到,则建议把它放在啊devDependencies中
安装指定的包,并记录到devDependencies节点中
npm i 包名 -D
等价于:
npm install 包名 --save-dev
例如:
npm i webpack -D
"devDependencies": {
"webpack":"^3.4.1"
}