Node第一天

本文围绕 Node.js 展开,介绍了 CommonJS 模块化规范的引入与暴露方式,阐述了 Node.js 的全局对象 global 及事件轮询机制。还讲解了包(package)的相关知识,如 package.json 文件内容,以及 npm 命令的使用。此外,涉及 Buffer 创建、Node.js 核心模块(path、events、fs)的操作,包括文件的读写等。
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事件轮询机制:

    1. timers 定时器阶段 计时,执行到点的定时器回调函数
    2. pending callbacks
    3. idle, prepare
    4. poll 轮询阶段 轮询队列,里面放置n个回调函数。 首先检查轮询队列是否为空:
      • 不为空:依次取出,同步执行
        • 如果之前设置过setImmediate函数,就去下一个check阶段
        • 如果没有设置过setImmediate函数,就在当前阶段停留
        • 如果定时器到点了,也会去下一个check阶段
    5. check 检查阶段 执行setImmediate的回调函数
    6. 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

    • 注意:

      1. 不要有多余的东西。多余的逗号、注释
      2. 包名不能重复,下载jquery包,你的包名就不能叫jquery。不能中文
npm命令
  • nodejs都是通过npm来下载要依赖的包(下载包之前,要先有包描述文件package.json)

    1. npm install/i xxx 等价于 npm i xxx --save/-S node_modules: 放置下载的包 package-lock.json: 会缓存包下载地址。下次下载更快 将包添加到package.json生产依赖中
    2. npm i xxx --save-dev/-D 下载并添加到开发依赖中
    3. npm i xxx -g 全局安装: 只用于运行指令 npm i browserify -g browserify xxx -o yyy
    全局安装包的路径:C:\Users\XiongJian\AppData\Roaming\npm
    复制代码
    1. npm init 初始化一个包描述文件 package.json npm init -y 创建全部使用默认值 package.json
    2. npm i 下载当前目录中package.json的所有依赖
    3. npm remove xxx 删除包和依赖
  • 将下载地址关联到淘宝
npm config set registry http://registry.npm.taobao.org/
复制代码
  • yarn 是facebook公司研发开源的包管理器
    • npm i yarn -g 全局安装,作为指令使用
    1. 下载并添加到生产依赖  yarn add xxx
    2. 下载并添加到开发依赖 yarn add xxx --dev
    3. 下载全局包 yarn global add xxx
      需要将下载包配置成环境变量才能使用,一般不用yarn下载全局包
    4. 下载依赖所有包 yarn
    复制代码
  • 将下载地址关联到淘宝
 yarn config set registry http://registry.npm.taobao.org/
复制代码
Buffer
  • 创建Buffer:
    1. new Buffer(10) 方法被废弃了,不要在使用
    2. Buffer.alloc() 找了内存清空里面所有数据,性能稍差
    3. Buffer.allocUnsafe() 不安全的,可能会包含敏感数据
    4. 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.js

console.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文件系统)
  1. 同步写入文件
    • 同步写入文件
    1. 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);
复制代码
  1. 异步写入文件
// 引入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);
  }
});
复制代码
  1. 简单写入文件
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);
  }
})
复制代码
  1. 流式写入文件
/*
 流式写入文件:适用大文件
 */

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();
复制代码
  1. 简单读取文件
const fs = require('fs');
fs.readFile('./6.txt', function (err, data) {
  if (!err) {
    // 读取文件的数据。 默认是二进制数据。
    console.log(data.toString());
  } else {
    console.log(err);
  }
});
复制代码
  1. 流式读取文件
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);
});

复制代码
  1. pipe
const fs = require('fs');
// 创建可读流
const rs = fs.createReadStream('C:\\Users\\XiongJian\\Desktop\\异步写入文件.avi');
// 创建可写流
const ws = fs.createWriteStream('./a.avi');
rs.pipe(ws);
复制代码

转载于:https://juejin.im/post/5cf12a736fb9a07ea712f7c5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值