分类 web 下的文章

上一章节我们了解了如果访问文件系统。使用到了 fs 和 path 模块的部分功能,下面我们详细了解这两个模块可以实现的功能。

fs module

通过以上几个使用场景可以看到 fs 模块提供了很多有用的功能来对 file system 进行访问和交互。并且他是集成在 node.js core 中的,并不需要手动安装:

const fs = require('fs')

- 阅读剩余部分 -

File descriptor 文件描述器

当需要访问文件系统里的某个文件时,需要首先得到这个文件的 file descriptor 文件描述器。

一个 file descriptor 就是通过 fs 模块的 open() method 打开对应文件的返回数据。它的结构如下:

const fs = require('fs')

fs.open('./test.txt', 'r', (err, data) => {
    if (err) {
        console.log('open fail')
        return
    }
    console.log('open success')
})

如果文件打开成功,callback 中的 data 数据就是一个 file descriptor。注意并不是文件的内容。

这种方式是异步处理的,文件打开过程中系统会执行其他任务。

- 阅读剩余部分 -

由于 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 中,编程中要注意到这一点,防止进程阻塞。

- 阅读剩余部分 -