美文网首页
Node.js 从0到1全面解读

Node.js 从0到1全面解读

作者: 张德瘦嬢嬢 | 来源:发表于2020-12-23 17:25 被阅读0次

    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

    同步文件写入

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

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

    <pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">const fs = require('fs'); var zds=fs.openSync('/文件.txt', 'w') //zds 是open之后的返回的对文件的描述符 //flags打开要做操作的类型:r只读 w可写 fs.writeSync(zds,'今天是周日,天气不错哦') //写 fs.closeSycn(zds) //关闭</pre>

    异步文件写入

    简单文件写入

    流式文件写入

    fs模块的其他用法

    相关文章

      网友评论

          本文标题:Node.js 从0到1全面解读

          本文链接:https://www.haomeiwen.com/subject/fdvknktx.html