博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript基础学习——Node.js基础模块(一)
阅读量:3916 次
发布时间:2019-05-23

本文共 6984 字,大约阅读时间需要 23 分钟。

一、Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。 Node.js 的包管理器 npm,是全球最大的开源库生态系统。

二、中文官网:http://nodejs.cn/

三、作用

(1)统一前后端编程语言环境

(2)带来高性能的 I/O 操作

(3)并行 I/O 可以更高效的利用分布式环境

(4)并行 I/O 提高 Web 渲染能力

(5)可用于云计算平台

(6)可用于游戏开发

(7)工具类应用

四、NodeJS的下载与安装

1、下载

http://nodejs.cn/download/

2、安装

3、测试NodeJS是否安装成功

进入DOS环境,在命令行输入:node -v或node --version

如果显示版本号,说明安装成功。

注意:

(1)node.js环境中没有window对象,也没document对象,不能进行DOM操作。

(2)不能用document.write()和alert()进行输出测试,只能用console实现。
(3)node.js可以直接运行JS文件,JS文件的扩展名可以不写。

五、NodeJS模块

模块就是JS代码块的封装,在封装时一定要请变量(单值、引用类型(数组、对象、函数等))暴露出来供其它文件调用。

NodeJS模块化规范:Common.js。也支持AMD和ES6模块化。

1、常用内置模块

HTTP 模块:处理客户端的网络请求

URL 模块:处理客户端请求过来的URL
Query Strings 模块:处理客户端通过 get/post 请求传递过来的参数
File System 模块:处理客户端与服务器之间的文件读取操作
Path 模块:操作文件的路径,为文件操作服务
Global 模块:全局共享的,不需要导入模块即可以使用
fs模块:用来访问文件

使用内置模块时,可以不用npm安装,直接引入即可。

引入:var|let|const 变量 = require('模块名');

let fs = require('fs');console.log(fs);const http = require('http');console.log(http);

注意:测试的时候要进入当前文件的目录下,打开cmd,输入node 文件名 即可

比如:文件名是“01常用内置模块”  输入的就是 node “01常用内置模块”  或者 先输入node 再写个01摁下tab键,会自动补全

2、用户自定义模块

(1)定义模块

      eg:
        // 将要暴露的变量放入到一个对象中,实现一起抛出
        module.exports = {
          name: 'Mickle',
          goods: {
            id: '00001',
            goodsName: '华为手机',
            price: 69999
          },
          arr: [1,2,3,4,5],
          fn: function(){
            console.log(11111);
          }
        }

        exports.name = 'Tom';

        exports.fn1 = function(num){
          for(var i=1,sum=0;i<=num;i++){
            sum += i;
          }
          return sum;
        }

(2)引入:var|let|const 变量名 = require('./用户自定义模块名'); // .js可以省略

注意:引入用户自定义模块时,文件名前必须要加./或../。

var m = require('./module'); // .js可以省略// console.log(m);// console.log(m.goods.goodsName);// m.fn();console.log(m.name);console.log(m.fn1(10));

六、回调函数

回过头来再调用这个函数。回调函数是异步执行的。

  
Document

七、异步编程(了解)

异步编程主要解决方案:

事件发布/订阅模式

Promise/Deferred模式
流程控制库

八、Buffer缓存区

Buffer 是 Node.js 中的一个用来读取或操作二进制数据流的全局变量。

1、Buffer.from()

Buffer.from 方法返回一个新建的包含所提供的字节数组的副本的Buffer。

2、Buffer.alloc(size[, fill[, encoding]])

Buffer.alloc 方法能够为我们分配一个大小为 size 字节的新建的 Buffer。 如果 fill 为 undefined ,则该Buffer 会用 0 填充。

3、Buffer.allocUnsafe(size)

Buffer.allocUnsafe 方法可以为为我们分配一个大小为 size 字节的新建的 Buffer 。 如果 size 大于buffer.constants.MAX_LENGTH 或小于 0,则抛出 RangeError 错误。 如果 size 为 0,则创建一个长度为 0 的Buffer。

4、Buffer 与字符编码

指定编码格式。

编码:

      ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
      utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
      utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
      ucs2 - 'utf16le' 的别名。
      base64 - Base64 编码。当从字符串创建 Buffer 时,按照 RFC4648 第 5 章的规定,这种编码也将正确地接      受“URL 与文件名安全字母表”。
      latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式(由 IANA 定义在 RFC1345 第 63 页,用作 Latin-1
      补充块与 C0/C1 控制码)。
      binary - 'latin1' 的别名。
      hex - 将每个字节编码为两个十六进制字符。

/* let buffer = Buffer.from('How are u?');console.log(buffer);console.log(buffer.toString()); *//* const buf1 = Buffer.alloc(5);const buf2 = Buffer.alloc(5, 3);const buf3 = Buffer.alloc(6, '中文', 'utf-8')console.log(buf1); // 
console.log(buf2); //
console.log(buf3); //
console.log(buf3.toString()); // 中文 *//* const buf1 = Buffer.allocUnsafe(10);const buf2 = Buffer.allocUnsafe(10);const buf3 = Buffer.allocUnsafe(10);console.log(buf1); //
console.log(buf2); //
console.log(buf3); //
  */const buf = Buffer.from('蜀山行者');console.log(buf); //
console.log(buf.toString()); // 蜀山行者console.log(buf.toString('utf-8')); // 蜀山行者console.log(buf.toString('base64'));console.log(buf.toString('ascii'));console.log(buf.toString('hex'));

九、fs模块

作用:用来读取文件,可以对文件进行读和写的操作。

对文件的操作有两种方式:同步和异步。

1、打开文件

    fs.open(path, flags[, mode], callback) 
      异步的方式打开文件fs.open 方法通常用来打开一个文件地址、URL 或者 Buffer。
        其中 flags 参数可以是:
        r - 以读取模式打开文件。如果文件不存在则发生异常。
        r+ - 以读写模式打开文件。如果文件不存在则发生异常。
        rs+ - 以同步读写模式打开文件。命令操作系统绕过本地文件系统缓存。

2、读取文件

(1)以异步的方式读取文件

fs.readFile(path[, options], callback) 

(2)同步方式读取文件

fs.readFileSync([path]filename);

const fs = require('fs')/* fs.open('./test.txt', 'rs+', (err, fd) => {//以异步方式打开文件  if (err) {    console.log('文件打开失败');    return false  }  let stu = {    id: '0001',    name: '张三',    age: 19  }  /*   文件描述符是许多编程语言中使用的概念,它们表示对打开文件的引用.  文件描述符将用于通过所有文件系统相关功能引用正确的文件流.  实际上stdout,stdin和stderr也被分配了一个文件描述符,它们占用fd 0到2,  下一个空闲文件描述符值为3.这就是为什么你的例子中返回的值是3.  */  /* fs.write(fd, 'aaaaaaaaaa是', (err, written, str) => {    if (err) throw err;    console.log(written);//13 写进去的字节总长,一个汉字占三个字节  }) */  /* fs.write(fd,JSON.stringify(stu),(err,written,str)=>{    if(err) throw err;    console.log(written);//38 包括了引号,逗号,冒号一类的    console.log(str);  }) })*/const rs=fs.openSync('./test.txt','rs+')// 以同步方式打开文件console.log(rs);

(3)向文件写入内容

fs.write(fd, buffer[, offset[, length[, position]]], callback) 异步的方式写入文件。

const fs = require('fs')fs.open('test.txt', 'rs+', (err, fd) => {  if (err) throw err;  fs.write(fd, 'skr,skr', (err) => {    if (err) throw err  })})

(4)关闭文件

fs.close(fd, callback) 异步的方式关闭文件

const fs = require('fs');//打开文件fs.open('test.txt', 'rs+', (err, fd) => {  if (err) throw err  //执行写入操作  fs.write(fd, 'skr,skr', (err) => {    if (err) throw err  })  //关闭文件  fs.close(fd, () => {    console.log('文件已关闭');  })})

(5)删除文件

fs.unlink(path, callback) 异步的方式删除文件

注意:该命令不能删除目录。

const fs = require('fs')//删除文件fs.unlink('test.txt', () => {  console.log('delete');})

(6)读取一个目录

fs.readdir(path[, options], callback)  // 异步

fs.readdirSync([path]filename);  // 同步

const fs = require('fs')/* //异步fs.readdir('./', 'utf-8', (err, rs) => {  if (err) throw err;  console.log(rs);  console.log(JSON.stringify(rs));  console.log(rs.toString());}) *///同步console.log(fs.readdirSync('c:/'));

十、fs文件流

1、stream:流是一个抽象接口,有四种流类型:

    readable:可读
    writable:可写操作
    duplex:可读可写操作
    transform:操作被写入数据,然后读出结果

2、常用事件有:

    data:当有数据可读触发
    end:没有数据可读触发
    error:发生错误时触发
    finish:完成触发

3、创建可读流

    fs.createReadStream(path[, options]);
    用来读取指定文件的内容。

const fs = require('fs')var data = ""//创建可读流var readerStream = fs.createReadStream('./test.txt')//设置编码为utf8readerStream.setEncoding('utf8')//处理流事件-->data,end,errorreaderStream.on('data', function (chunk) {  data += chunk})readerStream.on('end', function () {  console.log(data);})readerStream.on('error', function (err) {  console.log(err.stack);})console.log(data);console.log("success");

4、创建可写流

    fs.createWriteStream(path[, options]);
    用来向指定文件写入指定的内容。

const fs=require('fs')let data="write text"//创建可写流let ws=fs.createWriteStream('./ws.txt')//用指定的编码格式,将内容写入到指定的文件ws.write(data,'utf-8')//标记文件尾ws.end()//处理流事件(data,end,error,finish)ws.on('finish',()=>{  console.log('写入成功');})ws.on('error',err=>{  //捕获异常堆栈信息  console.log(err.stack);})console.log('执行完成');

5、管道流

    fs.readStream.pipe(writeStream);
    将可读流信息导入到可写流中,也叫管道流。

let fs = require('fs')//创建可读流let rs = fs.createReadStream('read.txt')//创建可写流let ws = fs.createWriteStream('write.txt')//管道读写操作rs.pipe(ws)//将rs读取的内容写入到ws创建的写入流文件中

6、链式流  

    通过连接输出流到另一个流并创建多个流操作链机制,通常通过管道实现。

let fs = require('fs');let zlib = require('zlib'); // 该模块用于压缩文件// 压缩文件// 读取文件,并对文件进行压缩处理fs.createReadStream('read.txt')  .pipe(zlib.createGzip())  .pipe(fs.createWriteStream('read.txt.rar')); // 解压文件// fs.createReadStream('read.txt.rar')//   .pipe(zlib.createGunzip())//   .pipe(fs.createWriteStream('read.txt'));console.log('文件解压完成!');

 

转载地址:http://gfvrn.baihongyu.com/

你可能感兴趣的文章
一位资深程序员大牛给予Java初学者的学习路线建议
查看>>
浅谈Java中的hashcode方法
查看>>
Java NIO:NIO概述
查看>>
Java中的static关键字解析
查看>>
Java多态性理解
查看>>
Java IO流学习总结
查看>>
Java发送http的get、post请求
查看>>
Java中volatile关键字的含义
查看>>
给Java程序猿们推荐一些值得一看的好书
查看>>
Java这些冷知识你知道吗?
查看>>
假如时光倒流,我会这么学习Java
查看>>
一位10年Java工作经验的架构师聊Java和工作经验
查看>>
Java项目经验——程序员成长的钥匙
查看>>
假如时光倒流,我会这么学习Java
查看>>
一位资深程序员大牛给予Java初学者的学习路线建议
查看>>
Java后端2017书单推荐
查看>>
Java的内存回收机制
查看>>
2年Java开发工作经验面试总结
查看>>
最全面的Java多线程用法解析
查看>>
Java ClassLoader 原理详细分析
查看>>