- global
nodeJs中的顶级对象是global,它是Node.js的全局对象,所有全局变量和函数都挂载在global对象上。类似于浏览器环境中window对象。
globalThis是ES2020引入的新特性,用它来指向global对象。
Buffer
Buffer是nodejs提供的内置对象,是一个类似数组的对象,用于表示固定长度的字节序列。本质是一段内存空间,专门用来处理二进制数据
- 特点
- 大小固定,无法调整
- 性能好,可以直接操作内存
- 每个元素大小为
1字节
- Buffer的创建
- alloc
let buf = Buffer.alloc(10);
会对旧数据清空
<Buffer 00 00 00 00 00 00 00 00 00 00>
- allocUnsafe
let buf = Buffer.allocUnsafe(10);
可能会包含旧的内存数据,速度比alloc快
<Buffer 00 00 40 00 00 3f 00 00 00 00>
- from
3.1 传递字符串
let buf = Buffer.from('hello');
<Buffer 68 65 6c 6c 6f>
3.2 传递数组
let buf = Buffer.from([100,233,45,56,43]);
<Buffer 64 e9 2d 38 2b>
- Buffer的操作
- 字符串转换
toString
buf.toString()
默认 utf-8 - 元素读写
通过下标操作元素
let buf = Buffer.from('hello')
console.log(buf[0].toString(2))//转成二进制 01101000
console.log(buf)// <Buffer 68 65 6c 6c 6f>
buf[0] = 95;
console.log(buf.toString())//<Buffer 68 65 6c 6c 6f> _ello
- 溢出
let buf = Buffer.from('hello')
buf[0] = 361;// 最大255 舍弃高位的数字 0001 0110 1001 => 0001 0110
console.log(buf)//<Buffer 69 65 6c 6c 6f>
- 中文
let buf = Buffer.from('您好')// utf-8 编码 一个汉字占3个字节
console.log(buf)//<Buffer e6 82 a8 e5 a5 bd>
fs模块
操作文件的内置模块
写入文件
// 是用于写入频次较低
fs.writeFile();// 异步
fs.writeFileSync();// 同步
// 追加
fs.appendFile();// 异步
fs.appendFileSync();// 同步
// 流式写入 是用于频次较高
let ws = fs.createWriteStream();
ws.write();// 流式写入
ws.close();// 可选 写入完毕会自动关闭
读取文件
// 读取文件 一次性全部读取
fs.readFile();// 异步
fs.readFileSync();// 同步
// 读取流式文件 一块一块地读取 提高读取效率
let rs = fs.createReadStream('test.txt');
rs.on('data', (chunk) => {// chunk 64kb
console.log(chunk);
});
// 可选事件
rs.on('end', () => {
console.log('读取完毕');
});
复制文件
const rs = fs.createReadStream('test.txt');
const ws = fs.createWriteStream('test-1.txt');
rs.on('data', function (chunk) {
ws.write(chunk);
});
// 也可以这样读取写入
rs.pipe(ws);
fs.copyFile(src, dest, [mode], callback)
重命名、移动文件
重命名、移动文件本质一样,都是在更改文件路径
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.rm(path,callback)
fs.rmSync(path)
创建目录
fs.mkdir(path, [options], callback)
fs.mkdirSync(path, [options])
fs.mkdir(’/tmp/a/b/c/d’, {recursive: true}, callback)//递归创建
读取文件夹
fs.readdir(path, callback)
fs.readdirSync(path)
fs.readdirSync('./')// 读取当前文件夹
删除目录
【rmdir 即将过时】
fs.rmdir(path, callback)
fs.rmdirSync(path)
fs.rmdir('./a/b',{recursive:true},callback)// 递归删除
【建议使用】rm
fs.rm(path, callback)
查看资源状态
fs.stat(path, callback)
fs.statSync(path)
路径
- 相对路径
参照物是命令行的工作目录,不是js文件当前目录
./
:当前目录
../
:上级目录
无./
:当前目录 - 绝对路径
盘符开头
:C:\Users\Administrator\Desktop
/
开头:盘符根目录下/html
在使用fs时,推荐使用绝对路径,相对路径可能会出现一些问题 -
--dirname
该变量保存的是所在文件的所在目录的绝对路径 -
--filename
该变量保存的是文件的绝对路径
path模块
path.resolve(path)
:拼接规范的绝对路径
path.resolve(__dirname, './index.html')// 第一个参数是绝对路径,后面的参数都是相对路径
path.sep
: 获取操作系统的路径分隔符
path.basename(path)
:获取路径的基础名称
path.extname(path)
: 获取路径的扩展名
path.dirname(path)
: 获取路径的目录名
path.parse(path)
: 解析路径并返回对象
http模块
获取请求数据
req.url
: 获取请求的url
req.method
: 获取请求的方法
req.headers
: 获取请求头
req.httpVersion
:http版本号
提取URL中的路径和查询字符串
- 借助内置库 url 旧版
let l = url.parse(req.url, true);
let pathname = l.pathname;
let query = l.query;
{
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?a=1&f=l',
query: [Object: null prototype] { a: '1', f: 'l' },
pathname: '/ssjj',
path: '/ssjj?a=1&f=l',
href: '/ssjj?a=1&f=l'
}
- new URL() 新版
let url = new URL(req.url,'http://127.0.0.1');
let pathname = url.pathname
let query = url.searchParams.get('a')
设置响应体
response.write()
// 可以有多个
response.end()
// 只能有一个end()
const http = require('http');
// const url = require('url');
const server = http.createServer((req, res) => {
let { method } = req;
let { pathname } = new URL(req.url, 'http://127.0.0.1');
res.writeHead(200, {
'Content-Type': 'text/html;charset=utf-8'
});
if(method === 'GET' && pathname === '/login'){
res.statusCode = 209;
res.end('<form action="/login" method="post"><input type="text" name="username"><input type="password" name="password"><button type="submit">Login</button></form>');
}else if(method === 'GET' && pathname === '/register'){
res.statusCode = 209;
res.end('注册')
}else{
res.end('Not Found')
}
});
server.listen(8081,()=>{
console.log('Server running on port 8081');
});
静态资源
let root = __dirname + '/page'; 网站根目录
let filepath = root + pathname; 请求资源路径
GET与POST请求
-
GET请求
地址栏访问
a链接
link
script
video与audio引入多媒体
img引入图片
form标签method为get
ajax中的get -
POST请求
form标签method为post
ajax中的post
模块化
node.js实现了CommonJS模块化规范。
导出模块
- module.exports
// 导出一个函数
module.exports = function(){
console.log('hello')
}
// 导出一个对象
module.exports = {
a: 1,
}
- exports
exports.a = 1;
exports.b = 2;
exports
与 odule.exports
的关系
exports
其实就是 module.exports = {}
module.exports可以导出任意数据,不可以使用exports = value
的形式导出
require导入时返回结果始终是module.exports导出的值
导入模块
-
require()
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
require.ensure()
是 webpack 特有的,已被 import() 取代。 -
导入模块时的路径问题
- 自己创建的模块,使用相对路径,
./
或../
- 导入js和json文件,可以不用写扩展名
- 导入其他类型的文件,会以js文件进行处理
- 导入路径是文件夹,首先检测文件夹下package.json文件中main属性对应的文件,如main属性不存在,或package.json不存在,或检测文件夹下的index.js和index.json
- 导入内置模块,路径使用模块名字即可。
- 导入自定义模块基本流程
- 将相对路径转为绝对路径,定位目标文件
- 缓存检测
- 读取目标文件代码
- 包裹为一个函数并执行。通过
arguments.callee.toString()
查看自执行函数 - 读取模块的值
- 返回module.exports的值
CommonJS模块化规范
- 一个文件就是一个模块
- 一个模块就是一个对象
- 一个模块的顶层变量就是它导出的内容
- 一个模块的顶层函数就是它导出的内容
- 一个模块的顶层变量和函数只能在该模块内部使用
- 一个模块不能直接访问另一个模块的顶层变量和函数
网友评论