1.终端常用命令
- md 创建目录
- rmdir(rd) 删除目录,目录内没有文档。
- echo on a.txt 创建空文件
- del 删除文件
- rm 文件名 删除文件
- cat 文件名 查看文件内容
- cat > 文件名 向文件中写上内容。
2.nvm常用的命令
- nvm list 查看当前安装的Node.js所有版本
- nvm install 版本号 安装指定版本的Node.js
- nvm uninstall 版本号 卸载指定版本的Node.js
- nvm use 版本号 选择指定版本的Node.js
2.什么是nodejs
- 1.Node 是一个构建于 Chrome V8引擎之上的一个Javascript运行环境
- Node是一个运行环境,作用是让js拥有开发服务端的功能
- 2.Node使用事件驱动、非阻塞IO模型(异步读写)使得它非常的轻量级和高效
- Node中绝大多数API都是异步(类似于ajax),目的是提高性能
- 3.Node中的
NPM
是世界上最大的开源库生态系统(类似于github)- NMP官网:https://www.npmjs.com
3.服务端js与客户端js区别
- 1.客户端JS由三部分组成
- ECMAScript:确定js的语法规范
- DOM:js操作网页内容
- BOM:js操作浏览器窗口
- 2.服务端JS只有ECMAScript
- 因为服务端是没有界面的
- ==在nodejs中使用dom与bom的api程序会报错==
- 因为服务端是没有界面的
4.ES6语法新特性
变量声明let与const
- let声明的变量不存在预解析
- let声明的变量不允许重复(在同一个作用域内)
- 块内部定义的变量,在外部是不可以访问的
- for循环括号中声明的变量只能在循环体中使用
- 在块级作用域内部,变量只能先声明再使用
- const用来声明常量
- const声明的常量不允许重新赋值
- const声明的常量必须初始化
变量的解构赋值
- 数组解构赋值
1
2
3
4
5
// let [a,b,c] = [1,2,3];
// let [a,b,c] = [,123,];
// let [a=111,b,c] = [,123,];
// console.log(a,b,c);- 对象解构赋值
1
2
3
4
5
6
7// 对象的解构赋值
// let {foo,bar} = {foo : 'hello',bar : 'hi'};
// let {foo,bar} = {bar : 'hi',foo : 'hello'};
// 对象属性别名(如果有了别名,那么原来的名字就无效了)
// let {foo:abc,bar} = {bar : 'hi',foo : 'nihao'};
// console.log(foo,bar- 字符串解构赋值
1
2
3
4
5
6
7
8
9// 字符串的解构赋值
// let [a,b,c,d,e,length] = "hello";
// console.log(a,b,c,d,e);
// console.log(length);
// console.log("hello".length);
// let {length} = "hi";
// console.log(length);字符串扩展
includes()
- 判断字符串中是否包含指定的字串(有的话返回true,否则返回false)
- 参数一:匹配的字串
- 参数二:从第几个开始匹配
startsWith()
- 判断字符串是否以特定的字串开始
endsWith()
- 判断字符串是否以特定的字串结束
模板字符串
-
1
2
3
4
5// console.log('hello world'.includes('world',7));
// let url = 'admin/index.php';
// console.log(url.startsWith('aadmin'));
// console.log(url.endsWith('phph'));
-
函数扩展
参数默认值
参数结构赋值
-
1
2
3
4// function foo({uname='lisi',age=13}={}){
// console.log(uname,age);
// }
// foo({uname:'zhangsan',age:15});
-
rest参数
-
1
2
3
4
5
6
7// rest参数(剩余参数)
// function foo(a,b,...param){
// console.log(a);
// console.log(b);
// console.log(param);
// }
// foo(1,2,3,4,5);
-
扩展运算符
1
2
3
4
5
6
7
8
9
10
11
12
13// 扩展运算符 ...
function (a,b,c,d,e,f,g){
console.log(a + b + c + d + e + f + g);
}
// foo(1,2,3,4,5);
let arr = [1,2,3,4,5,6,7];
// foo.apply(null,arr);
foo(...arr);
// 合并数组
let arr1 = [1,2,3];
let arr2 = [4,5,6];
let arr3 = [...arr1,...arr2];
console.log(arr3);箭头函数
/* 无参无返回函数 */
ES6: 将function关键字使用 => 符号代替
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//注意点:形参小括号写在 箭头前面,无参时不能省略
let fn1 = ()=>{
console.log('开工大吉');
};
//注意点:形参小括号写在 箭头前面,无参时不能省略
// function foo(){
// console.log('hello');
// }
// foo();
// let foo = () => console.log('hello');
// foo();
//如果函数体只有一行,可以省掉大括号
fn1 = ()=> console.log('开工大吉');
fn1();
注意事项:
1、多个参数必须用小括号包住
2、箭头函数中this取决于函数的定义,而不是调用
3、箭头函数不可以new
4、箭头函数不可以使用arguments获取参数列表,可以使用rest参数代替
- 类与继承
5.Node模块化
在Node.js中没有window对象,没有DOM,BOM,但是有一个类似的对象global,访问全局成员的时候可以省略global
Node js特点
1.模块化开发
模块化相关的规则:
1、如何定义模块:一个js文件就是一个模块,模块内部的成员都是相互独立(避免了命名冲突)
2、模块成员的导出和引入
如果要导出单个的成员或者比较少的成员,一般我们使用exports导出;
如果要导出的成员比较多,一般我们使用module.exports的方式
这两种方式不能同时使用
1 |
var sum = function(a,b){ |
2.fs文件模块(读写文件)
- 在nodejs中如果想要进行文件操作,就必须引入 fs 这个核心模块
- 在fs这个核心模块中,就提供了所有的文件操作相关的API
- 通过读取到的文件其实都是二进制数据, 01 ,但是转化成了16进制
- 可以通过 toString方法转化为我们看得懂的字符串
1.1-readFile读取文件
1 |
//1.导入文件模块 |
1.2-writeFile写入文件
1 |
//1.导入文件模块 |
6.同步与异步区别
- 同步会有阻塞线程,异步不会
- 同步有序执行,异步无序执行
- 同步没有回调函数,异步有
js从上解析代码流程
- 判断是同步还是异步
- 如果是同步则立即执行
- 如果是异步则不执行,而是放入事件玄幻中(Event Loop)
- 所有代码解析完毕之后,开始执行使劲循环中的异步代码
nodejs 异步执行的任务;
- 文件 I / o
- 网络 I / o
7.http模块(搭建服务器)
- 搭建一个服务器的目的是服务器可以提供对数据的鼓舞
- 可以通过使用createServer( ) 方法构建一个web服务器
步骤:
1.导入模块
要使用 HTTP 服务器和客户端,必须 require(‘http’)
const http = require(‘http’);
2.创建服务器
使用createServer()方法构建一个web服务器,返回一个Server实例
参数:回调函数
req:request 客户端请求的数据
res:response 服务端响应的数据
3.启动服务器
1.1-http 模块搭建服务器
1 |
//1.导入模块 |
1.2-响应客户端请求
1 |
//1.导入HTTP模块 |
1.3-根据不同请求响应不同数据
1 |
//1.导入HTTP模块 |
1.4-http响应客户端HTML文件
1 |
//1.导入http模块 |
8.Nodejs路径
node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命名的文件夹路径
在服务端开发中,一般不要使用相对路径,而使用绝对路径
解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径
- __filename:当前js文件所在目录的绝对路径
- __dirmame:当前js文件的绝对路径
console.log(dirname);
console.log(filename);
buffer对象
buffer是一个缓冲区,主要用于操作二进制的数据流,用法跟数组非常的相识
1.创建一个buffer实例
使用new操作符,有四种方法创建一个Buffer实例
- new Buffer(size),创建一个指定大小的buffer
1 |
var buf = new Buffer(10); |
- new Buffer(array),根据一个字节数组来创建一个buffer
1 |
var bf=new Buffer([1,2,3]); |
- new Buffer(str[,encoding]),根据一个字符串和编码格式创建buffer,不指定编码时默认使用utf8
1 |
var bf1=new Buffer('miao','utf-8'); |
- new Buffer(buffer),根据buffer实例创建一个新的buffer
buf.write()方法
1 |
buf.write(string[, offset][, length][, encoding]) //往Buffer对象中写入数据 |
uf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:
- string,待写入的字符串对象
- offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0
- length,要写入的字节数
- encoding,代谢如字符串的编码格式,默认为utf8
buf.toString()方法
1 |
buf.toString([encoding], [start], [end]) // 根据 encoding参数(默认是 'utf8')返回一个解码的 string 类型 |
如果不知道开始位置,则将字符全部返回,如果指定了开始位置和结束位置则按指定的返回,在上面实例中,因为一个中文占3个字节,所以在bf2这个实例中,我们指定从第三个位置开始,则返回的是徐这个汉字
buf.toJSON()
1 |
//返回一个 JSON表示的Buffer实例。JSON.stringify将会默认调用来字符串序列化这个Buffer实例 |
buf.slice()方法
buf.slice([start], [end]) ://返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址,注意:修改这个新的buffer实例slice切片,也会改变原来的buffer
原文:大专栏 nodejs笔记总结