跳至主要內容
使用Node.js 实现网络代理(无框架,通过http-proxy)

使用Node.js 实现网络代理(无框架,通过http-proxy)

使用场景

使用场景自不必多说,包括正向代理、反向代理,在Node.js的特有场景中,其实还包含BFF,服务端中间件等等。如果你是在一个比Nginx更细粒度的,并且能够在框架内集成业务的场景,非常推荐继续阅读。

安装

npm install http-proxy

Yihui大约 2 分钟Node
横向对比 CJS 和 ES Module

横向对比 CJS 和 ES Module

模块化 🖥️

什么是模块化开发

模块化开发最终的目的是将程序划分成一个个小的结构。在这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构。结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用。也可以通过某种方式,导入另外结构中的变量、函数、对象等。

上面说提到的结构,就是模块,按照这种结构划分开发程序的过程,就是模块化开发的过程。


Yihui大约 4 分钟Node
Node 笔记(9)深入事件循环

Node 笔记(9)深入事件循环

阻塞IO和非阻塞IO

操作系统为我们提供了阻塞式调用和非阻塞式调用:

  • 阻塞式调用: 调用结果返回之前,当前线程处于阻塞态(阻塞态CPU是不会分配时间片的),调用线程只有 在得到调用结果之后才会继续执行。
  • 非阻塞式调用: 调用执行之后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可。

所以我们开发中的很多耗时操作,都可以基于这样的 非阻塞式调用:

  • 比如网络请求本身使用了Socket通信,而Socket本身提供了select模型,可以进行非阻塞方式的工作;
  • 比如文件读写的IO操作,我们可以使用操作系统提供的基于事件的回调机制;

Yihui大约 3 分钟Node
Node 笔记(8)Http模块

Node 笔记(8)Http模块

比较简单,直接上代码吧~

服务创建

const http = require('http');

// 创建一个web服务器
const server = http.createServer((req, res) => {
  res.end("Hello Server");
});

// 启动服务器,并且制定端口号和主机
server.listen(8888, '0.0.0.0', () => {
  console.log("服务器启动成功~");
});

Yihui大约 2 分钟Node
Node 笔记(6)Stream

Node 笔记(6)Stream

我们可以想象当我们从一个文件中读取数据时,文件的二进制(字节)数据会源源不断的被读取到我们程序中;

在之前学习文件的读写时,我们可以直接通过 readFile或者 writeFile方式读写文件,为什么还需要流呢?

  • 直接读写文件的方式,虽然简单,但是无法控制一些细节的操作;

  • 比如从什么位置开始读、读到什么位置、一次性读取多少个字节;

  • 读到某个位置后,暂停读取,某个时刻恢复读取等等(切片,断点);

  • 或者这个文件非常大,比如一个视频文件,一次性全部读取并不合适;


Yihui大约 3 分钟Node
Node 笔记(1)内核引擎

Node 笔记(1)内核引擎

Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境。

参照:

coderwhy - 深入Node.js技术栈

浏览器内核是什么?

我们经常会说:不同的浏览器有不同的内核组成

  • Gecko:早期被Netscape和Mozilla Firefox浏览器使用;
  • Trident:微软开发,被IE4~IE11浏览器使用,但是Edge浏览器已经转向Blink;
  • Webkit:苹果基于KHTML开发、开源的,用于Safari,Google Chrome之前也在使用;
  • Blink:是Webkit的一个分支,Google开发,目前应用于Google Chrome、Edge、Opera等;

Yihui大约 6 分钟Node
Node 笔记(2)模块化

Node 笔记(2)模块化

模块化

什么是模块化开发?

  • 事实上模块化开发最终的目的是将程序划分成一个个小的结构
  • 这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构;
  • 这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;
  • 也可以通过某种方式,导入另外结构中的变量、函数、对象等;

Yihui大约 8 分钟Node
Node 笔记(3)Node常用内置模块

Node 笔记(3)Node常用内置模块

内置模块path

path模块用于对路径和文件进行处理,提供了很多好用的方法。并且我们知道在Mac OS、Linux和window上的路径时不一样的,window上会使用 \或者 \ 来作为文件路径的分隔符,当然目前也支持 /,在Mac OS、Linux的Unix操作系统上使用 / 来作为文件路径的分隔符;

提供可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),

Linux和Mac OS都实现了POSIX接口,Window部分电脑实现了POSIX接口。


Yihui大约 6 分钟Node
Node 笔记(4)包管理工具

Node 笔记(4)包管理工具

如果我们分享给世界上所有的程序员使用,有哪些方式呢?

方式一:上传到GitHub上、其他程序员通过GitHub下载我们的代码手动的引用;

  • 缺点是大家必须知道你的代码GitHub的地址,并且从GitHub上手动下载;
  • 不需要使用的时候,需要手动来删除相关的依赖;
  • 当遇到版本升级或者切换时,需要重复上面的操作;

方式二:使用一个专业的工具来管理我们的代码

  • 我们通过工具将代码发布到特定的位置;
  • 其他程序员直接通过工具来安装、升级、删除我们的工具代码;

Yihui大约 5 分钟Node
2