node_入门,包,流式 (一)

2019-02-10  本文已影响3人  mao77_

node_入门,包,流式 (一)

1. node入门

nodeJs是基于chrome V8引擎的一个运行环境

1.1 优点

  1. 异步非堵塞的I/O
  2. 事件循环机制
  3. 事件驱动
  4. 单线程/跨平台

1.2 缺点

  1. callback hell
  2. 单线程, 处理不好CPU密集型任务

2. 模块化

将一个大的功能拆分为一个个小的模块, 通过不同的模块的组合来实现一个大功能。

2.1 优点

  1. 避免命名冲突(减少命名空间污染)
  2. 提高代码的复用性, (提升用户体验)
  3. 方便今后维护代码
  1. 自定义模块:用户自己写的模块,引入路径必须以 ./ 或者 ../开头 后面加上文件的完整路径,否则就会报错
  2. 核心模块:node中自带的模块 和 通过npm下载的模块 ,引入路径直接写模块名称就OK
//定义模块的内容
function add(x, y) {
    return x + y;
}
function mul(x, y) {
    return x * y;
}
const love =  'cat';
//暴露模块内容
module.exports = {
    add, mul, love
}
    
    /////////
//定义模块的内容
const me = 'eloise';
const you = 'lily';
//暴露模块内容
exports.me = me;
exports.you = you;
var m1 = require('./myModule01');  //函数
console.log(m1);  //{ add: [Function: add], mul: [Function: mul], love: 'cat' }

var m2 = require('./myModule02');   //对象
console.log(m2);  //{ me: 'eloise', you: 'lily' }

console.log(m1.add(2, 3), m1.mul(2, 3), m1.love);  //5 6 'cat'
console.log(m2.me, m2.you);  //eloise lily

暴露模块的规则:

3. function-in-node

// console.log(this);  //空的对象
// console.log(arguments.callee.toString());  //伪数组  有数组的一般属性  没有数组的方法
/*
function (exports, require, module, __filename, __dirname) {}

  exports 暴露模块
  require 引入模块
  module module.exports 暴露模块
  __filename 当前文件的完整路径 绝对路径
  __dirname 文件夹的完整路径 绝对路径
 */

console.log(__filename, __dirname);
//C:\Users\web\Desktop\eloise\01\03_function-in-node.js
//C:\Users\web\Desktop\eloise\01

4. global

// process.nextTick() 此函数能在任意阶段执行

setImmediate(function () {
  console.log('setImmediate()函数执行了');
})

process.nextTick(function () {
  console.log('process.nextTick()函数执行了');
})

setTimeout(function () {
  console.log('setTimeout()函数执行了');
}, 0)

// process.nextTick()函数执行了
// setTimeout()函数执行了
// setImmediate()函数执行了

5. Buffer

Buffer是一个类数组对象
不同是Buffer是专门用来保存二进制数据的。

// let buf = new Buffer(10);  //废弃了 性能差
// console.log(buf);

let buf1 = Buffer.allocUnsafe(10);  //方法是不安全的,可能包含敏感数据 但是性能最好
buf1.fill(0);//将内部的数据全部用0填充
console.log(buf1);  //<Buffer 98 d5 ef 98 f7 7f 00 00 01 00>
/*
  显示16进制数据
    00 - ff
    0 - 255
    0000 0000  - 1111 1111
    
    1 byte(字节) = 8 bit(位)
    1 kb = 1024 byte
    1 mb = 1024 kb
    1 gb = 1024 mb
    
    英文字母和数字  占1个字节
    汉字  占3个字节
 */

let buf2 = Buffer.alloc(10);  //方法安全的,不包含敏感数据 但是性能较差
console.log(buf2);

let buf3 = Buffer.from('meow meow meow');
// let buf3 = Buffer.from('尚硅谷');
console.log(buf3);
//<Buffer 6d 65 6f 77 20 6d 65 6f 77 20 6d 65 6f 77>

console.log(buf3[0], buf3.length);  //109 14   (16=>10)
buf3.forEach(item => {
    console.log(item); //(16=>10)
})

6. npm

全称:Node Package Manager , Node的管理包的工具

npm install -g cnpm --registry=https://registry.npm.taobao.org

有什么用

  1. npm -v
    查看npm的版本
  2. npm init
    初始化项目的package.json文件
  3. npm search / s 包名
    搜索指定的包
  4. npm install / i 包名
    安装指定的包
  5. npm install / i 包名 --save
    安装指定包并添加到项目的生产依赖中 (cnpm中, 后面一定要加save)
  6. npm install / i 包名 --save-dev
    安装指定包并添加到项目的开发依赖中
  7. npm install / i 包名 -g
    全局安装(全局安装都是安装一些工具)
  8. npm install / i
    安装项目中的所有依赖
  9. npm remove / r 包名
    删除指定的包

yarn: 是Facebook开源的新的包管理器,可以用来代替npm。

npm install cyarn -g --registry "https://registry.npm.taobao.org"
  1. yarn --version
  2. yarn init //生成package.json !!!注意生成的包名不能有中文,大写
  3. yarn global package (全局安装)
  4. yarn add package (局部安装)
  5. yarn add package --dev (相当于npm中的--save-dev)
  6. yarn remove package
  7. yarn list //列出已经安装的包名
//引入包math
const math = require('math');

console.log(math.add(2, 3));
console.log(math.mul(2, 3));

7. 异步写入文件

fs是什么

全称为file system,所谓的文件系统,就是对计算机中的文件进行增删改查等操作。它是一个服务器的基础,在Node中通过fs模块来操作文件系统。

异步写入文件

  1. 打开文件
  1. 写入文件
  1. 关闭文件
const fs = require('fs');

//打开文件
fs.open('hello.txt', 'w', 0o666, (err, fd) => {
  //处理错误
  if (!err) {
    //open方法没有出错
    console.log('open方法执行成功了');
    fs.write(fd, '今天天气真情朗', 0, 'utf8', (err, written, string) => {
      //处理错误
      if (!err) {
        //write方法没有出错
        console.log('write方法执行成功了');
        console.log(written, string);
      } else {
        //write方法出错了
        console.log(err);
      }
      //不管write方法成不成功,我都要关闭文件
      fs.close(fd, err => {
        //处理错误
        if (!err) {
          console.log('close方法执行成功了');
        } else {
          console.log(err);
        }
      })
    })
  } else {
    //open方法出错了
    console.log(err);
  }
})

8. 简单写入文件

const fs = require('fs');

/*创建要写入的内容*/
let buf = Buffer.from('hellow nodeJs');
// console.log(buf.toString());
fs.writeFile('3.txt', buf, err => {
    if(!err) {
        console.log('the writeFile success...');
    }else {
        console.log(err);
    }
})

9. 流式写入文件

const fs = require('fs');
//执行函数返回一个可写流
const ws = fs.createWriteStream('33.txt');
// //绑定事件监听
ws.on('open', fd => {
    console.log('file open success...');
})
ws.on('close', err => {
    if(!err){
        console.log('file close success');
    }
})
//写入内容
ws.write('who can told ');
ws.write('me just to tell ');
ws.write('my school and the flags');
//
// //关闭流
// ws.close();
ws.end();

10. 简单读取文件

const fs = require('fs');

fs.readFile('package.json', (err, data) => {
    if (!err) {
        //文件读取成功
        console.log(data); //返回值是一个Buffer
        console.log(data.toString());
    } else {
        //文件读取失败
        console.log(err);
    }
})

11. 流式读取文件

const fs = require('fs');
//创建可读流
const rs = fs.createReadStream('C:\\Users\\web\\Desktop\\1.mp4');
//创建可写流
const ws = fs.createWriteStream('1.mp4');
//绑定一次性事件
rs.once('open', () => {
  console.log('可读流打开了');
})
rs.once('close', () => {
  console.log('可读流关闭了');
  //可读流将所有数据都读取完毕了,所以要关闭可写流
  ws.end();
})

ws.once('open', () => {
  console.log('可写流打开了');
})
ws.once('close', () => {
  console.log('可写流关闭了');
})

//读取可读流的数据
rs.on('data', data => {
  // console.log(data);
  // console.log(data.length); //每次读取文件的最大值是 65536 = 64 * 1024  64kb
  ws.write(data);
})


//rs.pipe(ws);

上一篇 下一篇

猜你喜欢

热点阅读