Node.js
什么是Node.js
Node.js是一个基于Chrome V8引擎的js运行环境
官方地址:https://nodejs.org/en/
Node.js中的javaScript 运行环境
注意:
- 浏览器是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);})
向指定文件写入内容
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);})
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服务器
- 导入模块
- 创建服务器
- 接收请求与响应请求
//导入模块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/');
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/");
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/");
根据不同的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对象,存储了和当前模块有关的信息
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);
exports对象
默认情况下,exports和module.exports指向同一个对象,最终共享的结果,还是以module.exports指向的对象为准。
模块化规范
Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块间如何相互依赖。
CommonJS规定
- 每个模块内部,module变量代表当前模块
- module变量是一个对象,它的exports属性是对外的接口
- 加载某个模块,其实是加载该模块的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镜像服务器
切换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扩展名进行加载
- 加载失败