node是什么
- node 是基于chrome v8引擎的javascript运行时环境。 node使用了事件驱动和非阻塞I/O模型,使其轻量高效。node的包管理器是npm
- 查看更多node相关
node的安装(mac)
//1. 安装nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
//2. 安装node指定版本
nvm install 8.11.3
//3. 使用指定版本
nvm use 8.11.3
//4. 查看node版本
node -v
//5. 用cnpm替换npm提高下载模块速度
npm i cnpm -g
相关概念
- node的主线程是单线程的
- web异步方式有:setTimeout, callback, onClick, ajax
- 同步/阻塞,异步/非阻塞;同步是针对应用程序执行流程来说的,阻塞是针对内核输入输出来说的;异步和非阻塞也是同样的道理
4.i/o操作, 就是读写操作,能用异步就不要用同步 - 区分环境变量,代码里通过
process.env.NODE_ENV;
export NODE_NEV=XXX;//linux
set NODE_ENV=XXX;//window
- process.nextTick(function(){})//异步的,当前队列的底步,同步之后的执行
setImmediate(function(){})//放入到第二个队列中
setTimeout(function(){})//也是放在第二个队列,如果不加参数是跟setImmediate一样,哪个先执行,不一定;如果需要设置时间需要用setTimeout
7.剩余运算符(...如果放在形参里面就是剩余运算符)(es6语法)
通过...剩余运算符,将所有的参数放到args数组里面
setTimeout((...args) => {
console.log(args.length)
},100, '吃饭’)
- 展开运算符(...如果放在实参里面就是展开运算符)(es6语法)
function add($1,$2) {
console.log($1,$2)
}
add(...[1,3]);
- 合并对象(用...扩展运算符,es7语法,需要node版本8.5以上)
let obj1 = {name:'miaozhirui'};
let obj2 = {age:18}
let obj3 = {...obj1, ...obj2};
console.log(obj3)
- node 里面的js文件有个全局变量arguments,该参数表示的是外层的闭包的形参,值有以下几个,这几个参数可以在文件中直接使用
exports requre module __filename __dirname
- 模块化的作用: 低耦合,高内聚,把实现相同功能的代码放在一个文件(高内聚),把实现不同功能的代码分开成不同的文件(低耦合);方便维护;防止代码冲突(命名冲突)
- 实现模块化的方式有哪些:闭包和单例;单例最终被淘汰,在js里面单例就是定义了字面量对象,一个人用obj对象,另一个人也用了obj对象,并不能保证唯一冲突, 还是会导致冲突,所以最终被淘汰了,
- 浏览器端通过闭包实现的模块化主要有两种规范,一个是CMD, 一个是AMD(浏览器端的模块规范,seajs是CMD的代表作(就近依赖),requirejs是AMD的代表作(依赖前置))
- nodejs实现模块化的规范是基于commonjs,规范定义了以下规则
1. 定义如何创建一个模块:一个js文件就是一个模块
2. 定义如何使用一个模块: 使用一个文件只需要require一个文件
3. 定义如何导出一个模块: exports/module.exports
- nodejs里面如果一个函数是异步函数的话,一般都有回调函数
- exports和module.exports的区别: exports和module.exports都指向了同一个对象,但是模块最终导出的是module.exports, 也就是说如果导出的时候是
exports=demo,这句话其实是不生效的,这句话只是给exports重新复制了,但是module.exports指向的对象并没有变化 - utils.isArray 和utils.isFunction, utils.inherits(继承共有方法)
- util.promisify把普通的带有回调函数的方法转成promise
//要想一个函数执行完之后具有then方法,只需要执行完成之后,返回promise即可
read().then(function(data){},function(error){})
//所以read方法可以像下面这样写
function read(){
//resolve和reject都是函数,当调用resolve会调用then的第一个方法;当调用reject会调用then的第二个参数
return new Promise((resolve, reject) => {
})
}
############## 以上的方法太麻烦了 ################
let util = require('util');
let fs = require('fs');
let readFile = util.promisify(fs.readFile);//将函数promisify化
readFile('2.js', 'utf8').then(function (data) {
console.log(data)
}, function (error) {
console.log(error)
})
模块的安装
-
全局安装
- npm i xxx -g (只能在命令行中使用)
- npm root -g 可以查看全局安装的包安装到哪里了
- nvm是切换node的版本的,用来管理的node的版本,可以安装在全局
- nrm是切换npm的源,具体使用如下
//安装 cnpm i nrm -g nrm ls nrm use taobao //切换仓库源- http-server模块的使用,用来启动一个server,如果想以哪个目录作为根目录建server,就进入到哪个目录,执行http-server集合
npm http-server -g cd /demo http-server;- 可以基于node第三方模块idoc模块新建一个博客模板
-
本地安装
- 本地安装没有-g参数,安装之前需要在目录里面初始化,用来记录安装的依赖
- npm init -y 会在当前目前新增加一个package.json文件
- 当在某个目录下安装第三方模块的时候,会先在当前目录找package.json文件; 如果找不到,会到父及目录找,找不到才会在当前目录下安装
- package.json中的scripts可以配置快捷命令脚本
npm run dev - 本地的依赖分为开发依赖和项目依赖;项目依赖是开发时需要,上线也需要;开发依赖是开发时需要,上线时不需要;
//安装项目依赖 npm install jquery --save //删除项目依赖 npm uninstall jquery --save // 安装开发依赖 npm install less -D || npm i less --save-dev //删除开发依赖 npm uninstall less --save-dev //安装全部依赖 npm install //会把package.json文件里面记录的依赖全部安装上 //安装指定版本 npm install jquery@xxx
发布包
- 先回到国外
nrm use npm - 包名不能和已有的包名相同
- 需要一个入口文件来做整合
-
npm whoami//查看当前用户是谁 - 注册账号
npm addUser - 如果有账号的话
npm login输入账号即可 - 发包
npm publish [floder]//不带floader表示发布当前目录
buffer
-
概念
- 概念: buffer是
缓冲区,就是暂时用来存放输入输出数据的一段内存 - 引入原因: js语言没有二进制数据类型,而在处理TCP流和文件流的时候,必须要
处理二进制数据 - Nodejs提供了一个Buffer对象来提供对二进制数据的操作
- buffer对象是一个表示
固定内存分配的全局对象,也就是说要放到缓存区中的字节数需要提前确定 - buffer好比由多位自己元素组成的数组,可以有效的在javascript中表示二进制数据
- buffer里面存放的是16进制
- 概念: buffer是
-
字节
- 计算机最小存储计量单位是:BIT(位) 二进制数据
- 计算机最基本存储计量单位是:Bytes(字节)
1024bytes = 1k 8bit(8个二进制) = 1bytes 1个汉字(3个bytes) 1个字节转成十进制最大是255 1个字节最大转换成16进制是ff -
定义buffer的三种方式
- 通过长度定义buffer(最常用)
let buffer = Buffer.alloc('6'); let buffer = Buffer.allocUnsafe(6);- 通过数组定义buffer
let buffer = Buffer.from([1,2,3,4])- 字符串创建buffer(把字符串转成buffer)
let buffer = Buffer.from('珠峰培训') -
buffer转成字符串
buffer.toString()








网友评论