Node.js 从0到1全面解读

1 为什么是Node

命令行工具

  • win操作系统的
  • Powershell
  • git bash
  • cmder(博主在用&仅用的)
image.png

环境变量

环境变量的值就是路径。

环境变量就是比如,在我桌面员工hello.exe的程序。

配置环境变量之前:在命令行工具中我要打开hello.exe。首先我得需要在桌面目录下,如果有执行,没有就报错比如command not found。

配置环境变量之后:我们在任何目录(环境)下打开hello.exe,程序会首先在当然路径中到次文件,如果没有就在配置好的环境变量中,依次找次文件,

如何配置环境变量:

老规矩,图解

image.png

进程与线程概念

进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。可以理解为运行环境比如车间

线程:是操作系统能够进行运算调度的最小单位,可以理解为比如车间工人

打开任务管理器可看到

image.png

单线程与多线程

单线程:一次执行一个任务

  • Node的服务器单线程的
  • Node处理请求时是单线程,但是在后台拥有一个I/O线程池

多线程:可以同时执行多个任务,高并发 阻塞

  • 传统的服务器都是多线程的
  • 进来一个请求,就创建一个线程去处理请求

如此看来,是不是觉得多线程是更优的选择呢,快速高效。可以这么理解,多数程序比如Java就是多线程的。

但是多线程也会有弊端,比如Java在同时渲染页面的时有两种页面效果作用于一个元素,这时该如何处理?

nodejs是单线程的。

image.png
image.png

2 Nodejs简介

1 就是js运行平台

Nodejs不是web框架,不能与Spring或Nodejs对比

不是编程语言,不能与Python或者PHP

是一个平台:将多种技术组合起来 让js也能调用系统接口,开发后端应用

image.png

image.png

Nodejs工作流程

image.png

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
image.png

3 node的特点

4 nodejs执行js文件

image.png

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))

image.png

引入概念:模块标识

  • 模块标识其实就是模块的名字,也就是传递给requir()方法的参数
  • 它必须是符合驼峰命名法的字符串,或者是以 .or..开头的相对路径(一般用相对路径)、或者绝对路径。
  • 模块的定义十分简单,接口也十分简洁。每个模块具有独立的空间,它们互不干扰,在引用时也显得干净利落。

模块又分成两大类:

1 核心模染

  • 由node引擎提供的模染 或者npm下的模块
  • 核心模染的标识就是模块的名字,用法require(****'fs'****)

2 文件模块

  • 由用户自己创建的模块,用户require(****'./util'****)
image.png

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文件

就是个文件 增强的模块 压缩文件 把一些方便再次使用的时候下载直接使用的比如方法

image.png

包结构:

实际就是一个压缩文件,解压以后还原为目录。package.json必有

可选目录 lib bin doc test

包描述文件:package.json 放在包的根目录下 ,内容不能有注释

image.png
image.png

必填字段:name version

image.png

那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

image.png
image.png

--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缓冲区

当成数组 弥补数组的不足

用来存储二进制数据,比如图片等,传统的数组不行

image.png

Buffer是nodejs的核心对象。使用时 不需要引入 直接使用

var buf=Buffer.from('hello')

image.png

Buffer 68 65 6c....显示的是16进制(对应的hello中h e l l o的每个字母的Unicode编码),UTF-8转换工具

范围的00-FF,也就是00000000-11111111

image.png

但是为什么说Buffer是存的二进制呢?原因是在计算机存储机制中二进制太长了。都是以16进制来存储的

var buf1=new Buffer(10) //创建一个10个字节的buffer

等所有Buffer的构建函数方法 都已经被弃用,过期了

image.png

通过使用

alloc 分配

image.png
image.png
image.png

中最后一句会报错。

因为Buffer不像数组可以自增长度。在创建的时候长度就确定了。

实质上是因为,Buffer实际上是对底层内存的直接操作,分配了长度为10的连续空间,

当你需要在扩充长度的时候,就不能再保存后面连续的内存存在了

14 同步文件写入

文件系统file system

  • 简单的来说就是通过Node来操作系统中的文件
  • 使用是需要先引入fs模块,fs是核心模块不需要下载,但也需要引入 const fs=require('fs')
  • 使用文件系统
  • 所有操作有同步(会阻塞程序的运行)和异步两种形式可供选择
image.png

同步文件写入

操作步骤: 打开→ 写入→关闭

注意:不关闭 服务器就是一起开着的 会一直占用着内存 就像百度服务器 你不关就一直关的

const fs = require('fs'); var zds=fs.openSync('/文件.txt', 'w') //zds 是open之后的返回的对文件的描述符 //flags打开要做操作的类型:r只读 w可写 fs.writeSync(zds,'今天是周日,天气不错哦') //写 fs.closeSycn(zds) //关闭

异步文件写入

简单文件写入

流式文件写入

fs模块的其他用法

你可能感兴趣的:(Node.js 从0到1全面解读)