Node.js的基本使用 初识Node

2022-08-06 12:26:48

Node.js

什么是Node.js

Node.js是一个基于Chrome V8引擎的js运行环境

官方地址:https://nodejs.org/en/

Node.js中的javaScript 运行环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L2petPvQ-1658115950089)(https://raw.githubusercontent.com/Koiiiilin/MyImage/main/image-20220714121854454.png)]

注意:

  • 浏览器是js的前端运行环境
  • Node.js是js的后端运行环境
  • Node.js中无法调用DOM和BOM等浏览器内置API

创建第一个应用

fs文件系统模块

什么是fs文件系统模块

fs模块是Node.js官方提供的,用来操作文件的模块,提供了一系列的方法和属性,用来满足用户对文件的操作需求

引入fs模块:使用require指令来载入fs模块

const fs=require('fs')

异步和同步

fs模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

参考文档:https://www.runoob.com/nodejs/nodejs-fs.html

读取指定文件的内容

fs.readFile(path[, options], callback) 异步读取文件内容

fs.readFileSync(path[, options]) 同步读取文件内容

// 引入fs模块const fs=require("fs")// 回调函数中,err表示失败返回的结果,data表示成功时的结果
fs.readFile("../demo.txt","utf-8",function(err,data){if(err){
        console.log(err);}
    console.log(data);})

image-20220714121913736

向指定文件写入内容

fs.writeFile(filename, data[, options], callback)

fs.writeFileSync(filename, data[, options])

// 引入fs模块const fs=require("fs")// 回调函数中,err表示失败返回的结果
fs.writeFile("../demo1.txt","hello writeFile",function(err){
        console.log(err);})

image-20220714131818758

path路径模块

path 模块用来处理路径,提供一系列方法如:path.join()->拼接,path.basename()->解析

//拼接路径
fs.readFile(path.join(__dirname,'../demo1.txt'),"utf-8",function(err,data){if(err){return console.log("读取失败")}
    console.log("读取成功",data);})//获取扩展名const ext= path.extname("../demo1.txt")
console.log(ext);//获取文件名const basename= path.basename("../demo1.txt",".txt")
console.log(basename);

http模块

用来创建web服务器的模块,通过http.createServer()方法,创建web服务器。

创建最基本的web服务器

  1. 导入模块
  2. 创建服务器
  3. 接收请求与响应请求
//导入模块var http=require('http');

http.createServer(function(request, response){// 发送 HTTP 头部// HTTP 状态值: 200 : OK// 内容类型: text/plain
    response.writeHead(200,{'Content-Type':'text/plain'});// 发送响应数据 "hello,world"
    response.end('hello,world\n');}).listen(8888);// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmTcK8Fq-1658115950091)(https://raw.githubusercontent.com/Koiiiilin/MyImage/main/image-20220714140242088.png)]

requset请求对象

只要在服务器接收到了客户端的请求,就会调用server.on()为服务器绑定的request事件处理函数。

其中requst.url是客户端球球的URL地址,request.method是客户端的请求方法,如:在浏览器中输入localhost:8888/index.html,在控制台中请求的地址和方法将会被打印

const http=require("http")

http.createServer(function(req,resp){
    console.log(`请求的地址是${req.url},请求的方法是${req.method}`);}).listen(8888)
console.log("Server running at http://127.0.0.1:8888/");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIYb9A5I-1658115950092)(https://raw.githubusercontent.com/Koiiiilin/MyImage/main/image-20220714142512410.png)]

response响应对象

响应对象中包含了与服务器相关的数据和属性,通过使用res.end()方法向客户端发送指定的内容并结束请求的处理过程。在第一个应用示例中演示了响应内容为英文字符时,可以成功响应,但是如果end中的内容为中文时,会出现中文乱码的情况,如下图所示:

在这里插入图片描述

为了解决这个错误,需要对响应对象设置响应头Content-Type并设置编码格式

const http=require("http")

http.createServer(function(req,resp){
    console.log(`请求的地址是${req.url},请求的方法是${req.method}`);
    resp.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'})
    resp.end("请求成功了,返回给客户端的内容")// resp.end("hello,world")}).listen(8888)
console.log("Server running at http://127.0.0.1:8888/");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5fWh2f1X-1658115950093)(https://raw.githubusercontent.com/Koiiiilin/MyImage/main/image-20220714143638210.png)]

根据不同的url响应不同的html

const http=require("http")

http.createServer(function(req,resp){let url= req.url//获取请求的url地址let content="<h1>404 NOT FOUND</h1>"if(url=='/'|| url=='/index.html'){
        content="<h1>首页</h1>"}elseif(url=='/about.html'){
        content="<h1>关于</h1>"}
    resp.setHeader('Content-Type','text/plain;charset=utf-8')
    resp.end(content)}).listen(8888)
console.log("Server running at http://127.0.0.1:8888/");

模块化

分类

Node.js中根据模块来源的不同,将模块分成3大类:

  • 内置模块
  • 自定义模块
  • 第三方模块

加载模块

// 加载内置模块const fs=require("fs")// 加载自定义模块const myhttp=require("../02.http模块/demo.js")// 加载第三方模块:需要下载const moment=require("moment")

使用require方法加载其他模块时,会执行被加载模块中包含的代码。

模块作用域

模块作用域与函数作用域类似,在自定义模块中定义的成员都是私有成员,只能在模块中被访问,这样能够防止全局变量污染问题。

向外共享模块作用域中的成员

module对象

每个js文件中都有一个module对象,存储了和当前模块有关的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kj4x7jpj-1658115950094)(https://raw.githubusercontent.com/Koiiiilin/MyImage/main/image-20220714150834843.png)]

module.exports对象

在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。

外界使用require方法导入自定义模块时,得到是exports所指向的对象。

// 自定义模块中的内容const username="自定义模块"functionsayHello(){
    console.log("hello",username);}
module.exports.username= username
module.exports.sayHello= sayHello// 使用自定义模块const myModule=require("./export_demo")
myModule.sayHello()
console.log(myModule.username);

image-20220714152240471

exports对象

默认情况下,exports和module.exports指向同一个对象,最终共享的结果,还是以module.exports指向的对象为准。

模块化规范

Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块间如何相互依赖。

CommonJS规定
  1. 每个模块内部,module变量代表当前模块
  2. module变量是一个对象,它的exports属性是对外的接口
  3. 加载某个模块,其实是加载该模块的module.exports属性,require()方法用于加载模块

NPM

快速创建package.json

npm包管理工具提供了一个快捷命令,可以在执行命令所在的目录中,快速创建package.json

// 作用:在执行命令所在的目录中,快速新增package.json文件
npm init-y

注意:

  • 上述命令只能在英文的目录下成功运行,不能出现中文和空格
  • 运行npm install 命令安装包的时候,npm 包管理工具会自动把包名称和版本号,记录到package,json

一次性安装所有的包

可以运行npm install命令一次性安装所有的依赖包

卸载包

可以运行npm uninstall命令卸载指定包

npm install 命令执行成功后,会把卸载的包自动从package.json的dependencies中移除

devDependencies节点

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。使用npm i 包名 -D或者npm install 包名 --save-dev

解决下包慢的问题

使用淘宝npm镜像服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ho9YKIOc-1658115950096)(C:\Users\lyy\AppData\Roaming\Typora\typora-user-images\image-20220718095220739.png)]

切换npm 的下载镜像源

// 查看当前的下包镜像源
npm config get registry
//将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/

nrm

为了更方便的切换下包的镜像源,可以安装nrm这个小工具,利用nrm提供的终端命令可以快速查看和切换下包的镜像源。

// 将nrm 安装为全局可用的工具
npm i nrm -g
// 查看所有可用的镜像源
nrm ls
//将下包的镜像源切换为淘宝的镜像
nrm use taobao

i5ting_toc

可以把md文档转为html页面的小工具

// 将i5ting_toc安装为全局包
npm install -g i5ting_toc
// 调用i5ting_toc轻松实现md转html的功能
i5ting_toc -f 要转换的md文件路径 -o

自定义模块的加载机制

使用require()加载自定义模块时,必须指定以./或者…/开头的路径标识符,在加载自定义模块时,如果没有指定./或者…/会被当做内置模块或者第三方模块进行加载。

同时,在使用require()导入自定义模块时,如果省略了文件的扩展名,则Node.js会按顺序分别尝试加载以下的文件:

  • 按照确切的文件名进行加载
  • 补全.js扩展名进行加载
  • 补全.json扩展名进行加载
  • 补全.node扩展名进行加载
  • 加载失败
  • 作者:啾比特
  • 原文链接:https://blog.csdn.net/qq_46258819/article/details/125845668
    更新时间:2022-08-06 12:26:48