概述
本文通过用 Node.js 实现一个 web 静态服务器来深入学习 node 和 http 相关知识。第一部分实现一个最基本的 web 静态服务器,第二部分实现一个含有缓存、压缩、命令行等功能的一个 web 静态服务器。
详述
基础实现
1 | const http = require('http'); |
使用 http 模块实例一个 server 对象,用 path 模块处理路径,用 fs 模块进行文件的 I/O 操作,用 url 模块对 URL 处理,用 mime 模块处理文件类型。
实现的时候遇到一个坑,测试时字体图标一直不显示:
最后才发现原来是样式文件中定义@font-face
时引用的字体带了查询信息,直接用req.url
拼接的文件路径也是带版本号等查询信息的,而 fs 模块读取文件是完全匹配,因此读取不到该字体文件。处理的思路就是去掉查询信息,代码中给出了两种实现方法。
进阶实现
这个网上有篇深入 nodejs-搭建静态服务器(实现命令行)讲的很详细,这里只摘录其中主体代码,然后着重说下其中涉及到的知识点,但是原文没有说明的部分。
1 | // app.js |
像url.parse()
、fs.stat()
等都是标准的 node 内置模块 API,直接查官方文档就好。其他延展知识点有:
process.cwd()
与__dirname
区别
process.cwd()返回的是当前 Node.js 进程执行时的工作目录,保证了文件在不同的目录下执行时,路径始终不变。
__dirname 是当前模块的目录名,是当前被执行的 js 所在的目录。
Node 实现四种缓存
1 | const http = require('http'); |
/\bgzip\b/
中的\b
是什么
\b
表示字母数字与非字母数字的边界,非字母数字与字母数字的边界。其实就是一个位置匹配,就像开头^
,结尾$
。
自动启动默认浏览器
这里用了第三方模块open
,当然可以自己封装个:
1 | //打开默认浏览器 |
#!/usr/bin/env node
干嘛用的
指定用 node 来执行脚本文件。更多介绍
参考
https://edu.aliyun.com/lesson_1730_14108?spm=5176.10731542.0.0.7fe04a3e9HronY#_14108
https://segmentfault.com/a/1190000018101338