依赖的区别
以下基于node.js 10.16.0版本
项目依赖
在项目的开发和线上运营阶段,都需要依赖的第三方包。使用npm install 下载的文件会默认添加到pageage.json文件的dependencies字段当中。
开发依赖
项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖。 使用npm install包名--save-dev命令将包添加到package.json文件的devDependencies字段中
在初始化项目的时候,使用npm install --production只会安装项目依赖而不会下载开发依赖
pageage-lock.json文件的作用
- 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
- 加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只 需下载即可,不需要做额外的工作
Node.js中的模块的加载机制
require('./find.js')
require('./find')
- require方法根据模块路径查找模块,如果是完整路径,直接引入模块。
- 如果模块后缀省略,先找同名JS文件再找同名JS文件夹。
- 如果找到了同名文件夹,找文件夹中的index.js。
- 如果文件夹中没有index.js就会去当前文件夹中的package.js文件中查找main选项中的入口文件。
- 如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到。
模块查找规则-当模块没有路径且没有后缀的时候
require('fine');
- Node.js会假设它是系统模块
- Node.js会去node_modules文件夹中
- 首先看是否有该名字的JS文件
- 再看是否有该名字的文件夹
- 如果是文件夹看里面是否有index.js
- 如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件
- 否则找不到报错
服务器端基础知识
创建web服务器
const http = require('http');
const app = http.createServer();
//事件处理函数
app.on('request',(req,res) =>{
//防止中文乱码
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
//结束请求并响应数据
res.end('<h1>好几个</h1>');
});
//监听3000端口,向外界提供返回数据
app.listen(3000);
console.log("服务器已经启动,监听3000端口,请访问localhost:3000");
HTTP协议
响应报文
HTTP状态码
- 200请求成功
- 404请求的资源没有被找到
- 500服务器端错误
- 400客户端请求有语法错误
内容类型
- text/plain 纯文本
- text/html html文件
- text/css css文本
- application/javascript js文本
- image/jpeg 图片
- application/json json文本
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
HTTP响应和请求的处理
GET请求的参数
参数被放置在浏览器地址栏中,例如:http://localhost:3000/?name=zhangsan&age=20
const http = require('http');
const url = require('url');
const app = http.createServer();
//事件处理函数
app.on('request',(req,res) =>{
//防止中文乱码
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
//获取GET请求参数,第二个参数是要把字符串解析成对象,解构赋值
let {query,pathname} = url.parse(req.url,true);
console.log(query.name,query.age);
if (pathname === '/index'){
res.end('欢迎来到首页!!')
}else if (pathname === '/list'){
res.end('欢迎来到list页面!!')
}else{
res.end('404');
}
//结束请求并响应数据
res.end('<h1>好几个</h1>');
});
//监听3000端口,向外界提供返回数据
app.listen(3000);
console.log("服务器已经启动,监听3000端口,请访问localhost:3000");
POST请求的参数
- 参数被放置在请求体中进行传输
- 获取POST参数需要使用data事件和end事件
- 使用querystring系统模块将参数转换为对象格式
const http = require('http');
const app = http.createServer();
//处理请求参数
const querystring = require('querystring');
//事件处理函数
app.on('request', (req, res) => {
//防止中文乱码
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
//post请求的参数是通过事件接收的
// data:请求参数发送的时候触发data事件
let postParams = "";
req.on('data', (params) => {
postParams += params;
});
//发送完成的时候触发end事件
req.on('end', () => {
console.log(querystring.parse(postParams));
});
res.end("ok")
});
//监听3000端口,向外界提供返回数据
app.listen(3000);
console.log("服务器已经启动,监听3000端口,请访问localhost:3000");
资源
静态资源
服务器端不需要处理,可以直接响应给客户端的资源就是静态资源,例如CSS、JavaScript、image文件
访问静态资源
实例的目录结构

//使用mine插件分析当前请求资源的类型
const http = require('http');
const app = http.createServer();
const url = require('url');
const path = require('path');
const fs = require('fs');
const mime = require('mime');
//处理请求参数
const querystring = require('querystring');
//事件处理函数
app.on('request', (req, res) => {
//获取请求路径
let pathname = url.parse(req.url).pathname;
pathname = (pathname === '/' ? '/default.html' : pathname);
let Type = mime.getType(pathname);
console.log(Type);
let filePath = path.join(__dirname, 'public' + pathname);
fs.readFile(filePath, (err, data) => {
if (err != null) {
//防止中文乱码
res.writeHead(200, {
"Content-Type": "text/html;charset=utf-8"
});
res.end('404');
return;
}
//指定返回资源的类型,防止低版本的浏览器出现显示问题
res.writeHead(200,{
'contentType':Type
});
res.end(data);
})
});
//监听3000端口,向外界提供返回数据
app.listen(3000);
console.log("服务器已经启动,监听3000端口,请访问localhost:3000");
动态资源
相同的请求地址根据不同的参数响应不同的资源