本文共 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/