Node.js简单入门介绍

本文介绍了Node.js的基础准备,包括环境变量、进程与线程的概念,Node.js的简介及用途,COMMONJS规范,模块定义与引用,npm包管理器的使用,Buffer缓冲区的理解与操作,以及fs文件系统的详细介绍。

基础准备

  1. 命令行窗口的常用命令
    dir 列出当前目录下的所有文件
    cd 目录名 进入到指定的目录
    md 目录名 创建一个文件夹
    rd 目录名 删除一个文件夹
    . 表示当前目录
    … 表示上一级目录

  2. 环境变量
    当我们在命令行窗口打开一个文件或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,如果没有找到则会依次到环境变量path路径中寻找,直到找到为止,没有则报错,所以我们可以将一些经常需要访问的程序和文件的路径添加到path中,这样我们就可以在任意位置访问他们

  3. 进程和线程
    进程负责为程序的运行提供必备的环境,进程就相当于工厂中的车间
    线程是计算机中的最小计算单位,线程负责执行进程中的程序,线程就相当于工厂车间中的工人
    JS是单线程的,Java是多线程的

Node.js

  1. 简介
    是一个能够在服务器端运行JavaScript的JavaScript运行环境,采用Google开发的V8引擎运行JS代码
    在这里插入图片描述
    Node.js起初是用来写高性能服务器的,称作Webjs,Node.js是用来写单线程的服务器的,它处理请求时是单线程,但是在后台拥有一个I/O线程池,不像传统的服务器是多线程的,Node.js用途很多,比如:Web服务API(REST),实时多人游戏,后端的Web服务(跨域,服务端的请求),基于Web的应用,多客户端的通信(即时通信)

  2. COMMONJS规范

ECMAScript标准的缺陷:

  • 没有模块系统
  • 标准库较少
  • 没有标准接口
  • 缺乏管理系统
    因此提供出了COMMONJS规范,希望JS能够在任何地方运行,它主要定义了模块的三个方面
  • 模块引用
  • 模块定义
  • 模块标识
    下面我们一一介绍
    模块定义
  • 在Node中,一个js文件就是一个模块
  • 在Node中,每一个js文件中的代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其它模块中无法访问
  • 我们可以通过exports来向外暴露变量和方法,只需要将需要暴露给外部的变量和方法设置为exports的属性即可
/*
*  模块化
*       -在Node中,一个js文件就是一个模块
*       -在node中,每一个js文件中的代码都是独立运行在一个函数中
*       而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
* */

console.log('我是一个模块,我是module02.js')

// var x = 10
// var y = 10

/*
* 我们可以通过 exports 来向外暴露变量和方法
* 只需要将需要暴露给外部的变量或者方法设置为exports的属性即可
* */

//向外部暴露属性和方法

exports.x = '我是02_moudles的x'
exports.y = '我是y'
exports.fn = function () {
  
}

模块引用

  • 在Node中,通过require()函数来引入其它的模块
  • require()可以传递一个文件的路径作为参数,Node将会自动根据该路径引入外部模块,这里路径如果使用相对路径,必须以.或者…开头
  • 引入模块以后,该函数会返回一个对象,这个对象代表的就是引入的模块
//引入其他模块

/*
* 在node中,通过require()函数来引入外部的模块
* require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块
* 这里路径,如果使用相对路径,必须以.或者..开头
*
* 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的就是引入的模块
*
* 我们使用require引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块
*
* 模块分成两大类
* 核心模块
*   --由node引擎提供的模块
*   --核心的标识就是模块的名字
* 文件模块
*   --由用户自己创建的模块
*   --文件模块的标识就是路径
* */

var md = require("./02_moudles")

var fs = require('fs')

console.log(md)

var math = require('./math')

console.log(math.add(1,2),math.mul(1,2))

console.log(fs)

npm

npm包管理器,使用npm可以对项目需要的包进行管理,这使得添加或者删除相关包变得极其简单,经常使用的指令有:
npm install 包名 向项目中添加某个包
npm uninstall 包名 移除项目中的某个包
npm install 安装项目依赖中所有需要的包
修饰:
-g 表示全局安装
-dev 表示当前文件安装
–save 表示安装到项目依赖中

通过npm下载的包都放到了node_modules文件夹中,直接通过包名就可以引入使用了
node在使用模块的名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块如果有则直接使用,如果没有则去上一级目录的node_modules中寻找没有继续上一级,直到磁盘的根目录,没有则报错

Buffer缓冲区

Buffer(缓冲区)

    • Buffer的结构和数组很像,操作的方法也和数组类似
    • 数组中不能存储二进制文件,而Buffer就是专门用来存储二进制数据
    • 使用Buffer不需要引入,直接使用即可
    • 在Buffer中存储的都是二进制数据,但是在显示的时候都是以16进制的形式显示
  •   buffer中每一个元素的范围是从00 - ff    (0 - 255)
    
  •   00000000 - 11111111
    
  •   计算机中 1个0 或 1个1 我们称为1位(bit)
    
  •   8bit = 1byte(字节)
    
  •   buffer中的一个元素,占用的内存就是一个字节
    
  •   1024byte = 1kb
    
  •   1024kb = 1mb
    
  •   1024mb = 1gb
    
  •   1024gb = 1tb
    
  •   Buffer的大小一旦创建,则不能修改,Buffer实际上是对底层内存的直接操作
    
var str = 'Hello cxq'

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

console.log(buf)

console.log(buf.length) //占用内存的大小 (一个汉字3个字节)
console.log(str.length) //字符串的长度


//创建一个指定大小的Buffer
//Buffer的所有构造函数都是不推荐使用的,废弃的,最好不用
// var buf2 = new Buffer(10) //10个字节的Buffer
// console.log(buf2.length)

//创建指定大小的Buffer
var buf2 = Buffer.alloc(10) //10个字节的Buffer
//通过索引,来操作Buffer中的元素
buf2[0] = 88
buf2[1] = 255
buf2[2] = 0xaa
// buf2[3] = 256 只能保存8位 且范围00000000 - 11111111 超出的舍去
// buf2[10] = 255 没用
console.log(buf2)

//只要数字在控制台或页面输出一定是10进制
// console.log(buf2[2])
console.log(buf2[2].toString(16))//以16进制输出

//遍历
// 
// for (var i = 0; i < buf2.length; i++) {
//   console.log(buf2[i])
//  
// }

//Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据
var buf3 = Buffer.allocUnsafe(10)
console.log(buf3)
//alloc分配内存空间的时候会将内存原来的数据清空
//但是allocUnsafe不会清空,所以有可能有值,一些敏感的数据。,安全性不高,但效率更高

var buf4 = Buffer.from('我是一段文本数据')
console.log(buf4.toString())

fs文件系统

文件系统(File System)

  • -通过Node来操作系统中的文件
  • -使用文件系统,需要引入fs模块,fs是核心模块,直接引入不需要下载

文件的写入

  • -手动操作的步骤
  • 1.打开文件
    
  •   - fs.openSync(path,flags[,mode])
    
  •     - path 要打开文件的路径
    
  •     - flags 打开文件要做的操作的类型
    
  •         r 只读的
    
  •         w 可写的
    
  •     - mode 设置文件的操作权限,一般不传
    
  •    返回值
    
  •       -该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件
    
  •       进行各种操作
    
  • 2.向文件中写入内容
    
  •     fs.writeSync(fd,string[,position[,encoding]])
    
  •       - fd 要写入文件的描述符
    
  •       - string 要写入的内容
    
  •       - position 写入的起始位置
    
  •       - encoding 写入的编码,一般是utf-8
    
  • 3.保存并关闭文件
    
  •     fs.closeSync(fd)
    
  •       - fd  文件描述符
    
ar fs = require('fs')
// console.log(fs)

//打开文件
var fd = fs.openSync("hello.txt","w")
console.log(fd)

//向文件中写入内容
fs.writeSync(fd,"今天天气真不错!")

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

异步文件的写入

  • fs.open(path,flags[,mode],callback)
    • 异步调用的方法,结果都是通过回调函数的参数返回的
    • 回调函数有两个参数
  •   err 错误对象    如果没有错误则为null
    
  •   fd 文件描述符
    
  • fs.write(fd,string[,position[,encoding]],callback)
    • 回调函数有三个参数
  • fs.close(fd,callback)
//引入fs模块
var fs = require('fs')

//打开文件
fs.open("hello2.txt","w",function (err,fd) {
  if(!err){
    //写入内容
    fs.write(fd,"这是异步写入的内容",function (err) {
      if(!err){
        console.log("写入成功")
      }
      //关闭文件
      fs.close(fd,function (err) {
        if (!err){
          console.log("文件已关闭")
        } 
      })
    })
  }else{
    console.log(err)
  }
})

简单文件写入

  • fs.writeFile(file, data[, options], callback)
    
  • fs.writeFileSync(file, data[, options])
    
  •   - file 要操作的文件的路径
    
  •   - data 要写入的数据
    
  •   - options 选项,可以对写入进行一些设置
    
  •   - callback 当写入完成以后执行的函数
    
//引入fs模块
var fs = require('fs')

fs.writeFile('hello3.txt',"这是简单文件的写入",{flag:'a'},function (err) {
  if(!err){
    console.log("写入成功")
  }else{
    console.log(err);
  }
})

同步、异步、简单文件写入都不适合于大文件的写入,性能较差,容易导致内存溢出

流式文件写入
创建一个可写流

  • fs.createWriteStream(path[,options])
    • 用来创建一个可写流
    • path 文件路径
    • options 配置的参数
var fs = require('fs')
var ws = fs.createWriteStream('hello4.txt')

//打开流和关闭流的事件监听
ws.once('open',function () {
  console.log("流打开了")
})

ws.once('close',function () {
  console.log('流关闭了')
})
ws.write("玲珑骰子安红豆")
ws.write("入骨相思知不知")
ws.write("万里悲秋常作客")
ws.write("百年多病独登台")

//关闭流
ws.end()
  • 1.同步文件的读取
  • 2.异步文件的读取
  • 3.简单文件的读取
  • 4.流式文件的读取
//简单文件的读取

var fs = require('fs')

fs.readFile('ani.jpg',(err,data) => {
  if(!err){
    //console.log(data)
    //写入到新的地方
    fs.writeFile('you.jpg',data,(err) => {
      if(!err){
        console.log('写入成功')
      }
    })
  }
})
//流式文件的读取  适用于大文件

var fs = require('fs')

//创建一个可读流
var rs = fs.createReadStream('hello4.txt')
//创建一个可写流
var ws = fs.createWriteStream('a.txt')

//监听流的开启和关闭
rs.once('open',() =>{
  console.log('可读流打开了')
})

rs.once('close',() => {
  console.log('可读流关闭了')
  ws.end()
})

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

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

//如果要读取一个可读流中的数据,必须要可读流绑定一个data事件,data事件绑定完毕
//它会自动开始读取数据,数据通过回调函数的参数返回
rs.on('data',(data) => {
  //console.log(data);
  ws.write(data)
})
var fs = require('fs')

var ws = fs.createWriteStream('my.jpg')
var rs = fs.createReadStream('ani.jpg')
//可以将可读流中的内容直接输出到可写流中
rs.pipe(ws)

nodejs的东西还有很多,我只是例举其中很简单的东西,更多的内容,大家可以查看官方API链接
好了,我的分享就到这里了,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值