Node
- Node是一个基于Chrome V8引擎的 javaScript代码运行环境
- 什么软件可以运行javaScript ,它就是javaScript的运行环境
- Node.js是运行在代码环境之上的语言
- 由ECMAScript 和模块的API组成
Node.js全局对象global
- 在浏览器中全局对象是window,在Node中全局对象是global
- 全局对象global 中 以下方法可以在任何地方使用, global可以省略
- console.log()
- setTimeout()
- clearTimeout()
- setInterval()
- clearInterval()
javaScript的弊端
- 浏览器端javaScript在使用时存在两大问题,命名冲突(命名污染)和文件依赖
- 模块化开发需要依赖第三方库文件,具有代表性有require.js 和sea.js
环境变量Path
- 将一些要执行的软件的根目录存储到系统当中,在命令行中当前目录没有找到要执行的文件名时,系统会自动去这些目录下查找有没有同名的文件名,有就会执行.
模块化开发(导入导出)
- 一个javaScript文件就是一个模块.
- 模块化开发的好处就是当一个模块出问题时,我们只需要将这个模块取出 进行修复就好,其他模块还是正常在运行的
- 模块内部定义的变量和函数默认情况下在外部无法得到
- 模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块
要导出暴露(共享)出去的变量或函数的 a.js 文件:
const add = (n1,n2) => n1+n2; //定义一个加法函数
exports.add = add; //第一个add为exports对象的属性,第二个add为函数
要导入外部变量或函数的 b.js 文件:
let a = require('./a.js'); //用一个变量接收返回值
a.add(10,20); //输出a可以查看共享的变量或函数 函数可以代入参数调用来使用
- exports是module.exports的别名(地址引用关系) ,所以导出导入变量用module.exports对象也是可以的
- 当exports和module.exports指向同一个对象时,可以同时添加属性和方法,当给module.exports对象重新赋值(覆盖原有的属性方法)时,导出对象最终以module.exports准
系统模块 fs 文件操作
-
系统模块: Node环境提供的API ,这些API都是以模块的方式进行开发的,所以这些API又叫系统模块
-
文件模块fs 可以 读取文件, 写入文件, 创建文件夹
-
要使用fs的方法 必须先引入fs模块
- 读取文件
- fs.readFile(‘文件路径/文件名称’,[‘文件编码’],callback) callback 就是回调函数
- 读取文件是硬盘的操作,需要时间(耗时操作), 所以用一个回调函数来返回读取的结果
const fs = require('fs') //引入fs模块
//要读取其他模块的 js文件b.js内
fs.readFile('./a.js','UTF8',(err,doc) => {
//读取a.js文件 如果读取成功err=null 失败 err就是一个对象,里面存储错误信息
if (err == null) {
//如果读取成功
console.log(doc) //输出doc(文件读取的结果,就是文件的内容)
}
})
2.写入文件
- fs.writeFile(‘文件路径/文件名称’ , ‘要写入的内容’ , callback)
- 如果没有要写入的这个文件,系统会自动帮我们创建
const fs = require('fs') //引入fs模块
fs.writeFile('./dome.txt','要写入的内容可以是变量',err => {
if (err != null) {
//当写入失败的时候
console.log(err); //输出打印错误信息 并且直接退出函数
return;
}
console.log('文件内容写入成功') //写入成功时,控制台打印成功
})
系统模块path 路径操作
- 路径拼接 path.join(‘路径’,‘路径’…)
- 由于不同操作系统的分隔符不同 \ 或 / 我们需要用路径拼接方法让系统自动帮我们拼接相应的分隔符
const path = require('path') //引入path模块
//因为路径拼接不是耗时操作 可以直接用变量保存返回值
let finalPath = path.join('视频','动漫','喜洋洋与灰太狼')
console.log(finalPath) // window以\分割 所以会分割成 视频\动漫\喜洋洋与灰太狼
相对路径and绝对路径
- 相对路径有时候相对的是命令行工具的当前工作目录,容易路径错误,所以大多数情况下使用绝对路径
- 在读取文件或者设置文件路径都会选择绝对路径
- 可以使用**__dirname**获得当前文件所在目录的绝对路径
const fs = require('fs') //引入fs模块
const path = require('path') //绝对路径是路径操作要引入 路径模块
//读取文件API 自动获取当前文件的绝对路径 //报错回调函数
fs.readFile(path.join(__dirname,'文件名'),'uft8',(err,doc) => {
console.log(err)
console.log(doc)
})
第三方模块
- 别人编译好,具有特定功能 可以直接使用的模块叫第三方模块.
- 由于第三方模块通常由多个文件组成放在一个文件夹中,又名为 包
- 第三方模块两种存在形式
- 以js文件的形式存在,提供实现具体功能的API接口 类似jQuery
- 以命令行工具形式存在,辅助项目开发
- 第三方模块下载平台: npmjs.com 第三方模块的存储和分发仓库
- 下载: npm install 模块名称 (默认下载到命令行工作目录下)
- 本地安装就是模块安装到当前项目当中 (库文件)
- 全局安装就是安装到公共目录,所有的项目都可以使用 (命令行工具)
- 卸载 npm uninstall 模块名称 (直接删除文件夹也可以)
第三方模块nodemon 保存自动运行
- 命令行工具中 : npm install nodemon -g 下载(-g全局匹配)
- 当这个文件被保存时,命令行工具会自动再运行这个被保存的文件, 大大提高了工作效率
- ctrl+c在命令行工具中是终止操作的意思
第三方模块 nrm 切换国内下载地址
- 下载地址切换工具,因为npm默认的下载地址在国外,国内下载速度慢. 所以要切换到国内同步了国外npm的服务器网址.这样可以提高下载速度
- 命令行工具使用: npm install nrm -g 下载(-g全局匹配)
- nrm ls 查询可用下载地址列表 (前面有*号的是当前默认的下载地址)
- nrm use 要切换的下载地址
第三方模块 gulp
- 构建项目,HTML CSS JS文件压缩合并
- 语法转换(es6,less)
- 公共文件抽离
- 修改文件浏览器自动刷新
- 1.命令行工具使用 npm install gulp 下载(要使用的库文件下载)
- npm install gulp -cli 安装gulp命令工具
- 2.在项目根目录创建gulpfile.js文件 (名字不能更改)
- 3.新建一个src目录文件 将原代码全部放入其中, 新建一个dist文件 用于放置构建后的文件
- 4.在gulpfile.js文件中编写任务
- 5.在命令行工具中执行gulp任务
- 一个html要运行 需要拷贝html css js 还有图片音频等文件
gulp中提供的方法:
- gulp.src() 获取任务要处理的文件
- .pipe 匹配当前任务获取的文件 , 进行何种操作 (指派任务)
- gulp.dest() 输出文件
- gulp.task() 建立gulp任务 (第一个参数是任务名,第二个参数是回调函数)
- gulp.watch 监控文件的变化
const gulp = require('gulp') //引入gulp模块
gulp.task('要建立的任务名',() => {
//task 建立任务
gulp.src('./src/css/base.css') //要处理的文件
.pipe(gulp.dast('dist/css')) //要输出的文件(相当于拷贝到另一个文件夹中)
})
- 要使用gulp的方法 需要下载一个东西
- 命令行工具 : npm install gulp-cli -g
- 使用时在当前目录名 命令行工具输入 : gulp 要输出的任务名
gulp插件使用
- 在命令行工具下载插件
- 查看相应文档
- 调用插件
- gulp-htmlmin html文件压缩
- gulp-csso 压缩css
- gulp-babel javaScript语法转换(es6转es5)
- 会根据当前运行环境,转换支持当前环境的代码
- gulp-less less语法转换css 等等
- gulp-uglify 压缩混淆javaScript (压缩js文件)
- 在语法转换完毕后使用
1. require()引用插件的模块
2.使用gulp.task()创建任务
task的回调函数中进行:
3.gulp.src()获取要处理的文件
//*代表所有的, less文件或css文件 可以以数组的方式传递多个
gulp.src(['./src/css/*.less','./src/css/*.css'])
4. pipe(调用要对要处理文件使用的下载好的插件的方法)
pipe(less()) prpe(csso()) //将less转换为css 将css进行压缩
5. pipe(gulp.dest(输出处理后的文件到相应文件夹) //复制处理后的文件至构建后的文件夹
任务构建(命令行工具执行多个任务)
task第二个参数 如果不写函数 写中括号,数组元素写任务名,当这个任务被执行时,会依次执行数组里的任务
gulp.task('default',['任务名1','任务名2','任务名3','任务名4'])
package.json项目描述文件
项目描述文件,记录当前项目信息,例如项目名称,版本号,作者,github地址,当前项目依赖了哪些第三方模块, 可以让他人快速了解项目信息,下载依赖文件. 使用npm init -y 生成 路径不能有中文
-
下载第三方模块时会自动产生package-lock.json,它的作用是, 锁定包的版本号 加快下载速度
-
package.json中scripts选项中的作用
- 存储命令的别名 , 当我们要频繁使用的命令比较长的时候 可以给它起个别名
- 通过 npm run ‘别名’ 来运行
-
在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖。
-
使用
npm install 包名
命令下载的文件会默认被添加到package.json文件的dependencies字段中。 -
在dependencies字段中的第三方模块就是项目依赖
- 开发依赖
-
在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖。
-
使用
npm install 包名 --save-dev
命令下载的文件会默认被添加到package.json文件的devDependencies字段中。 -
在devDependencies字段中的第三方模块就是开发依赖
-
为什么记录依赖项
-
Node.js中下载的第三方包文件拥有非常多的细碎文件,将项目通过移动硬盘传递给别人时传输速度非常慢.
-
使用git工具管理项目时,不希望git管理node_modules文件夹,也不会将其上传到github中.
- 当其他人获取到项目时,可以在项目根目录下执行
npm install
命令,npm工具会自动去package.json文件中查找项目依赖文件并下载.
- 当项目上线以后,可以直接运行
npm install --production
下载项目依赖。如果不加–production,会下载全部依赖
模块查找规则
- require(’./find’); 当模块拥有路径 没有后缀时
- 先查找有没有同名js文件 ,再查找同名文件夹
- 有同名文件夹,就会去当前文件夹中的package.js文件中main选项中的入口文件
- 如果main选中的没有不存在或者没有指定入口文件, 找同名文件夹中的index.js
- 如果文件夹中没有index.js文件 就会报错
- require(‘find’); 当模块没有路径也没有后缀时,会先被当作一个系统模块
- 如果参数不是一个系统模块,会去node_modules文件夹中看看是否有同名的js文件
- 接下来的查询步骤和当模块拥有路径没有后缀时一样
服务器端基础
网站的组成 :
- 客户端(html css js) : 在浏览器运行的部分, 能让用户看到并与之交互的界面程序.
- 服务器端(node.js) : 在服务器中运行的部分 , 负责 存储数据和处理应用逻辑.
- 客户端 通过请求 服务器 , 服务器端接收请求并逻辑处理 响应回 客户端
- Node网站服务器:它能够接收客户端的请求,将接收的请求逻辑处理后响应
IP地址 域名 端口
- IP地址 : 网络环境下的唯一标识,相当于计算机的编号吧,用于访问服务器,但是由于ip地址都是数字,不便记忆,所以就有了域名.
- 域名 : 就是上网所用的网址,计算机会在DNS服务器自动将域名转换为IP地址 然后使用IP地址请求服务器
- 端口 : 用于区分客户端的不同的软件请求是哪一种应用程序, 是在一段范围内的数字(0~65535),每一个应用程序都有一个不同的端口号,如果一个端口号被一个软件占用了, 另一个软件再去绑定就会报错.
- netstat -anolfindstr 3000 查看3000端口是哪个进程的PID在占用
- 3000网站服务 110 邮件服务 27017 数据库服务 21文件上传服务
URL的组成(统一资源定位符)
- URL传输协议组成 : 协议//域名:端口/ 路径?参数
- http: // www.baidu.com / news / 20190110/123456789.html
- 网站一般使用的都是http协议.
uri : 统一资源标识符
- 作用 : 本地资源定位
创建Web服务器 (http模块)
//引用系统模块htttp
const http = require('http')
//http的一个方法获取http网站服务器对象
const app =http.createServer();
//为网站服务器添加事件(request请求事件) req请求对象 res响应对象
app.on('request',(req,res) => {
//res响应对象的end方法 响应请求对象 参数写响应的内容
res.end()
})