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 - 做特效
2、Node:不支持BOM+DOM,但是他却有10万个以上的模块等待我们去学习
2、模块:每个一个.js文件都可以称之为是一个模块
1、模块化开发:如果以一个网站来说:我们可以按照功能分为很多模块:商家模块、产品模块、促销模块、用户模块...
分工合作:将每个模块交给对应的人完成,最后再由【主模块】进行引入
1、每个模块都有一个操作,可以用于公开/暴露自己的成员
exports.属性名=属性值;
module.exports={
属性名:属性值,
...
}
2、每个模块都有一个操作,可以用于引入其他模块
var xxx=require("./文件名");//./千万不能省略
面试题:module.exports和exports的区别?
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的16倍
2、为什么快:1、使用goole浏览器的v8引擎
2、官方提供东西少,甚至连数据库的API都没有提供过
4、官方模块: - 不需要下载,在你安装环境的时候就已经装备好了
1、global模块:
不需要引入,直接使用
1、提供了5个形参变量给我们,可以直接使用的:
1、exports - 空对象,公开/暴露自己的成员
2、require - 方法,引入其他模块的
3、__filename - 获取当前文件的完整的绝对路径 - 没用
4、__dirname - 获取当前文件的绝对路径,不包含此文件的名字,何时:vscode的某些同学可能不能使用相对路径必须写绝对路径
5、module - 指代当前模块本身,并且包含前面四个属性
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的特点(快)
小练习:使用的API将public/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.html:src/html/1.html
想找到src下面的html下面的所有的html:src/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、语法变回ES5 老IE也能支持我们写的语法
切记用的是babel6
*安装:
1、npm install --save-dev gulp-babel@7 babel-core babel-preset-env
2、npm 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:"代老湿"}));
4、return返回一个数据
function f1(){
var a=1;
var b=2;
return [a,b];
}
var [result1,result2]=f1();
console.log(result1)
console.log(result2)