node.js

177 阅读9分钟

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

做的功能绝对不是特效,做的事是和服务器端一致(和数据库进行交互)
目的:
1、使用node代码搭建一个服务器&文件系统(服务器是代码写的,而且文件可以访问任何一个位置)
2、Node.js如何沟通前端和数据库 - 全栈操作
3、全栈一条龙:图书管理系统(jquery+bootstrap+node.js+ajax+mysql)

2、Node.js安装:14.xx版本以上就不支持windows7 - 一路往下点,哪里点不动了,就√上哪里,不要取消任何东西

版本:16年(0.12)	16年中(4.xx)		16年底(6.xx)  -  更新速度快,意味着:好的方向:发展迅速,其实也没加什么新东西
检查:打开cmd输入:node -v - 查看版本号,如果能看到版本号说明安装成功		      坏的方向:学习成本高
其实我们安装的这个node.js就是一个运行环境而已,不需要浏览器了

3、Node.js如何运行:

1、交互模式 - 临时测试:
	打开cmd:node回车,就可以敲你的"js"代码;

2、脚本模式 - 正式开发中
	1、先创建好:xx.js文件:里面书写好你的node.js代码
	2、打开cmd输入:node 文件绝对路径

3、编辑器有插件:前提:前两种方式是可以使用的
	1、vscode:code runner - 文件代码处右键第一个选项
	2、HBuilder:nodeeclipse - 右键运行

4、Node.js的知识点:

1、js 和 node的区别
	相同点:都可以使用一切的Ecmascript的一切API都可以使用,放心大胆用,在服务器端不存在浏览器,就不会存在老IE,更不会有兼容问题
	不同点:1、javascript:BOM+DOM - 做特效
		2Node:不支持BOM+DOM,但是他却有10万个以上的模块等待我们去学习

2、模块:每个一个.js文件都可以称之为是一个模块
	1、模块化开发:如果以一个网站来说:我们可以按照功能分为很多模块:商家模块、产品模块、促销模块、用户模块...
		分工合作:将每个模块交给对应的人完成,最后再由【主模块】进行引入
		1、每个模块都有一个操作,可以用于公开/暴露自己的成员
			exports.属性名=属性值;
			module.exports={
				属性名:属性值,
				...
			}

		2、每个模块都有一个操作,可以用于引入其他模块
			var xxx=require("./文件名");//./千万不能省略

		面试题:module.exportsexports的区别?
		node.js的底层真正做公开操作的是module.exports
		底层有一句话:var exports=module.exports
		但是:如果你写了  exports={} - 卵大爷,把module.exports给覆盖了,所以不在具备公开的功能
			

3、模块的分类:
	1、官方模块 - 今天下午重点,大概几十个,重要其实只有几个
	2、第三方模块 - 多的数不清,提供了很多官方没有的东西,比如数据库,我们明天再去npm学习如何下载:mysql、mongo、express
	3、自定义模块

	node.js最大的特点:
		1、快、非常快 - 以前最快的是php,node速度是php的162、为什么快:1、使用goole浏览器的v8引擎
			     2、官方提供东西少,甚至连数据库的API都没有提供过

4、官方模块: - 不需要下载,在你安装环境的时候就已经装备好了
	1global模块:
		不需要引入,直接使用
		1、提供了5个形参变量给我们,可以直接使用的:
			1exports - 空对象,公开/暴露自己的成员
			2require - 方法,引入其他模块的
			3、__filename - 获取当前文件的完整的绝对路径 - 没用
			4、__dirname - 获取当前文件的绝对路径,不包含此文件的名字,何时:vscode的某些同学可能不能使用相对路径必须写绝对路径
			5module - 指代当前模块本身,并且包含前面四个属性

		2、还提供了定时器,和以前不一样了,以前是window提供的
			有一次性定时器,也有周期性定时器,但是多了一个瞬间定时器
			setImmediate(()=>console.log("我叫瞬间定时器")); === 一次性定时器时间写为0

		3、还提供了console控制,但是这些人从前都属于window,现在不是了,因为学的叫node.js

	2、querystring模块:查询字符串模块
		querystring 模块提供了用于解析和格式化url查询字符串部分的API。
		需要引入:const qs = require('querystring'); - 垃圾
		var obj=qs.parse("查询字符串"); - 前端传来的东西如果能变成一个对象确实舒服,因为只需要obj.name就能得到前端的数据了
		仅仅只能放入查询字符串,完整的网址解析不了

	3、*url模块:小重点
		url模块提供用于url处理和解析的实用API
		需要引入
		const url = require('url');
		var str="http://www.baidu.com:80/details.html?name=dy&pwd=123123&vip=1";
		//API:url.parse("完整的url"); - 进行解析
		var obj=url.parse(str,true);//加true代表使用querystring模块中的parse方法解析查询字符串部分
		console.log(obj.pathname);//路由:一会儿我们搭配做出文件系统,根据用户的请求不同,访问不同的页面
		console.log(obj.query.name);//前端的请求消息,前端->后端

	4、***fs模块:中重点
		fileSystem - 文件系统:对文件提供了增删改查的操作
		需要引入:
		const fs = require('fs');

		1、*读取:fs.readFile("文件路径", (err,buf)=>{
				console.log(buf);//就是你读取到的东西,但是nodejs多了一种数据类型叫做buffer,把我们认识的东西缓存为不认识的16进制数字
				console.log(buf.toString());//转回原文,但是基本不会转换:我们不会主动使用buf,但是一些API会让我们被动得到buf,但是也不用转换,因为node.js中大部分的API支持buf操作
			 })

		2、写入:fs.writeFile("文件路径","新内容"/buf,(err)=>{ - 覆盖掉原来的内容
				console.log("写入完毕后才会执行")
			 })

		3、追加:fs.appendFile("文件路径","新内容"/buf,(err)=>{ - 覆盖掉原来的内容
				console.log("写入完毕后才会执行")
			 })

		以上三个API都是异步操作:能够极大的发挥node.js的特点(快)

	小练习:使用的APIpublic/css/style.css,复制一份,取名字为style.backup.css

	5、*****http模块 - 超级重点
		搭建服务器:
		固定步骤:
			1、引入:const http = require('http');
			2、创建服务器
				var app=http.createServer();
			3、设置监听端口:
				app.listen(80);
			4、为服务器应用绑定了请求事件:说白就每有一个前端来访问就会触发一次
				app.on("request",(req,res)=>{
					console.log("来了一个客户端访问我");
				})

				详见:案例

			注意以后三阶段也会用到路由:
				一切的href和src

2022.5.18

1、gulp(使用率:2-) - 三阶段:webpack(使用率:8+)对应的 自动化构建工具(打包工具):项目经理/小组长使用的 - 体验流程 作用:

   *1、复制
   *2、压缩(css/js/图片...)
   *3、降级ES6为ES5,降级语法 - 因为ES5之前语法其实都没有变化,ES5只是提供了一些新的API,目的:支持兼容老IE
4、将scss/less编译为css - 不需要学习,现在的编辑器都自带此功能
5、重命名 - 不推荐,引入href、src的地方名字都要进行修改

为什么打包:

上线过后,不可能使用源代码(1、太大了 2、别的成员/外界也能看的懂)
肯定使用的是处理过后的代码,目的:1、为了提升网站效率 2、安全性
    

gulp是基于node.js编写的一个第三方模块(包、软件),需要在npm下载:安装的操作一步都不能少

*固定操作安装:1、cmd必须先全局安装gulp(不安的话,cmd提示:gulp不是内部命令) - 必做(运行gulp必要方式),一次性安装永久可用 npm i --global gulp 2、cmd再你的项目中局部安装 - 可以不做,直接复制代老湿的node_modules到你的项目之中 npm i gulp 3、cmd在你的项目初始化gulp - 必做 npm init 注意:名字可以自己写,但是不能有大写&中文,然后一路回车到底 4、配置完成,开始编写属于你自己的gulpfile.js文件!!!必须是这个名字

如何使用gulp: 1、先引入var gulp=require("gulp"); API: 1、布置任务: gulp.task("任务名",()=>{ //任务要做什么操作 })

   执行任务:
     cmd里面输入gulp 任务名; - gulp基于node,但是属于是一个独立的软件
     如果想不写任务名,默认执行default任务名的操作

2、复制
   gulp.src("入口文件路径"); -- 选中某个、某些源文件
   gulp.pipe(); -- 管道 -- 输送/插件操作
   gulp.dest("出口路径"); -- 输送到哪里去?

   案例:
   gulp.task("copyAll",()=>{
	gulp.src("源文件路径")
	    .pipe(gulp.dest("出口文件路径"))
   })

文件的路径写法:
  比如:
    想找到src下面的html下面的1.htmlsrc/html/1.html
    想找到src下面的html下面的所有的htmlsrc/html/*.html
    想找到src下面的html下面的所有的文件:src/html/*
    希望将src下面的/下面的所有内容都复制一份:src/*/*

恭喜你,已经学会了gulp

2、gulp的插件

1、压缩css步骤:

  gulp-cssmin插件
  npm下载插件:npm i gulp-cssmin
  查看readme中的example小案例
使用前记得引入
gulp.task("copycssmin",()=>{
	gulp.src("src/css/*.css")
		.pipe(cssmin())
		.pipe(gulp.dest("dist"))
})

2、压缩js步骤:

   1、删除换行和空白字符以及注释(变小文件) 2、会把回调函数中的形参全部简化为一个字母,对应的位置都会简化(变小文件的同时加密保护)
  gulp-uglify插件
  npm下载插件:npm i gulp-uglify
使用前记得引入
gulp.task("copyjsmin",()=>{
	gulp.src("src/js/*.js")
		.pipe(uglify())
		.pipe(gulp.dest("dist"))
})

3、ES降级:gulp-babel;

目的:

   1、语法变回ES5IE也能支持我们写的语法
  切记用的是babel6
 *安装:
	1npm install --save-dev gulp-babel@7 babel-core babel-preset-env
	2npm install --save-dev babel-preset-es2015  
	3、配置一个文件.babelrc:写入:{
					"presets": ["es2015"]
					}
      用法:
	使用前记得引入,先降级,在压缩
	gulp.task("copyjsmin",()=>{
	gulp.src("src/js/*.js")
		.pipe(babel())  
		.pipe(uglify())
		.pipe(gulp.dest("dist"))
	})
  注意:
   *1、记得要要把严格模式给删掉
    2、先降级后压缩 - 才能压缩完整

4、图片压缩插件:

参考网页:https://blog.csdn.net/x550392236/article/details/78017346
下载:npm i gulp-tinypng-nokey

2022.5.19

1、ES6目前学过的

1、模板字符串

2、let关键字

3、箭头函数

4、for...of
    

5、解构赋值:解析结构然后赋值,=左右的结构长得一样,就会悄悄的解析结构,再一一的对应赋值 语法:

	  1、类似数组的解构赋值
		var [a,b,c]=[1,2,3];

	  2、类似对象的解构赋值
		var {a,b=默认值,c}={c:3,a:1};

	  3、函数中传参的顺序无所谓了
		function zwjs({name,age=128,hobby}){
			return `我的名字叫${name},今年${age}岁,喜欢${hobby}`;
		}
		
		console.log(zwjs({hobby:"ctrl",name:"代老湿"}));

	  4return返回一个数据
		function f1(){
			var a=1;
			var b=2;
			return [a,b];

		}
		
		var [result1,result2]=f1();
		console.log(result1)
		console.log(result2)