由于 node.js 在 Windows 下会有各种问题,最好的开发环境还是 Linux,所以我通过 VMware 内安装 Ubuntu 虚拟机的方式学习 node.js。

我的流程是:

  • VMware 安装 Ubuntu
  • 共享 Windows 下的文件夹给 Ubuntu 作为开发目录
  • Windows 下使用 vs code 通过 ssh 方式远程连接 Ubuntu

通过远程连接的方式在 Windows 下做 node.js 开发实际体验很好。但是在通过 npm 安装某些包时常常会有报错出现,错误日志大概意思就是说无法给 node_modules 文件夹内安装的库文件添加软连接到系统路径。

网上查询后发现了问题原因,我的开发目录实际是在 Windows 下的,Windows 和 Linux 有着不一样的文件系统和路径格式,所以 npm 在安装某些包含 bin 可执行文件的第三方库时,会默认自动创建相关文件的软链接到 Linux 系统路径,这样就就报错了。

如果要坚持使用共享目录的形式做开发,那么需要设置在 npm 安装新库时使用参数 --no-bin-links 告诉系统不要自动创建软连接,语法如下:

npm install cowsay --no-bin-links

这样就会跳过相关步骤。

也可以设置到 npm 配置中,这样以后安装的包都会默认不创建 bin 的软连接了:

npm config set bin-links false

当然最理想的方式就是将开发路径放置在 Linux 系统中,而不是通过共享目录的形式。这样就是一个纯原生的环境。

参考链接:https://github.com/npm/npm/issues/2221


搭建 http server

下面是一个 http server 的示例:

const http = require('http')
process.env.PORT = 3000
const port = process.env.PORT

const server = http.createServer((req, res) => {
    res.statusCode = 200
    res.setHeader('Content-Type', 'text/html')
    res.end('<h1>hello world</h1>')
})
server.listen(port, () => console.log(`server running at port ${port}`))

访问 http://localhost:3000 就会看到页面显示 hello world

阅读全文


Event Loop 事件循环

event loop 是我们学习 node.js 中最重要的方面之一。因为它解释了 node.js 如何进行异步动作,同时不会出现 IO 阻塞问题。这也是 node.js 能够变得如此流行的原因之一。

node.js 代码运行在单进程中,也就是说它在一刻只能执行一个任务。这一限制特性使得我们不用担心任务间冲突问题。我们在变开发中只需要专注于代码本身,同时应避免进程阻塞,例如同步方式等待网络请求,死循环等。

通常情况下,浏览器中的每个 tab 页面都是都有各自独立的 event loop,防止某个页面的死循环或过高的资源消耗影响到整个浏览器的体验。我们只需要关注于我们的代码运行在一个单一的 event loop 中,编程中要注意到这一点,防止进程阻塞。

阅读全文


最近研究了下 Windows 的共享设置,目的是在同一局域网下共享文件夹给其他设备读写。下面从原理和实际操作上介绍下共享过程。

SMB

Windows 共享使用 Server Message Block (SMB) 协议,它可以让应用程序访问本机网络下的其他设备的文件及服务。

SMB 是 IBM 在 1980 年代创造的协议,目前已经有了很多的升级及分支。

SMB 协议允许应用程序访问远程主机的文件和资源如打印机等,也可以同远程主机上设置了接收 SMB 协议的应用程序通信。它运行在网络的 layer 7 层,也就是 application 应用层,使用 TCP/IP 的 445 端口传输数据。

从 Windows 95 开始,微软将引入了 SMB 协议的支持。Linux 端,samba 作为一个开源软件提供 SMB 的支持。

阅读全文


Microsoft store 里都是 UWP 应用,运行在被称为 App Container 的虚拟沙箱环境中,其安全性及纯净度远胜于传统的 EXE 应用。但 App Container 机制同时也阻止了网络流量发送到本机(即 loopback), 使大部分网络抓包调试工具无法对 UWP 应用进行流量分析。该机制也阻止了 UWP 应用访问 localhost,如果你的代理地址在本地地址,UWP 就无法访问。

有两种方法来解除某个 UWP 应用的沙盒隔离,一种是使用系统自带的工具 CheckNetIsolation,一种是使用第三方工具 fiddler

CheckNetIsolation

Windows 10 自带了一个 CheckNetIsolation 工具,可以解除 UWP 应用的网络隔离,使之可以正常访问本地地址在终端执行以下指令即可:

CheckNetIsolation.exe loopbackexempt -a -p=SID

SID(security identifier) 是每个 UWP 应用独有的识别码,可以从注册表中获得应用的 SID 码。

阅读全文