1 为什么是Node
命令行工具
- win操作系统的
- Powershell
- git bash
- cmder(博主在用&仅用的)
环境变量
环境变量的值就是路径。
环境变量就是比如,在我桌面员工hello.exe的程序。
配置环境变量之前:在命令行工具中我要打开hello.exe。首先我得需要在桌面目录下,如果有执行,没有就报错比如command not found。
配置环境变量之后:我们在任何目录(环境)下打开hello.exe,程序会首先在当然路径中到次文件,如果没有就在配置好的环境变量中,依次找次文件,
如何配置环境变量:
老规矩,图解
进程与线程概念
进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。可以理解为运行环境比如车间
线程:是操作系统能够进行运算调度的最小单位,可以理解为比如车间工人
打开任务管理器可看到
单线程与多线程
单线程:一次执行一个任务
- Node的服务器单线程的
- Node处理请求时是单线程,但是在后台拥有一个I/O线程池
多线程:可以同时执行多个任务,高并发 阻塞
- 传统的服务器都是多线程的
- 每进来一个请求,就创建一个线程去处理请求
如此看来,是不是觉得多线程是更优的选择呢,快速高效。可以这么理解,多数程序比如Java就是多线程的。
但是多线程也会有弊端,比如Java在同时渲染页面的时有两种页面效果作用于一个元素,这时该如何处理?
nodejs是单线程的。
2 Nodejs简介
1 就是js运行平台
Nodejs不是web框架,不能与Spring或Nodejs对比
不是编程语言,不能与Python或者PHP
是一个平台:将多种技术组合起来 让js也能调用系统接口,开发后端应用
Nodejs工作流程
2 node的发展
瑞安·达尔(Ryan Dahl)- nodejs之父
- Ryan Dahl并非科班出身的开发者,在2004年的时候他还在纽约的罗彻斯特大学数学系读博士。
- 2006年,也许是厌倦了读博的无聊,他产生了【世界那么大,我想去看看】的念头,做出了退学的决定,然后一个人来到智利的Valparaiso小镇。
- 从那起,Ryan Dahl不知道是否因为生活的关系,他开始学习网站开发了,走上了码农的道路。
- 那时候Ruby on Rails很火,他也不例外的学习了它。
- 从那时候开始,Ryan Dahl的生活方式就是接项目,然后去寄户的地方工作,在他眼中,拿工资和上班其实就是去里旅行。
- Ryan Dahl经过2年的工作后,成为了高性能Web服务器的专家,从接开发应用到变成专门帮客户解决性能问题的专家。
- 期间他开始写一些开源项目帮助客户解决Web服务器的高并发性能问题,他尝试了很多种语言,但是最终都失败了。
- 在他快绝望的时候,V8引擎来了。V8满足他关于高性能Web服务器的想象。于是在2009年2月它开始着手编写Node.js
3 node的特点
4 nodejs执行js文件
5 node整合到webstrom中
3 Node基础
模块化
初级程序员调方法,中级程序员会封装,高级程序员写框架。要封装就要模块化。
何为模块化:
如下我们把一些常用的方法封装在util.js中并暴露export出去,在需要使用该api的时候就需要在用的地方require引用
// util.js
exports.add=function (a,b) {
return a+b
}
exports.mul=function (a,b) {
return a*b
}
// main.js
const math=require('./util')
console.log(math.add(1,2))
引入概念:模块标识
- 模块标识其实就是模块的名字,也就是传递给requir()方法的参数,
- 它必须是符合驼峰命名法的字符串,或者是以 .or..开头的相对路径(一般用相对路径)、或者绝对路径。
- 模块的定义十分简单,接口也十分简洁。每个模块具有独立的空间,它们互不干扰,在引用时也显得干净利落。
模块又分成两大类:
1 核心模染
- 由node引擎提供的模染 或者npm下的模块
- 核心模染的标识就是模块的名字,用法require(****'fs'****)
2 文件模块
- 由用户自己创建的模块,用户require(****'./util'****)
export和module
exports是exports.module的引用
exports.a=a1
exporrs.b=b1
等价于
exports.module={a:a1,b:b1}
什么是包
通过npm init 命令可以生成一个package.json文件。这个文件是 整个项目的描述文件。通过这个文件可以清楚的知道项目的包依赖关系,版本,作者等信息。每个NPM包都有自己的package.json文件,使用这个命令将需要填写项目名,版本号,作者等信息。
执行
npm init -y
这样将会使用默认值生成package.json文件
就是个文件 增强的模块 压缩文件 把一些方便再次使用的时候下载直接使用的比如方法
包结构:
实际就是一个压缩文件,解压以后还原为目录。package.json必有
可选目录 lib bin doc test
包描述文件:package.json 放在包的根目录下 ,内容不能有注释
必填字段:name version
那package-lock.json 又是什么?
npm简介
包管理工具
npm search 包名
npm -v
npm remove
npm install math --save
目录node_modules
npm init
npm install math
var math=require('math')
-g用得少
--save
-dev
--save 会把依赖信息写入package.json的dependencies
当你的项目依赖很多包的时候 ,在上传代码的时候, 再上传node_modules的时候体量就变大了,
这个时候我们的package.json就起作用了。只需要在本地拉完你的项目时,使用者直接在
npm install
的时候就会根据里面的dependencies从npm上下载。而且还能保证npm上的包是实时更新了的
11. npm配置
淘宝镜像官网
npm服务器在国外,当你下载比较大的包时候。远,大,需要fq的时候。或者比如有人攻击npm的时候发很多很多轻请求的时候,npm就不稳定了。
创建一个 镜像服务器 (中国的服务器一个人去把npm服务器的东西下载)
镜像服务器: 为保证最新 每10分钟会去npm服务器去下载更新
配置镜像:
方法1
npm config set registry https://registry.npm.taobao.org 设置taobao源
npm config get registry 查看设置
方法2
npm install -g nrm
nrm use taobao
nrm ls 查看淘宝站点镜像之外还有其他的
建议不要用cnpm
12. node搜索包的流程
本级目录→上级→上级→根目录比如c盘(即使别的比如d盘有也不行)
有就马上用,没有就报错
13 Buffer缓冲区
当成数组 弥补数组的不足
用来存储二进制数据,比如图片等,传统的数组不行
Buffer是nodejs的核心对象。使用时 不需要引入 直接使用
var buf=Buffer.from('hello')
Buffer 68 65 6c....显示的是16进制(对应的hello中h e l l o的每个字母的Unicode编码),UTF-8转换工具
范围的00-FF,也就是00000000-11111111
但是为什么说Buffer是存的二进制呢?原因是在计算机存储机制中二进制太长了。都是以16进制来存储的
var buf1=new Buffer(10) //创建一个10个字节的buffer
等所有Buffer的构建函数方法 都已经被弃用,过期了
通过使用
alloc 分配
中最后一句会报错。
因为Buffer不像数组可以自增长度。在创建的时候长度就确定了。
实质上是因为,Buffer实际上是对底层内存的直接操作,分配了长度为10的连续空间,
当你需要在扩充长度的时候,就不能再保存后面连续的内存存在了
14 同步文件写入
文件系统file system
- 简单的来说就是通过Node来操作系统中的文件
- 使用是需要先引入fs模块,fs是核心模块不需要下载,但也需要引入 const fs=require('fs')
- 使用文件系统
- 所有操作有同步(会阻塞程序的运行)和异步两种形式可供选择
同步文件写入
操作步骤: 打开→ 写入→关闭
注意:不关闭 服务器就是一起开着的 会一直占用着内存 就像百度服务器 你不关就一直关的
const fs = require('fs'); var zds=fs.openSync('/文件.txt', 'w') //zds 是open之后的返回的对文件的描述符 //flags打开要做操作的类型:r只读 w可写 fs.writeSync(zds,'今天是周日,天气不错哦') //写 fs.closeSycn(zds) //关闭