commonjs模块化规范
- 引入:
- require(模块路径)
- 暴露:
- exports
- modeule.exports
- 最终暴露的是module(exports指向的值)
- 所有模块化都有一个特点,每一个模块都包裹了一层函数。
function (exports, require, module, __filename, __dirname) {xxx} exports 暴露 require 引入 module 暴露 __filename 当前文件的绝对路径 __dirname 当前文件夹的绝对路径复制代码
global
- nodejs的js:
- DOM 没有
- BOM 基本没有,但是有个别: console setTimeout setInterval
- ES 基本全部包含
- nodejs有一个全局对象:global:
- console
- setInterval
- setTimeout
- setImmediate 立即执行函数
- Buffer
- process.nextTick 立即执行函数
nodejs事件轮询机制
-
nodejs事件轮询机制:
- timers 定时器阶段 计时,执行到点的定时器回调函数
- pending callbacks
- idle, prepare
- poll 轮询阶段 轮询队列,里面放置n个回调函数。 首先检查轮询队列是否为空:
- 不为空:依次取出,同步执行
- 空
- 如果之前设置过setImmediate函数,就去下一个check阶段
- 如果没有设置过setImmediate函数,就在当前阶段停留
- 如果定时器到点了,也会去下一个check阶段
- check 检查阶段 执行setImmediate的回调函数
- close callbacks 关闭阶段
事件轮询:反复执行这6个阶段。一般来讲第四阶段停留最长(绝大部分回调函数都是第四阶段执行的)
-
process.nextTick能在任意阶段优先执行
package(包)
- package.json 包描述文件:
-
name: 包的名称 今后下载包就要输入包名
-
version: 包的版本号 A.B.C
- A 大版本,发生巨大变化
- B 中版本,新添加、删除、修改部分功能
- C 小版本, 修复bug
-
dependencies:生产依赖: 这个包要想运行,需要其他包的帮助 项目运行时需要用依赖:jquery
-
devDependencies:开发依赖 项目构建打包时需要用的依赖:babel
-
scripts: 指令 里面会放置运行项目的指令 "start" --> 开始运行项目的指令 npm start "build" --> 生成项目上线文件的指令 npm run build "test" --> 测试代码指令 npm run test
-
注意:
- 不要有多余的东西。多余的逗号、注释
- 包名不能重复,下载jquery包,你的包名就不能叫jquery。不能中文
-
npm命令
-
nodejs都是通过npm来下载要依赖的包(下载包之前,要先有包描述文件package.json)
- npm install/i xxx 等价于 npm i xxx --save/-S node_modules: 放置下载的包 package-lock.json: 会缓存包下载地址。下次下载更快 将包添加到package.json生产依赖中
- npm i xxx --save-dev/-D 下载并添加到开发依赖中
- npm i xxx -g 全局安装: 只用于运行指令 npm i browserify -g browserify xxx -o yyy
全局安装包的路径:C:\Users\XiongJian\AppData\Roaming\npm复制代码
- npm init 初始化一个包描述文件 package.json npm init -y 创建全部使用默认值 package.json
- npm i 下载当前目录中package.json的所有依赖
- npm remove xxx 删除包和依赖
- 将下载地址关联到淘宝
npm config set registry http://registry.npm.taobao.org/复制代码
- yarn 是facebook公司研发开源的包管理器
- npm i yarn -g 全局安装,作为指令使用
1. 下载并添加到生产依赖 yarn add xxx2. 下载并添加到开发依赖 yarn add xxx --dev3. 下载全局包 yarn global add xxx 需要将下载包配置成环境变量才能使用,一般不用yarn下载全局包4. 下载依赖所有包 yarn复制代码
- 将下载地址关联到淘宝
yarn config set registry http://registry.npm.taobao.org/复制代码
Buffer
- 创建Buffer:
- new Buffer(10) 方法被废弃了,不要在使用
- Buffer.alloc() 找了内存清空里面所有数据,性能稍差
- Buffer.allocUnsafe() 不安全的,可能会包含敏感数据
- Buffer.from() buf.toString()
nodejs核心模块(path)
// nodejs的核心模块const path = require('path');// 专门用来处理路径问题const src = __dirname + '/06.Buffer.js';// console.log(src);// 将传入的n个路径,拼接成一个绝对路径返回console.log(path.resolve('../', '06.Buffer.js')); // C:\Users\XiongJian\Desktop\0225\class0225\05.nodejs\06.Buffer.jsconsole.log(path.resolve(__dirname, '../04.性能优化', '01_图片性能优化/index.html'));// 将传入的n个路径,拼接成一个路径返回console.log(path.join('../', '06.Buffer.js'));复制代码
nodejs核心模块(events)
// events是nodejs核心模块const Emitter = require('events');// 用来实现自定义事件class MyEmitter extends Emitter {}// 创建事件实例对象const myEmitter = new MyEmitter();// 绑定自定义事件myEmitter.on('myEvents123', function (...args) { console.log(args); console.log('自定义事件触发了111~');});myEmitter.on('myEvents456', function (...args) { console.log(args); console.log('自定义事件触发了222~');});// 触发自定义事件myEmitter.emit('myEvents123', 123, 456, 789);复制代码
nodejs核心模块(fs文件系统)
- 同步写入文件
- 同步写入文件
- fs.openSync(path, flags[, mode]); path 文件路径 flags 要执行的操作 'w' write 'r' read mode 设置文件的权限。可选值(可传可不传,一定有默认值)
- 0o666 可读可写
- 0o111 文件可执行
- 0o222 文件可写入
- 0o444 文件可读取
fs.writeSync(fd, string[, position[, encoding]])
- fd 文件描述符
- string 要写入的内容
- position 从哪个位置开始写入 默认值0
- encoding 编码方式 utf-8
const fs = require('fs');// 1. 打开文件const fd = fs.openSync('./3.txt', 'w', 0o666);console.log(fd); // 文件描述符,代表当前读取的文件// 2. 写入文件 中文占三个字节,英文占一个字节const result = fs.writeSync(fd, '下雨,真烦', 10);console.log(result);// 3. 关闭文件fs.closeSync(fd);复制代码
- 异步写入文件
// 引入fs模块const fs = require('fs');// 打开文件fs.open('./4.txt', 'w', function (err, fd) { /* err 代表错误,如果方法出错了,err就是一个对象。如果方法没有出错,就是null 今后会发现nodejs特点,所有回调函数中第一个参数默认是err。错误优先机制 */ //if循环写法 if (!err) { // 写入文件 fs.write(fd, '今天天气真晴朗', function (err) { if (!err) { console.log('文件写入成功~'); } else { console.log('文件写入失败', err); } // 不管成功还是失败都要关闭文件 fs.close(fd, function (err) { if (!err) { console.log('文件关闭成功~'); } else { console.log('文件关闭失败', err); } }) }) } else { console.log('文件打开失败', err); }});复制代码
- 简单写入文件
const fs = require('fs');fs.writeFile('5.txt', 'hello fs', {flags: 'w', mode: 0o666, encoding: 'utf-8'}, function (err) { if (!err) { console.log('文件写入成功~'); } else { console.log(err); }})复制代码
- 流式写入文件
/* 流式写入文件:适用大文件 */const fs = require('fs');// 创建一个可写流const ws = fs.createWriteStream('./6.txt');// on 绑定持续事件// once 绑定一次性事件ws.once('open', function () { console.log('可写流打开了~');})ws.once('close', function () { console.log('可写流关闭了~');})// 往可写流中写入数据ws.write('锄禾日当午');ws.write('汗滴禾下土');ws.write('谁知盘中餐');ws.write('粒粒皆辛苦');ws.write('粒粒皆辛苦');ws.write('粒粒皆辛苦');ws.write('粒粒皆辛苦');ws.write('粒粒皆辛苦');ws.write('粒粒皆辛苦');ws.write('粒粒皆辛苦');// 关闭可写流// ws.close(); ws.end();复制代码
- 简单读取文件
const fs = require('fs');fs.readFile('./6.txt', function (err, data) { if (!err) { // 读取文件的数据。 默认是二进制数据。 console.log(data.toString()); } else { console.log(err); }});复制代码
- 流式读取文件
const fs = require('fs');// 创建可读流const rs = fs.createReadStream('C:\\Users\\XiongJian\\Desktop\\异步写入文件.avi');// 创建可写流const ws = fs.createWriteStream('./a.avi');rs.once('open', function () { console.log('可读流打开了~');})rs.once('close', function () { console.log('可读流关闭了~'); // 读取完数据,就说明写入完成。就关闭可写流 ws.end();})// 绑定data事件,读取数据rs.on('data', function (data) { // console.log(data); // console.log(data.length); // 65536 byte = 64 kb // 将读取的数据写入新的文件 ws.write(data);});复制代码
- pipe
const fs = require('fs');// 创建可读流const rs = fs.createReadStream('C:\\Users\\XiongJian\\Desktop\\异步写入文件.avi');// 创建可写流const ws = fs.createWriteStream('./a.avi');rs.pipe(ws);复制代码