第五周Node.js

141 阅读11分钟

前言

学习原因:

1、前端的招聘要求 - 熟悉 或 了解一门服务器端语言者优先

2、对于我们前端来说,了解了服务器端的机制,更好更快的进行前端开发,防止背锅

扩展:

全栈工程师:客户端(PC+移动端+小程序) + 服务器端(Node.js) + 数据库(mongoDB)

技术类发展:

全栈 - 涉及多个领域,每个领域都会用,但是不必精通 -> 架构师 -> 项目经理 -> 技术总监

专家 - 某个领域是无敌,你不光可以使用,你还会创建

销售类发展

产品 -> 产品经理 -> 产品总监:必须要懂技术的,要懂开发/项目流程,出去和客户谈业务,每一个功能都是钱

教育类

创业类

可能成为全栈的语言:

1、Java - 不包含移动端开发(能做安卓,不能做IOS)

2、JavaScript语言:

客户端 - 开发根本

服务器端 - Node.js 历史上第一次一门语言可以通吃前后端,前端崛起的原因之一

数据库 - mongoDB

移动端 - 网页、app、小程序 - 跨平台开发,只需要一个前端,学一点点Andriod和IOS的语法,就可以搞定了,前端崛起的原因之一

现在流行混合开发框架:uniapp/h5+plus/jQuery Mobile... 一个前端就可以搞定所有移动端了

server:对服务器端的掌握 - 入门,以后你自学也没问题

还得搭配上ajax,完成最终目标:全栈开发:登录、注册、图书/金夫人/咖啡管理系统(后台)

服务器基本内容

服务器概念:

简单来说就是一台电脑

生活:微机

商业/国家中:小型机(造价几十万,好点的IBM的上百万)、中型机、大型机、超级计算机(天河一号、天河二号、神威太湖之光)

拥有服务器的方式:

0、买小型机 - 对小公司遭不住

1、买一台配置好一点的微机

2、租云服务器 - 腾讯云、阿里云、百度云、新浪云... - 配置自选,价格友好,按年收费...

对于我们开发人员来说:

····硬件服务器 - 电脑

····软件服务器 - 中间件(软件可以将你的电脑变成一台服务器,其他人都可以来访问)

软件架构:服务器端很重要

·····C/S - Client客户端/Server服务器端

举例:

                          QQ
		    大型网络游戏
		优点:
		    运行稳定,用户体验感好,对带宽的要求低
		缺点:
		    占用硬盘空间
		    更新过于麻烦,服务器端 和  客户端都要更新

B/S - Browser浏览器端/Server服务器端

举例:

                        网页版QQ、微信
		    网页游戏
		优点:
		    几乎不占硬盘,不需要安装
		    更新只需要更新服务器端
		缺点:
		    体验感较差(越来越好)- 云游戏(以后的趋势,即不占硬盘,
                        也不需要你的电脑设备有多牛逼,全部交给云服务器计算),前端崛起的原因之一
		    现在5G时代的到来,对带宽的要求高

现在哪怕是单机游戏都是有服务器端

Node.js概述:

不是JS,但是语法和javascript非常相似,他的竞争对手java、c#、php、python.... 历史上第一次一门语言可以通吃前后端

做的功能绝对不是特效,做事的是服务器端的操作(形成了一个前端和数据库沟通交流的桥梁 - 数据交互)

目的:

1、使用代码搭建一个服务器&文件系统

2、Node.js如何和数据库进行交流沟通(mongoDB)

3、全栈一条龙开发,图书管理系统(HTML+CSS+JS+NODE.js + mongoDB)

node.js 安装

Node.js安装:node-v16.17.0-x64.msi - 一路往下点,哪里点不动了,就把哪里勾上,千万不要取消任何东西

版本:16年初(0.12) 16年中(4.xx) 16年底(6.xx)

更新速度快,意味着:发展迅速,其实也没加什么新东西,但是给你错觉,感觉一年要学好多次

检查自己安装成功没有:打开cmd,输入node -v 检查版本号,如果有版本号说明已经在你的电脑里安装成功了node.js

其实我们安装的这个node.js就是一个运行环境而已,不再需要浏览器自带的js解释器了,node.js的语法和javascript的语法非常相似

Node.js如何运行:

1、交互模式 - 临时测试

打开cmd输入,node回车,就可以开始敲你的"js"代码了

退出:ctrl+c

2、脚本/文件模式 - 正式开发中-丑了点

  • 创建xx.js:里面书写自己的代码

  • 打开cmd输入:node 文件绝对路径

3、现在我们的开发工具非常强大:有插件可以直接在开发工具中运行,前提就以上两个操作可用,意味着你的环境是安装好了的

  • HBuilder:安装一个插件:nodeeclipse,右键运行

  • VScode:安装一个插件:搜索一个run,代码处右键,第一个选项就是run

Node.js的知识:

js 和 node的区别

  • 相同点:都可以使用一切的ECMAScript的一切的API和语法都可以放心大胆的使用,服务器端根本不存在任何浏览器,所以ES5&ES6一切语法放心用

  • 不同点:1、javascript:DOM+BOM - 做一切特效 2、Node.js:虽然不支持DOM+BOM,但是他却提供了10万个以上+的模块等待我们学习

模块:每个.js文件,都可以称之为是一个模块

  • 模块化开发方式:如果以一个电商网站来说,我可以按功能分为很多模块:商家模块、商品模块、产品模块、促销模块、用户模块...

    分工合作,将每个模块交给对应的人完成,最后再由【主模块】进行引入

模块的公开和引入

1、每个模块都有一个操作,可以公开/暴露自己的成员:

                            exports.属性名=值
			
                            module.exports={
				....
			      }
			

2、每个模块都有一个操作,可用于引入其他模块:

    var xxx=require("./文件名"); - ./在引入时是不可以省略的,但是文件后缀可以省略

笔试题:exports 和 module.exports有什么区别?

                    都是用于公开暴露自己的成员的
		但是:exports={} 写法是错误的,为什么?
		node.js的底层有一句话:exports=module.exports;
		其实真正做公开功能的是module.exports
		如果你使用 exports={}; 覆盖了module.exports,不再具有公开功能

模块的分类:

1、官方模块 - 今/明天学习的重点,大概有20几个,重要的其实只有几个

2、第三方模块 - 多到数不清楚,提供了很多官方模块没有的东西,有一个网址npm可以去下载:mongo、express框架(简化)

3、自定义模块( Node.js最大的特点):

i 快、非常快 - 以前最快的是php,Node.js的速度是php的14倍,异步能够更大的发挥node.js的特点

ii 为什么快:

  • 因为官方模块提供的东西少,甚至连数据库操作都没有

  • 使用google浏览器的v8引擎


官方模块:

不需要下载,在你安装node.js环境的时候就已经安好了,但是某的模块需要引入,某的模块不用引入,就需要学习看文档

*Globals模块:

全局模块 - 全局变量在所有模块中均可使用。不需要引入,但是提供了一些全局变量给我们,我们可以直接使用

__dirname - 当前文件夹的绝对路径,对你们使用vscode的同学可能有用,node.js有的同学是使用不了相对路径的,只能写绝对路径

__filename - 当前文件的完整的绝对路径

exports - 一个空{},公开和暴露自己的成员

*module - 指代当前模块本身,包含了其他4个变量

*require() - 一个函数,引入其他模块的

定时器

控制台

*Querystring模块:查询字符串

		需要引入:let qs = require('querystring');
		提供了解析url的查询字符串部分的功能
		var  obj=qs.parse("查询字符串部分");
		想要获取前端传来的某一个部分:obj.键名;
		垃圾:只能解析查询字符串部分,如果前端传来的是一个完整的url网址,那他就解析不了

***Url模块:网址模块 - 今日小重点

需要引入:let url = require('url');

提供了一些实用函数,用于 完整的URL 解析

var objUrl=url.parse("完整的url网址",true);此方法会将url网址的各个部分全部解析出来,支持传入第二个参数,是一个布尔值,如果传入的是一个true,自动调用querystring的parse方法,顺便也解析了查询字符串(请求消息:前端->后端的东西)部分

真正的重点:

1、查询字符串:objUrl.query.键名 - 拿到前端传到后端的东西(?)

2、路由:objUrl.pathname; - 判断路由的不同,响应不同的网页给用户看(/)

Buffer模块:缓冲区,可以将数组变成一个16进制的数字

不需要我们去引入,可以直接使用

但是!我们绝对不会主动使用Buffer的任何操作,因为用了过后我们就不认识了,但是后面的一些API可能会导致我们得到的结果直接就是Buffer

但是,也别怕,Node.js大部分的API其实是支持buffer操作

理解为,Buffer是Node.js提供的一种新的数据类型

***fs模块:FileSystem - 文件系统

需要引入:let fs = require('fs');

提供了可以操作文件的API

***异步读取文件

页面显示的需要读取的文件都要用这个方法(img...)

		:
			fs.readFile("绝对路径|文件路径",(err,buf)=>{
				拿到buf要干嘛?就需要写在这里
			})

异步写入文件:- 将原来的东西,替换掉

			fs.writeFile("绝对路径|文件路径","写入的新内容",()=>{
				console.log("写入完毕了,以后要做什么")
			})

异步追加文件:- 保留原来的东西

			fs.appendFile("绝对路径|文件路径","写入的新内容",()=>{
				console.log("写入完毕了,以后要做什么")
			})

http模块 - 超级重点:使用代码搭建服务器

固定步骤:

   //引入http、url、fs官方模块
    var http=require("http");
    var url=require("url");
    var fs=require("fs");
    //创建服务器
    var app=http.createServer();
    //为服务器设置监听的端口号
    app.listen(80);//http默认端口为80,https默认端口为443
    //为服务器绑定请求事件 - 请求?前端发到后端的,
    app.on("request",(req,res)=>{
            //req - request:保存请求对象,请求对象,前端->后端,提供了一个属性req.url,解析此属性拿到自己需要的部分(路由|请求消息)
            var objUrl=url.parse(req.url,true);
            //得到前端传来路由部分
            var router=objUrl.pathname;
            //判断前端的路由是什么,给他返回不同的页面
            if(router=="/" || router=="/index.html"){
                    //res - response:保存响应对象,后端->前端,提供了一个方法res.end(你想要响应的东西)

自定义模块

                    fs.readFile("./public/index.html",(err,buf)=>{
                            res.end(buf);
                    })
            }else if(router.match(/html/)!=null){
                    console.log(router);
                    fs.readFile("./public"+router,(err,buf)=>{
                            res.end(buf);
                    })
            }else if(router.match(/css|js|jpg|png|gif|woff/)!=null){
                    fs.readFile("./public"+router,(err,buf)=>{
                            res.end(buf);
                    })
            }
    })

强调:

1、前端的一切action、href、src,所有引入路径的地方,全都被node.js当作了是一个路由请求,解析请求,读取对应的文件给用户看

2、自己想要访问自己,打开浏览器,可以使用127.0.0.1访问自己,访问别人(前提:防火墙关了没),需要别人把自己的ipv4地址给你,打开cmd,输入ipconfig

目前:完成了使用代码搭建服务器&文件系统

自定义模块:2大类

	为什么有的模块要引入时加上./,有的模块又不需要

1、文件模块:创建xx.js去公开需要公开的内容,主模块想要引入必须写为require("./文件名")

  • 自己写的模块 2、目录模块:3种

1、创建名为m1的文件夹,在其中创建index.js的文件,去需要公开的内容,主模块想要引入必须写为require("./文件夹的名字")

2、创建名为m2的文件夹,在其中创建xx.js的文件,去需要公开的内容,主模块想要引入必须写为require("./文件夹的名字")

但是需要在m2文件夹中,在创建一个必须package.json的配置文件

3、创建一个必须名为node_modules的文件夹,在其中创建名为m3的文件夹,在其中创建index/xx.js的文件,去需要公开的内容,主模块想要引入必须写为require("文件夹的名字")

其实真实开发中,我们程序员用的最多的就是文件模块,目录模块的第三种方式根本就不是人用的,是机器npm的使用的

npm:

node package manager:node的模块/包管理器:专门管理第三方模块的,作用:下载安装、删除、更新、维护包的依赖关系...

如何使用第三方模块:

1、打开网站:npm官网

2、搜索你需要用到的模块,尽量用带有完全符合标志的那个包

3、打开cmd:检查一下npm下载工具是否安装成功:npm -v

4、下载:npm i 包名

5、删除:npm un 包名 - win7系统,删除时只需删除当前包,不会删除依赖关系

6、更新:npm up 包名 - 有可能此项目n年后要维护,有可能包就过期了,需要更新

将其放在public/node_modules文件夹中