什么是Nodejs
Node.js(中文网链接 官网链接)是一个基于 Chrome V8 引擎的 JavaScript 运行环境。可以使javascript在服务器环境中运行。
怎么使用
在你官网下载Node.js安装程序,进行安装,在 cmd环境 中输入node命令,即可进入node环境,可以输入javascript代码运行。
从上面可以看到node的版本号,由此说明进入node环境,接下来输入代码试一下
由此看出,js代码可以再ndoe环境中运行,那么仅仅在cmd中运行是不够的,那么我们可以创建一个js文件,在node中运行改文件
由此可见,也可以运行文件,大家也可以在vscode的终端中运行,此处不再演示。以上只是node环境的搭建接下来,主要讲解相关模块,node也依赖这些模块进行工作。
通过 node.js 编写 http 服务程序
首先介绍一下http模块,http模块主要是用来搭建服务器的,可以接收请求,并做出响应,一下为具体示例。
步骤
- 加载 http 模块
- 创建 http 服务
- 监听用户的请求事件(request事件)
- 启动服务
// 加载 http 模块
var http = require('http');
// 创建 http 服务
var server = http.createServer();
// 监听用户请求事件
// request 对象包含了用户请求报文中的所有内容,通过 request 对象可以获取所有用户提交过来的数据
// response 对象用来向用户响应一些数据,当服务器要向客户端响应数据的时候必须使用 response 对象
server.on('request',function(request,response){
// 解决乱码的思路,服务器通过设置http 响应报文头,告诉浏览器使用相应的编码来解析网页
response.setHeader('Content-type','text/html; charset=utf-8');
response.write('hello world');
// 对于每一个请求,服务器必须结束响应,否则客户端(浏览器)会一直等待服务器响应结束
response.end();
});
// 启动服务
server.listen(8080,function(){
console.log('服务器启动了,请访问http://localhost:8080');
});
根据不同请求响应不同内容
以下只是简单的get请求,如果是带参数的请求需要用到其他模块。
// 加载 http 模块
var http = require('http');
// 创建 http 服务
http.createServer(function(request,response){
response.setHeader('Content-type','text/html; charset=utf-8');
response.write('hello world');
// 通过 request.url 获取用户请求路径,根据不同路径服务器做出不同响应
if(request.url === '/' || request.url === '/index'){
response.end(' hello index');
}else if(request.url === '/login'){
response.end(' hello login');
}else if(request.url === '/list'){
response.end(' hello list');
}else{
response.end(' 404,Not Found 客户端错误!');
}
}).listen(8080,function(){
console.log('服务器启动了,请访问http://localhost:8080');
});
当我们请求localhost:8080时输出如下内容
根据不同请求做出不同响应(响应现有的 HTML 文件)
接下来介绍path模块,path模块主要对路径进行处理,fs模块主要对文件进行读写操作。
// 加载 http 模块
var http = require('http');
// 加载 fs 模块
var fs = require('fs');
// 加载 path 模块
var path = require('path');
// 创建 http 服务
http.createServer(function(request,response){
response.setHeader('Content-type', 'text/html; charset=utf-8');
response.write('hello world');
// 通过 request.url 获取用户请求路径,根据不同路径服务器做出不同响应
if(request.url === '/' || request.url === '/index'){
fs.readFile(path.join(__dirname,'htmls','index.html'),function(err,data){
if(err){
throw(err);
}
response.end(data);
});
}else if(request.url === '/login'){
fs.readFile(path.join(__dirname,'htmls','login.html'),function(err,data){
if(err){
throw(err);
}
response.end(data);
});
}else if(request.url === '/list'){
fs.readFile(path.join(__dirname,'htmls','list.html'),function(err,data){
if(err){
throw(err);
}
response.end(data);
});
}else{
fs.readFile(path.join(__dirname,'htmls','404.html'),function(err,data){
if(err){
throw(err);
}
response.end(data);
});
}
}).listen(8080,function(){
console.log('服务器启动了,请访问http://localhost:8080');
});
当我们在地址栏中输入http://localhost:8080时输出以下内容,此时输出的是index.html的内容,我们通过fs模块读取文件内容再通过响应返回,因此在页面上展示出来,如果我们不加请求头那么输出的内容将是纯字符串,浏览器不会对其进行html解析
在地址栏中的请求URL就是一个标识,我们可以根据标识来判断服务器需要采取的响应。
接下来,我们了解一下node.js中的模块分类
模块分类
核心模块Core、Module、内置模块、原生模块
所有内置模块在安装 node.js 的时候就已经编译成二进制文件,可以直接加载运行部分内置模块,在 node.exe 这个程序启动的时候就已经默认加载了,所以可以直接使用,之前我们使用的就是内置模块。
内置模块
- fs
- http
- path
- url
- ……
按文件后缀来分
如果加载时没有指定后缀名,那么按照如下顺序依次加载相应模块
- js
- .json
- .node(C++编写的模块)
- ……
自定义模块(第三方模块)
- mime
- cheerio
- moment
- mongo
- ……
require 模块查找规则
情况一,如果require()的参数是一个路径
如果有js槲坠直接找这个文件如果没有后缀,先查找后缀为js的文件,如果没有再找后缀为json的文件,如果没有再后缀为node的文件,如果没有认为传入的是模块名,再找是否有传入的文件夹,如果有再按照js文件、json、node的顺序找文件
情况二,require() 的参数不是一个路径,直接是一个模块名称,先检测模块是否是核心模块,如果是直接加载该模块;如果不是,当做第三方模块加载,先在当前js文件所在目录下查找 node_modules 文件夹,如果有进入此文件夹查找模块;如果没有会去父目录中是否有 node_modules 如果没有会一层一层的向上找直到根目录为止。
require 加载模块注意点
- 所有模块加载第一次后,都会有缓存,二次加载直接读取缓存
- 每次加载模块时会优先从缓存中加载
- 核心模块在 Node.js 源码编译的时候,都已编译为二进制执行文件,所以加载速度较快
- 核心模块都保存在 lib 目录下
- 试图加载一个和核心模块同名的自定义模块是不会成功的
- 自定义模块要么不要与核心模块同名
- 要么使用路径的方式加载
- 核心模块只能通过模块名来加载
- require()加载模块使用 ./相对路径时,相对路径是相对当前模块,不受执行 node 命令的路径影响
- 建议加载文件模块的时候事中添加文件后缀名,不要省略
commonjs规范
- commonjs 规范
- 模块的定义
- commonjs 是为 JavaScript 语言制定的一种 模块规范、编程 API 规范