Node.js简单入门笔记

本文学习内容来自b站视频:【尚硅谷】最经典Node.JS全套完整版教程(快速入门nodejs)

视频地址:https://www.bilibili.com/video/BV1bs411E7pD?share_source=copy_web

本文内容只有 Node.js 简介、模块化、NPM、以及 Buffer、fs等模块的基本使用。

Node.js官方文档地址:http://nodejs.cn/

目录

一、 Node.js 简介

二、 模块化简介

三、模块化详解

四、包

五、NPM简介(node package manager)

六、node搜索包的流程

七、Buffer (缓冲区)

八、fs文件系统(File System)


一、 Node.js 简介

1. node.js是能在 服务端 运行 Javascript 的开放源代码、跨平台 Javascript运行环境 。

2. Node 是对ES标准的实现,是JS的引擎,通过node可以使js代码在服务端执行

3. 可以使用所有的内建对象,但是不能使用DOM和BOM

4. 可以在后台编写服务器

5. node处理请求时是单线程的,但是在后台拥有一个I/O(input、output对磁盘的读和操作)线程池。


二、 模块化简介

1. 模块:在node中,一个js文件就是一个模块

2. 引入外部模块:通过require()函数引入外部模块

   - require()传递 外部模块的路径 作为参数

   - require()会 返回对象 ,对象就是引入的外部模块

3. node里,js文件中的 js代码 都独立运行 在一个函数中,而不是全局作用域

4. 模块中的变量和函数 无法在外部模块中访问

5. 暴露变量和方法: 通过 exports.变量

6. 两大类:

   - 核心模块:由node引擎提供

   - 文件模块:用户自己创建


三、模块化详解

1. node全局对象global

   - 作用和window类似

   - 全局创建的变量,会作为global的属性保存

   - 全局创建的函数,会作为global的方法保存

2. function(experts,require,module,__filename,__dirname){}

   - 模块中的代码 都包装在此函数中,传递5个参数

   - experts    该对象将变量和函数暴露在外面 (是module的属性)

   - require    函数,用来引入外部模块 

   - module     代表当前模块本身

   - __filename 当前模块的完整路径

   - __dirname  当前模块所在文件夹的完整路径


四、包

1. comonjs的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具

2. comonjs的包规范由 包结构和 两个部分组成

   - 包结构:用于组织包中的各个文件

   - 包描述文件:描述包相关的信息,以供外部读取分析

3. 包结构

   - package.json  包描述文件(必需)

   - bin           可执行二进制文件

   - lib           js代码

   - doc           文档

   - test          单元测试 


五、NPM简介(node package manager)

1. comonjs的包规范是理论,npm是其中一种实践

2. 对于node而言,npm帮助其完成第三方模块的发布、安装、依赖等

3. npm命令

   - npm -v                             查看npm版本

   - npm                                  帮助说明

   - npm version                     查看所有模块的版本

   - npm search 包名             搜索模块包

   - npm install 包名                在当前目录安装包

   - npm install 包名 -g            全局模式安装包(全局安装一般是工具)

   - npm remove 包名               删除包

   - npm install 包名 --save      安装包并添加到依赖中 *

   - npm install                          下载当前项目所依赖的包


六、node搜索包的流程

1. 通过npm下载的包都放在 node_modules 文件夹中

2. node搜索包的流程

   - 首先在当前目录node_modules中寻找是否含有该模块,如果有之间使用

   - 如果没有,则去上一级目录的node_modules中寻找

   - 如果没有,则再去上一级目录寻找,找到为止

   - 如果找不到则报错


七、Buffer (缓冲区)

1. 从结构上看,Buffer像数组,以16进制的形式显示,存储的是二进制数据

2. 实际上,一个元素就表示内存中的一个字节

3. Buffer中的内存 不是通过js分配的,而是在底层通过C++申请的

let str = 'hello buffer';

// 将一个字符串保存到buffer中
const buf = Buffer.from(str)

console.log(buf) // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

// 占用内存的大小
console.log(buf.length) //12

// 字符串的长度
console.log(str.length) //12

4. 可以直接通过Buffer来创建内存中的空间

5. Buffer的方法

   - Buffer.from(strign)       将一个字符串转换为buffer

   - Buufer.alloc(size)        创建一个指定大小的Buffer

   - Buffer.allocUnsafe(size)  创建一个指定大小的Buffer,可能包含敏感数据

6. 注意:buffer的构造函数都是不推荐使用的

// buffer的构造函数都是不推荐使用的
// 创建一个指定大小的buffer
// 10个字节的buffer
// const buf2 = new Buffer(10)  

// 创建10个字节的buffer
const buf2 = Buffer.alloc(10);

// 通过索引,来操作buf中的元素
buf2[0] = 8

console.log(buf2) //<Buffer 08 00 00 00 00 00 00 00 00 00>

7. 使用场景:用户给服务器 发送请求(二进制数据)的数据 ,和服务器返回响应的数据(二进制数据) ,都是存在Buffer里面的


八、fs文件系统(File System)

1. 文件系统:就是通过Node来操作系统中的文件

2. 在node中,与文件系统的交互很重要。服务器的本质,就是将本地的文件发送给远程的客户端。

3. 使用文件系统:引入fs模块

4. 同步和异步调用

   - fs模块中所有的操作有两种形式:同步和异步

   - 同步文件系统:会阻塞程序的执行,也就是除非操作完毕后,否则不会向下执行代码

   - 异步文件系统:不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回

5. 同步文件的写入

   - 打开文件:fs.openSync(path,flag[,mode])

     - path:要打开文件的路径

     - flag:打开文件要做的操作的类型 (r:只读的 ; w:可写的)

     - mode:设置文件的操作权限,一般不传

     - 返回值:该方法会返回一个文件的 描述符 作为结果,可以通过该描述符对文件进行各种操作

   - 向文件中写入内容:fs.writeSync(fd,string[,position[,encoding]])

     - fd:文件的描述符,需要传递要写入的文件的描述符

     - string:要写入的内容

     - position:写入的起始位置

     - encoding:写入的编码,默认utf-8

   - 保存并关闭文件:fs.closeSync(fd)

//完整的fs同步写入

// 使用文件系统:引入fs模块
const fs = require('fs')

// 同步文件的写入
// 打开文件
// 返回值:返回一个文件的描述符
const fd = fs.openSync('hello.txt', 'w')
console.log(fd);  // 3 (已经打开了)

// 向文件中写入内容
fs.writeSync(fd, '我已经通过nodejs写入内容了')

// 关闭文件
fs.closeSync(fd)

6. 异步文件的写入

   - 打开文件:fs.open(path,flag[,mode],C)

     - callback:通过参数返回结果

     - callback的两个参数:err 错误对象,没有错误则为null ; fd 文件描述符

     - 异步没有返回值

   - 向文件中写入内容:fs.write(fd,string[,position[,encoding]],callback)

   - 保存并关闭文件:fs.close(fd)

// 异步文件写入

const fs = require('fs')

// 1.打开文件
fs.open('hello2.txt', 'w', (err, fd) => {
    // console.log(arguments);
    if (!err) {
        console.log(fd); //3
        // 2.写入文件
        fs.write(fd, '写入hello2', err => {
            if (!err) {
                console.log('成功写入~~~');
            }
        })
        // 3.关闭文件
        fs.close(fd, err => {
            if (!err) {
                console.log('文件已关闭');
            }
        })
    } else {
        console.log(err);
    }
})

7. 简单文件写入:异步和同步

   - fs.writeFile(file,data[,option],callback)

     - 操作符flag:r 读取 ; w(默认) 写,会替换原有文件 ; a 写,用于追加不会替换

   - fs.writeFileSync(file,data[,option])

// 简单文件写入

const fs = require('fs')

fs.writeFile('hello3.txt', '这是通过writeFile写入的内容', err => {
    if(!err){
        console.log('成功写入~~~~~');
    }
})

8. 流式文件写入

   - 同步、异步、简单文件写入的缺点:都不适合大文件的写入,性能较差,容易导致内存泄漏

   - 创建可写流:const ws = fs.createWriteStream(path[,options])

     - path:文件路径

     - options:配置参数

   - 写入文件:ws.write()

   - 关闭文件:ws.end()

const fs = require('fs')

// 流式文件写入

// 创建一个可写流
const ws = fs.createWriteStream('hello3.txt')

console.log(ws);

// 通过ws向文件输出内容
ws.write('通过可写流写入文件的内容  ')

// 关闭流
ws.end()

9. 简单文件读取

   - 同步:fs.readFileSync(path[,options])

   - 异步:fs.readFile(path[,options],callback)

     - path:文件路径

     - options:读取选项

     - callback:通过回调函数将读取到的数据返回

       - 参数err:错误对象

       - 参数data:读取到的数据,返回的是一个Buffer

const fs = require('fs')

fs.readFile('hello3.txt',(err,data)=>{
    if(!err){
        console.log(data); // 返回的数据是一个buffer
    }
})

10. 流式文件读取

    - 流式文件读取适用于比较大的文件,可以分多次将文件读取到内存中

    - 创建可读流:const rs = fs.createReadStream(path[,options])

    - 监听流的开启和关闭:使用once()方法可以监听开启和关闭

    - 读取可读流的数据:必须为可读流绑定一个data事件,会自动读取数据和关闭可读流

    - rs.pipe(ws):可以将可读流中的内容,直接输出到可写流中

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


// 读取可读流的数据

// rs.on('data', data => {
//     // console.log(data);
//     ws.write(data)
// })

// 将可读流中的内容,直接输出到可写流中
rs.pipe(ws)

11. fs模块的其他方法

    - fs.existsSync(path):检查一个文件是否存在,返回一个Boolean值

    - 获取文件的状态:

      - fs.statSync(path) 

      - fs.stat(path,callback(err,stat)):callback返回对象,保存了当前对象状态的相关信息

    - 删除文件

      - fs.unlink(path,callback)

      - fs.unlinkSync(path)

    - 读取一个目录的目录结构

      - fs.readdir(path[,options],callback)

      - fs.readdirSync(path[,options])

    - 截断文件,将文件修改为指定大小

      - fs.truncate(path,length,callback)

      - fs.readdirSync(path,length)

笔记到这里就结束了,这只是关于node.js最最简单的入门了。

本意是自己温故,如果能帮到你一点点,真是这篇笔记的荣幸。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值