副标题[/!--empirenews.page--]
简介
本文介绍了一个简单的静态资源服务器的实例项目,希望能给Node.js初学者带来帮助。项目涉及到http、fs、url、path、zlib、process、child_process等模块,涵盖大量常用api;还包括了基于http协议的缓存策略选取、gzip压缩优化等;最终我们会发布到npm上,做成一个可以全局安装、使用的小工具。麻雀虽小,五脏俱全,一想是不是还有点小激动?话不多说,放码过来。
文中源码地址在最后附录中。
可先行体验项目效果:
安装:npm i -g here11
任意文件夹地址输入命令:here
step1 新建项目
因为我们要发布到npm上,所以我们先按照国际惯例,npm init,走你!在命令行可以一路回车,有些配置会在最后的发布步骤中细说。
目录结构如下:
![Node.js新手上路——动手撸一个静态资源服务器](http://developer.51cto.com/art/201903/https:/s5.51cto.com/oss/201903/15/a4968deb2064a194a20cea4334d0ef83.png-wh_651x-s_1934839391.png)
bin文件夹存放我们的执行代码,web作为一个测试文件夹,里面放了些网页。
step2 码码
step2.1 雏形
静态资源服务器,通俗讲就是我们在浏览器地址栏输入形如“http://域名/test/index.html”的一个地址,服务器从根目录下的对应文件夹找到index.html,读出文件内容并返回给浏览器,浏览器渲染给用户。
- const http = require("http");
- const url = require("url");
- const fs = require("fs");
- const path = require("path");
- const item = (name, parentPath) => {
- let path = parentPath = `${parentPath}/${name}`.slice(1);
- return `<div><a href="${path}">${name}</a></div>`;
- }
- const list = (arr, parentPath) => {
- return arr.map(name => item(name, parentPath)).join("");
- }
- const server = http.createServer((req, res) => {
- let _path = url.parse(req.url).pathname;//去掉search
- let parentPath = _path;
- _path = path.join(__dirname, _path);
- try {
- //拿到路径所对应的文件描述对象
- let stats = fs.statSync(_path);
- if (stats.isFile()) {
- //是文件,返回文件内容
- let file = fs.readFileSync(_path);
- res.end(file);
- } else if (stats.isDirectory()) {
- //是目录,返回目录列表,让用户可以继续点击
- let dirArray = fs.readdirSync(_path);
- res.end(list(dirArray, parentPath));
- } else {
- res.end();
- }
- } catch (err) {
- res.writeHead(404, "Not Found");
- res.end();
- }
- });
- const port = 2234;
- const hostname = "127.0.0.1";
- server.listen(port, hostname, () => {
- console.log(`server is running on http://${hostname}:${port}`);
- });
以上这段code就是我们的核心代码了,已经实现了核心功能,本地运行即可看到返回了文件目录,点击文件名便可浏览对应的网页、图片、文本啦。
step2.2 优化
功能实现了,但是我们可以在某些方面做做优化,提升实用性,顺便多学习几个api(装逼技巧)。
1. stream
(编辑:衡阳站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|