01-nodejs入门
1.1-框架前置课
==圈重点== : vue框架能够正常开发的前提是你的电脑必须要安装node环境
-
1.nodejs作为vue框架之前的一个课程,在学习vue的过程中,需要使用nodejs相关的一些知识点。
-
2.学习nodejs有助于为后续框架课程打下良好的基础
1.2-什么是nodejs
-
1.Node.js官网地址:Node.js
-
1.Node.js 是一个构建于 Chrome V8引擎之上的一个Javascript 运行环境
-
Node
是
一个运行环境
,作用是让js拥有开发服务端的功能
-
-
2.nodejs的作用 : 使用js语言开发服务器
-
说人话: 做后台的,抢java和python饭碗
-
1.3-Node.js环境安装
-
如果电脑不支持最新版本,这个网站可以找到所有nodejs版本: Previous Releases | Node.js
如何确认当前电脑是否已经安装了Node环境
-
打开终端,输入
node -v
,如果能看到版本号则说明当前电脑已经安装Node环境,如果提示Node不是内部或外部命令
,则表示未安装-
一旦安装了node,则会自动一并安装
npm
-
==1.4-如何运行Node.js程序==
1.5-服务端js与客户端js区别
-
1.客户端JS由三部分组成
-
ECMAScript:确定js的语法规范
-
DOM:js操作网页内容
-
BOM:js操作浏览器窗口
-
-
2.服务端JS只有ECMAScript
-
因为服务端是没有界面的
-
==在nodejs中使用dom与bom的api程序会报错==
-
-
1.6-nodejs模块化介绍
-
课外了解文档:ES6 入门教程
-
1.什么叫模块化?(模块 === js文件)
-
模块化就是把一个大的文件拆分成很多个小文件,用特定的语法将各个文件(模块)组合到一起
-
一个js文件
可以引入另一个文件
, 这种开发方式就叫做模块化开发
-
-
2.模块化开发好处?
-
(1)将功能分离出来
-
一个js文件只负责处理一个功能,这样做的好处是业务逻辑清晰,便于维护
-
-
(2)按需导入
-
用到哪一个功能,就导入哪一个js文件。模块化开发是
渐进式框架
的共同特征。
-
-
(3)避免变量污染
-
一个js文件(模块),都是一个独立的作用域。 互不干扰,不用考虑变量名冲突问题。
-
-
1.nodejs是一个渐进式框架, 我们后面要学习的vue框架也是渐进式框架
2.什么是渐进式框架呢 : 一个功能对应一个模块(js文件), 需要用的时候导入即可
说人话:
非渐进式框架 : 套餐, 一次性导入所有的功能。 无论是的项目用还是不用(浪费资源)
渐进式框架 : 自助餐。 吃什么用什么,不浪费。(节省资源)
1.7-Common模块化语法规范
-
任何一个语法,都需要遵循一定的规范。不同的平台需要遵循的规范不同。一般情况下,模块化语法规范主要有三种。
-
CommonJS 规范:nodejs 默认支持的
-
ES6规范:前端的ES6语法支持的规范
-
文档:ES6 入门教程
-
-
CMD 和 AMD 模块化规范 : ES6语法之前的模块化语法规范,现在已经几乎不用了
-
CommonJS规范只有两句话
-
1.模块必须要使用
require()
导入 -
2.模块必须要使用
module.exports
导出-
这两个语法都是nodejs环境自带的全局语法
-
-
02-fs模块
1.1-readFile读取文件
//1.导入文件模块
const fs = require('fs')
//2.读取文件
/**
* 第一个参数:文件路径
* 第二个参数:编码格式 (可选参数,默认为buffer二进制)
* 第三个参数:读取回调操作(异步操作)
* err:如果读取成功,err为null, 否则读取失败(一般文件路径错误或者找不到文件)
* data:读取到的数据
*/
fs.readFile('./data/aaa.txt','utf-8',(err,data)=>{
if(err){
console.log(err)
//抛出异常,throw的作用就是让node程序终止运行,方便调试
throw err
}else{
console.log(data)
}
})
console.log('11111')
//3.同步读取文件(了解即可,几乎不用,一般在异步的api后面加上Sync就是同步)
let data = fs.readFileSync('./data/aaa.txt','utf-8')
console.log(data)
console.log('2222')
1.2-writeFile写入文件
//1.导入文件模块
const fs = require('fs')
//2.写文件
/**
* 第一个参数:文件路径
* 第二个参数:要写入的数据
* 第三个参数:文件编码 默认utf-8
* 第四个参数: 异步回调函数
* err: 如果成功,err为null.否则读取失败
*/
fs.writeFile('./data/bbb.txt','黑马程序员','utf-8',(err)=>{
if(err){
throw err
}else{
console.log('写入成功')
}
})
03-path路径模块
语法 | 作用 |
---|---|
path.==extname==(path) | 返回路径中文件的扩展名(包含.) |
path.==join==([...paths]) | 拼接路径(相对路径) |
path.resolve([...paths]) | 拼接路径(绝对路径) |
__dirname | 获取当前文件所在的文件夹绝对路径 |
//1.导入path模块
const path = require('path')
//2.使用模块
// (1) 获取一个文件的拓展名
/* 不关心此路径文件在不在, 就是处理这个字符串。 获取.后面的部分可以知道这个文件格式 */
console.log(path.extname('./data/student.json'));
console.log(path.extname('./data/student.js'));
console.log(path.extname('./data/111.png'));
console.log(path.extname('./data/222.aaa'));
// (2) 拼接相对路径, 使用join方法
/* 把多个字符串按照路径的方式拼接起来 */
console.log(path.join('a', 'b', 'c'))
// (3) 拼接绝对路径
/* 默认从磁盘根目录开始拼接出完整的路径 */
console.log(path.resolve('a', 'b', 'c'))
/* (4)获取当前文件所在的绝对路径 */
console.log( __dirname )
04-http模块(搭建服务器)
1.1-http模块搭建服务器
//知识点回顾: 如何让你电脑成为服务器? 按照软件即可
//1.导入模块(安装软件)
const http = require('http')
//2.创建服务器(运行软件)
/* 参数:回调函数
req: request 客户端请求对象
res:response 服务端响应对象
*/
let server = http.createServer((req,res)=>{
//获取客户端请求路径
console.log(req.url)
})
//3.启动服务器(开启软件的服务器功能)
/*第一个参数:端口号 一般1000-60000之间
第二个参数:ip地址 默认不写 就是本地ip
第三个参数:成功回调
*/
server.listen(3000,()=>{
console.log('服务器开启成功')
})
1.2-根据不同请求响应不同数据
默认情况下,浏览器会自动根据文件后缀名进行识别。但是有的文件并不一定可以正确识别,所以一般情况下需要给文件设置对应的响应头。Content-Type类型 (MIME媒体类型)
html文件:
text/html
css文件:
text/css
js文件:
text/javascript
gif文件:
image/gif
svg文件:
image/svg+xml
jpeg文件:
image/jpeg
png文件:
image/png
icon文件:
image/x-icon
设置响应头语法如下:
res.setHeader('Content-Type', ‘text/html; charset=utf-8');
//1.导入模块
const http = require('http');
//2.创建服务器
let server = http.createServer((req,res)=>{
console.log(req.url)
//需求: 如果请求路径是/ ,响应 index 如果请求路径是/login,响应 登录页
if(req.url == '/'){
res.end('index.html')
}else if(req.url == '/login'){
//设置响应头解决中文乱码问题: 响应头作用:告诉浏览器我返回给你的数据是什么类型
/*第一个参数:状态码
第二个:响应头
*/
res.writeHead(200,{
'Content-Type': 'text/plain;charset=utf-8'// text/plain 普通文本
})
res.end('登录页')
}else{
res.end('404 not found')
}
})
//3.开启服务器
server.listen(3000,()=>{
console.log('服务器开启成功')
})
1.3-http响应客户端HTML文件
//1.导入模块
const http = require('http')
//文件模块
const fs = require('fs')
//路径模块
const path = require('path')
//2.创建服务器
let server = http.createServer((req,res)=>{
//需求: 如果请求路径是 / 返回首页html 如果是login返回登录html
//1.获取客户端请求路径
let url = req.url
//2.处理请求
//一般如果响应的是文件,不需要设置响应头,直接返回二进制数据。浏览器会自动识别数据类型并且加载
if(url == '/'){
//响应首页
fs.readFile(path.join(__dirname,'index.html'),(err,data)=>{
if(err){
throw err
}else{
console.log(data)
//3,将读取好的文件数据响应给客户端
res.end(data)
}
})
}else if(url == '/login'){
//响应登录页
fs.readFile(path.join(__dirname,'login.html'),(err,data)=>{
if(err){
throw err
}else{
//3,将读取好的文件数据响应给客户端
res.end(data)
}
})
}else{
res.end('404 not found')
}
})
//3.开启服务器
server.listen(3000,()=>{
console.log('服务器开启成功')
})
05-综合案例:天天果园
/*
WEB特点01 : html中所有的外部资源(src href)都会变成网络请求
* 要想HTML页面可以加载静态资源(css、图片、音视频),服务器就需要响应这些文件
WEB特点02 : 静态资源网络请求url 一般与 文件路径 一致, 一般会自动拼接文件路径响应返回
* 静态资源服务器 : 自动响应返回页面每一个静态资源请求
*/
//1.导入http模块
const http = require('http')
const fs = require('fs')
const path = require('path')
//2.创建服务器
const app = http.createServer((req,res)=>{
//(1)请求 : req
console.log( req.url )
//(2)处理
if( req.url == '/' ){
//响应 首页
fs.readFile( path.join(__dirname,'www','index.html') , (err,data)=>{
if(err){
throw err
}else{
res.end(data)
}
})
}else{
//根据请求的url拼接读取对应文件的路径并返回
fs.readFile( path.join(__dirname,'www',decodeURI(req.url)) , (err,data)=>{
if(err){
throw err
}else{
res.end(data)
}
} )
}
})
//3.开启服务器
app.listen(3000,()=>{
console.log('服务器开启成功')
})