前言

上一篇文章我们介绍了 http-server 的基本使用,本篇文章我们将介绍如何使用 nodejs 实现 http-server 的基本功能

实现目标

  1. 可以正常开启静态服务器并访问资源
  2. 可以通过命令行脚本命令调用
  3. 可以通过命令行参数设置端口号等

实现思路与步骤

先从第一个目标开始,我们要开启一个静态资源服务器的话,可以使用 express 框架,帮助我们快速启动一个服务器,然后 express 还提供了一个 static 方法来配置静态资源

使用这个方法我们可以快速启动一台静态资源服务器

接下来要实现的就是如何使用控制台命令的方式快速启动服务器了

这个可以使用一个 commander 这个库来实现,然后需要在你的文件顶部添加以下代码来提示终端运行这个文件使用 nodejs

因为我们是使用 js 编写的文件,所以得需要一个能运行 js 的环境来运行

在文件顶部添加以下代码

1
#!/usr/bin/env node

由于代码比较简单,这里就直接给出了完整的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env node
import express from "express";
import { program } from "commander";
import fs from "node:fs";
import { fileURLToPath } from "node:url";
import os from "node:os";
import chalk from "chalk";

// 获取package.json文件中的版本号
const packageJsonPath = new URL("../package.json", import.meta.url);
const packageJson = JSON.parse(
fs.readFileSync(fileURLToPath(packageJsonPath), "utf-8")
);

program
.version(packageJson.version, "-v --version", "输出当前工具版本号")
.description(
`一个基于express封装的快速启动http服务的工具,主要用于启动一个简单的静态资源服务器用于测试开发使用,开发者为✨星凪✨
使用格式为 xz-server [workPath] [options]
`
);

// 定义帮助命令
program.helpOption("-h --help", "输出帮助信息");
program.option("-p --port <port>", "指定端口号,默认为3000");
program.option(
"-w, --work-path <path>",
"指定工作目录,默认为执行命令的当前目录"
);

program.action(async (options) => {
try {
const app = express();
const option = {
port: 3000,
workPath: "./",
proxy: "",
headers: null,
version: packageJson.version,
};
let { port, workPath } = options;
if (!port) {
option.port = 3000;
}
if (options.headers) {
option.headers = options.headers;
}
workPath && (option.workPath = workPath);
if (program.args.length === 1) {
workPath = program.args[0];
}
app.use(express.static(option.workPath));
app.listen(option.port, () => {
console.log(chalk.cyan("欢迎使用✨星凪工具✨\n"));
console.log(chalk.yellow("当前使用版本为: " + option.version + "\n"));
console.log("成功启动http服务, 工作目录为: " + option.workPath + "\n");
// console.log("当前http服务参数预览: ");
console.log("可通过以下地址访问当前服务: ");
const ifaces = os.networkInterfaces();
Object.keys(ifaces).forEach(function (dev) {
ifaces[dev].forEach(function (details) {
if (details.family === "IPv4") {
console.log(
chalk.greenBright(
" http://" + details.address + ":" + option.port
)
);
}
});
});
});
//设置允许跨域
app.use("*", (req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader(
"Access-Control-Allow-Headers",
"Content-Type, Authorization, X-Requested-With"
); // 允许特定的头部
res.setHeader(
"Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS"
); // 允许的方法
res.setHeader("Access-Control-Allow-Credentials", "true"); // 允许携带凭证
next();
});
} catch (error) {
console.log(error);
}
});

program.parse(process.argv);

代码比较少,简单来讲就是使用了 express 这个的 static 函数配置了一个静态资源目录,然后 express 本身就可以启动一台资源服务器,那么我们要考虑的就是如何启动这个服务器,然后这个是使用 commander 这个库进行解决

然后就是怎么将命令添加到你的环境变量,这个我前期的文章有详细说明过,这里就不在赘述了

给出对应文章的链接

链接

然后找一个拥有静态资源的文件夹,在该文件夹下运行命令就可以了