Node学习--Http模块
Http模块Web服务器当应用程序(客户端)需要某一个资源时,可以向一个台服务器,通过Http请求获取到这个资源;提供资源的这个服务器,就是一个Web服务器;
有很多开源的Web服务器:Nginx、Apache(静态)、Apache Tomcat(静态、动态)、Node.js
创建Web服务器1234567891011const http = require('http');//创建一个web服务器const server = http.createServer((request,response)=>{ console.log('服务器中处理函数被调用'); response.end("Hello Server")})//启动服务器 并且指定端口号和主机server.listen(8000,'0.0.0.0',()=>{ console.log("服务器启动成功");})
使用nodemon工具可以实施实 ...
Node学习-Stream
Stream流 (Stream)___流:
是连续字节的一种表现形式和抽象概念
流应该是可读的,也是可写的
我们之前可以通过readFile或者write File的方式读写文件 为什么还需要流?
因为直接读写文件的方式,虽然简单,但是无法控制一些细节的操作
比如从什么位置开始读、读到什么位置、一次性读取多少个字节
读到某个位置后,暂停读取,某个时刻恢复读取等等;
或者这个文件非常大,比如一个视频文件,一次性全部读取并不合适;
文件读写的Stream事实上Node中很多对象是基于流实现的:
http模块的Request和Response对象;
process.stdout对象;
所有的流都是EventEmitter的实例
Node.js中有四种基本流类型:
Writable:可以向其写入数据的流(例如 fs.createWriteStream())。
Readable:可以从中读取数据的流(例如 fs.createReadStream())。
Duplex:同时为Readable和的流Writable(例如 net.Socket)。
Transform:Duple ...
Node学习-事件循环和异步IO
事件循环和异步IO事件循环___事件循环:编写的JavaScript代码和浏览器或者Node之间的桥梁
进程和线程进程计算机当中已经运行的程序
在计算机里启动一个应用程序默认就会由操作系统开启新的进程(可能是多个进程)
可以说进程是线程的容器
线程操作系统能够运行运算调度的最小单元
每一个进程中,都会启动一个线程用来执行程序中的代码,这个线程被称之为主线程
多进程多线程开发操作系统是如何做到同时让多个进程(边听歌、边写代码、边查阅资料)同时工作呢?
这是因为CPU的运算速度非常快,它可以快速的在多个进程之间迅速的切换;
当我们的进程中的线程获取获取到时间片时,就可以快速执行我们编写的代码;
对于用户来说是感受不到这种快速的切换的;
浏览器 JSJavaScript的进程有自己的容器进程:浏览器或者Node
浏览器是多进程的 每个进程中又有很多线程 包括JavaScript代码的线程
JavaScript的代码执行是在一个单独的线程中执行的:
意味着JavaScript的代码,在同一个时刻只能做一件事
如果这件事是非常耗时的,就意味着当前的线程就会被阻塞
Ja ...
Node学习-Buffer的使用
Buffer的使用___http://nodejs.cn/api/buffer.html
数据的二进制___计算机中所有的内容:文字、数字、图片、音频、视频最终都会使用二进制来表示
___JavaScript可以直接去处理非常直观的数据:比如字符串,我们通常展示给用户的也是这些内容
用JavaScript表示二进制是很麻烦的
在网页端,图片我们一直是交给浏览器来处理的
JavaScript或者HTML,只是负责告诉浏览器一个图片的地址;
浏览器负责获取这个图片,并且最终讲这个图片渲染出来
但是在服务器是不一样的:
服务器要处理很多本地文件类型
比如在Node中通过TCP建立长连接,TCP传输的是字节流,我们需要将数据转成字节再进行传入,并且需要知道传输字节的大小(客服端需要根据大小来判断读取多少内容);
比如我们需要读取的是一张图片数据(二进制),再通过某些手段对图片数据进行二次的处理(裁剪、格式转换、旋转、添加滤镜),Node中有一个Sharp的库,就是读取图片或者传入图片的Buffer对其再进行处理;
Buffer和二进制前端开发一般不处理二进制 但是在服务器端要实 ...
Node踩坑记录
Node路漫漫 踩坑家常饭该帖记录一下学习node踩到的坑 ,可能都是一些小问题但是浪费很长时间,为了防止以后遇到,也希望如果真的有人能看到的话会节省时间 故开此帖
空格引发的血案11月1日10:30~11月2日0:00
再写一条新的指令hype addpage时 因为要设置文件存放路径 写了一个方法 但是在运行 hype addpage hyp -d source/aaa/bbb指令时,发现并不会创建source文件夹(source文件夹是不存在的),封装的方法的话是没有问题的,是可以创建这个新的路径 , 经过与老师的代码再三对比 依然没有发现问题并且解决
在最后我想到了 我在program中增加了自己的option 重头戏来了
program.option('-d --dest <dest>', 'a destination folder,例如:-d /src/components')
千万千万要在dest后面加上空格 血的教训
谨记.
Node学习-开发脚手架工具
脚手架工具开发项目创建初步创建
创建index.js
编写一些简单代码
创建package.json
npm init -y
创建hype 命令
入口文件中,添加如下指令(shebang也称为hashbang)
#!/usr/bin/env node
根据配置环境执行当前文件
修改package.json
123"bin":{ "hype":"index.js"}
npm link
Commander的使用
npm install commander
1234567const program = require('commander')//查看版本号program.version(require('./package.json').version)//解析终端指令program.parse(process.argv)
1234567891011121314//添加自己的optionconst program = require(& ...
Node学习-包管理工具
包管理工具包管理工具npm(Node Package Manager)https://www.npmjs.com/
npm管理的包存放在:
我们发布自己的包是发布到registry上面
当我们安装一个包时其实是从registry上面下载的包;
项目配置文件事实上,我们每一个项目都会有一个对应的配置文件,无论是前端项目还是后端项目:
这个配置文件会记录着你项目的名称、版本号、项目描述等
也会记录着你项目所依赖的其他库的信息和依赖库的版本号
这个配置文件就叫做package.json
npm init #创建时填写信息 npm init -y # 所有信息使用默认的
常见的属性必须填写的
name是项目的名称
version是当前项目的版本号;
description是描述信息,很多时候是作为项目的基本描述;
author是作者相关信息(发布时用到)
license是开源协议(发布时用到)
private属性
private属性记录当前的项目是否是私有的
当值为true时,npm是不能发布它的,这是防止私有项目或模块发布出去的方式
main属性
设置程 ...
Node学习-内置模块
Node内置模块内置模块path
在mac linux window上的路径是不一样的
path模块可以屏蔽它们之间的差异。
从路径中获取信息
dirname:获取文件的父文件夹
basename:获取文件名
extname:获取文件扩展名
路径的拼接
path.join
将多个路径进行拼接,但是不同的操作系统可能使用的是不同的分隔符
path.resolve
如果是将某个文件和文件夹拼接,可以使用 path.resolve;
resolve会判断拼接的路径字符串中 是否有以/ ./或 ../开头的路径
如果有表示是一个绝对路径,会返回对应的拼接路径
如果没有,那么会和当前执行文件所在的文件夹进行路径的拼接
内置模块fsfs是file system的缩写 表示文件系统
fs的APIhttps://nodejs.org/dist/latest-v14.x/docs/api/fs.html
大多数有三种操作方式:
同步操作文件
异步回调函数操作文件
异步Promise操作文件
案例:
12345678910111213141516171819202122232425 ...
Node学习-模块化
Javascript模块化模块化开发
将程序划分成一个个小的结构
这个结构中编写属于自己的逻辑代码,有自己的作用域 不会影响其他的结构
这个结构可以将自己希望暴露的变量 函数 对象 等导出给其结构使用
也可以导入另外结构中的变量 函数 对象
按照结构划分开发程序的过程 就是模块化开发的过程
Js被称之为是披着C语言外衣的Lisp(用于人工智能)
早期JS存在的缺陷:
比如var 定义的变量作用域问题
JS的面向对象并不能像常规面向对象语言一样使用class
Js没有模块化
在ES6之前 为了让js支持模块化 涌现出了很多不同的模块化规范:AMD CMD CommonJS等
没有模块化带来问题命名冲突
通过立即执行函数可以解决问题,但是存在缺点
第一,我必须记得每一个模块中返回对象的命名,才能在其他模块使用过程中正确的使用
第二,代码写起来很混乱,每个文件中的代码都需要包裹在一个匿名函数中来编写
第三,在没有合适的规范情况下,每个人、每个公司都可能会任意命名、甚至出现模块名称相同的情况
CommonJS 和NodeCommonJS是一个规范 最初提出来是在浏览器以外的 ...
Node学习-经典邂逅
什么是Node-Node.js是一个基于V8 JavaScript引擎的Javascript运行时环境
浏览器内核
不同浏览器有不同内核组成
Gecko
Trident
Webkit
Blink :Webkit 的一个分支
浏览器内核是浏览器的排版引擎
排版引擎也称为浏览器引擎,页面渲染引擎,或者样版引擎
渲染引擎工作过程
JavaScript引擎在编写js时 无论交给浏览器或者Node执行,最后都是需要被CPU执行, CPU只认是自己的指令集, 实际上是机器语言才能被CPU所执行 所以需要Js引擎帮助我们将JS代码翻译成CPU指令来执行
常见的JS引擎
SpiderMonkey 第一款 Js作者开发
Chakra 微软
JavaScriptCore Webkit中的Js引擎 apple
V8 Google Chrome
Webkit内核由两部分组成
WebCore:负责HTML解析 布局 渲染等相关工作
JavaScriptCore : 解析执行JS代码
V8引擎
V8是用C++编写的Google开源高性能JS和WebAssembly引擎,用 于Chro ...