Node.js笔记小全

目录

一、Node的小结

        1、Node.js是什么?

        2、Node.js解决了JavaScript的什么问题?

        npm详解

3、npm是什么?

4、npm常见命令?

Node中有一个热部署管理模块——nodemon

二、Node中的模块化

        Node中的三大模块

核心模块之path模块

        核心模块之fs模块

        核心模块之buffer模块

        核心模块之events模块(事件触发器)

        核心模块之http模块


一、Node的小结

        1、Node.js是什么?

        Node.js是JavaScript运行时。是JavaScript的运行环境,让JavaScript可以脱离浏览器运行。Node.js其实就相当于JavaScript的编译器。

        2、Node.js解决了JavaScript的什么问题?

  • 更好的组织代码,提升复用性。在ES6中这一点也得到了很大的提升。

  • 处理文件与数据库(实现非堵塞IO)。

  • 与互联网进行沟通,以标准化的格式处理请求并发送回答。

        npm详解

3、npm是什么?

        是JavaScript的包管理工具,也是Node.js的默认包管理工具。是各个包的依赖管理工具。

4、npm常见命令?

初始化:npm init (默认初始化 npm init -y)
安装依赖:npm insatll 依赖包名
卸载依赖:npm uninstall 依赖名
查看配置:npm config ls
修改配置:npm config set
修改镜像:npm install packageName --registry=url

小知识: 一般情况下,使用npm下载依赖是比较慢的(因为访问的是外网不稳定),所以我们可以使用国内的镜像去下载。下面演示cnpm下载过程

下载cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org
查看cnpm是否安装成功:cnpm --version

执行以上命令后,以后就可以使用cnpm下载依赖包了,这样会比npm下载速度快且稳定。

用npm下载的注意点

npm install jquery -g       //-g表示全局安装

npm install jquery --save 或 npm install jquery -S  //--save 和 -S 表示生产环境安装,项目完成后直接打包,依赖也会被打包进去

npm install jquery --save-dev 或是 npm install jquery -D   //表示在开发环境中安装,项目上线以后不会带有依赖

小知识:在package.json文件中的一些配置中,键为“dependencies”中表示的是开发环境中的依赖,而“devDependencies”中的依赖包则是生产环境下的依赖。

Node中有一个热部署管理模块——nodemon

下载热部署模块:npm install -g nodemon

        在 package.json文件中,将键为“scripts”中将运行命令中的‘start’冒号后面的node改为 nodemon,之后就可以使用nodemon运行文件了,他可以自动加载启动服务器实现热加载。

二、Node中的模块化

        模块化就是指将一些可复用的代码编写在一个文件中方便以后调用。

        在Node中编写模块化代码和调用代码的方式

function strParse(str){
    console.log(str);
}

module.exports = strParse            //暴露模块
//引入自定义的模块
var strParse = require('模块所在文件的相对路径')

strParse('Hello !')   //调用文件

        Node中的三大模块

        全局模块: 在项目中可随时随地访问,不需要引入

        核心模块:是系统模块,不需要单独下载,就可以直接使用require()引入的模块。常见的核心模块有path模块、fs模块、http模块。

        自定义模块:自己封装的模块,这个模块可以是js代码,亦可以是json文件,可直接使用require进行引入。

核心模块之path模块

        path模块分为: 路径相关、文件相关、路径解析。

        路径相关:

                normalize:规范化path

                join:将给定的path片段连接在一起

                resolve:解析为绝对路径

                isAbsolute:检查当前path是否为绝对路径,返回布尔值。

        文件相关:

               basename:返回路径中最后一部分文件名。

                extname:返回文件名的扩展名

                dirname:返回path路径中的文件名。

        路径解析:

                parse:返回一个对象其属性表示path的有效元素

                format:把对象转化为一个路径字符串

        核心模块之fs模块

                fs同步读取与异步读取

var fs = require('fs');

//  readFileSync 表示同步读取文件    返回的结果是二进制数据需要进行转化
var data = fs.readFileSync('对应文件的相对路径');
console.log(data.toString());           //toString()方法可以将而将二进制数据转化为对应字符串


//异步读取文件
fs.readFile('./abc.txt',(err,data) => {
    if(err){
        return console.log(err);    //结束程序,并在控制台上输出错误
    }
    console.log(data.toString());    //打印输出读取结果
})

        fs同步写入与异步写入

var fs = require('fs');

//  writeFileSync 表示同步写入文件  
var data = fs.writeFileSync('对应文件的相对路径','writeFileSync要写入的内容');


//异步写入文件
fs.writeFile('./文件名','writeFile要写入的内容',(err) => {
    if(err){
        return console.log(err);    //结束程序,并在控制台上输出错误
    }
    console.log('写入成功!');    //写入成功,执行回调,在控制台显示 ‘写入成功’
})

        核心模块之buffer模块

        buffer模块的特点:

                buffer使用来处理二进制数据流

                buffer实例类似数组,大小固定

                buffer是使用C++代码在V8堆外分配的物理内存

                buffer是一个全局变量(即:不需要使用require来引入buffer)

创建buffer对象的几种方式:

//创建buffer的几种方式
let buf1 = Buffer.alloc(10)     //表明创建一个10位的buffer对象,值为0


let buf2 = Buffer.alloc(5,1)    //创建一个5位的buffer对象,值为1

let buf3 = Buffer.allocUnsafe(5)    //表示创建一个不安全的5位buffer对象,其值是一个随机数

let buf4 = Buffer.from('hello')    //将字符串转换为buffer,默认是以utf-8的字符进行编码

 Buffer的方法:

        Buffer.byteLength()             返回传入的值的位数。

let length = Buffer.byteLength('hello')
console.log(length)        //返回的值为: 5

        Buffer.isBuffer()        判断是不是buffer对象

// 创建两个对象
let a = {}
let buf = Buffer.from('hello')

console.log(Buffer.isBuffer(a))        //返回的结果:false
console.log(Buffer.isBuffer(buf))        //返回的结果:true

         Buffer.concat()        将buffer对象以数组的形式传入,就可以将buffer对象连接在一起

let b1 = Buffer.from('this')
let b2 = Buffer.from('is')
let b3 = Buffer.from('buffer') 

console.log(Buffer.concat([b1,b2,b3]))    //结果是一个 buffer类型的十六进制
console.log(Buffer.concat([b1,b2,b3]).toString())    //将结果转换为 thisisbuffer

        核心模块之events模块(事件触发器)

                1、不带参数的绑定事件

//引入 events
const EventEmitter = require('events')

//写一个类继承EventEmitter
class CustomEvent extends EventEmitter{}

// 创建实例
const ce = new CustomEvent()

// 绑定方法
ce.on('test', () => {
    console.log('This is test');
})

// 每隔1s中触发一次test方法
setInterval(() => {
    ce.emit('test');
},1000)

                2、可以传参的事件

//引入 events
const EventEmitter = require('events')

//写一个类继承EventEmitter
class CustomEvent extends EventEmitter{}

// 创建实例
const ce = new CustomEvent()

// 绑定一个传入 (错误信息) 的方法
ce.on('test', err => {
    console.log(err);
})

// 每隔1s中触发一次test方法
ce.emit('test',new Error('This is error'));

                3、一定条件下,移除事件

//引入 events
const EventEmitter = require('events')

//写一个类继承EventEmitter
class CustomEvent extends EventEmitter{}

// 创建实例
const ce = new CustomEvent()

function fn1(){
    console.log('fn1');
}

function fn2(){
    console.log('fn2');
}
ce.on('test',fn1)
ce.on('test',fn2)

// 每隔1s中触发一次test方法
setInterval(() => {
    ce.emit('test',new Error('This is error'));
},500)


setInterval(() => {
    //ce.removeListener('test',fn1)//过1500毫秒移除事件函数fn1
    ce.removeAllListener('test')//过1500毫秒移除全部事件函数
},1500)

        核心模块之http模块

                http模块让Node.js具备了服务器的能力。

const http = require('http');

// 创建服务器对象
var app = http.createServer(function (req, resp) {
    // 将要响应给客户端的内容(resp.write()中只能写英文,中文会有乱码问题)
    resp.write('hello world')
    // resp.end()必须要有,不然resp的内容不会在客户端显示
    resp.end()
})

// 服务器的监听
app.listen(3000,function(){
    console.log('服务器启动成功!')
})

        运行Server.js文件:到该文件所在的路径下,打开DOS,输入 node Server.js,回车

         DOS中会有一个光标一直闪烁,等待客户端的请求。

        使用fs读取一个html文件,然后使用resp.write()写入

        Server.js文件

const http = require('http');
const fs = require('fs');

// 创建服务器对象
var app = http.createServer(function (req, resp) {
    let content = fs.readFileSync('./index.html');
    resp.write(content.toString())
    resp.end()
})

// 服务器的监听
app.listen(3000,function(){
    console.log('服务器启动成功!')
})

 被读取的index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        h1{
            font-family: '宋体';
            color: royalblue;
        }
    </style>
</head>
<body>
    <h1>Hello World ! ! !</h1>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlackStar-Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值