最近没事,学习了一下 node,仅仅是看看api,总是看了又忘,效率着实低下。

觉得 http-server 这个静态服务很神奇,突发奇想,自己也来实现这么一个静态服务试试。顺便巩固一下之前看过的API。暂且起名为 ks-server。

主要用到了node中的 http、fs、url、path、zlib、os等常用模块。

1. 初始化项目:

cd ks-server # cd 到我的项目中
yarn init -y

2. 将命令映射成全局命令

A、首先在 ks-server 根目录下新建 src 文件夹,再新建一个 bin/www.js 文件。

#! /usr/bin/env node
// 上面这句话,告诉命令行,我要用 node 环境来执行 www.js 这个文件
// www.js 文件
console.log('hello');

B、将如下代码添加到 package.json 中。

"bin": {
"ks-server": ".src/bin/www.js"
}

C、将 ks-server 命令映射成全局命令

npm link # 注意这个命令是在当前目录 ks-server 下运行的

出现 如下日志即表示成功!

3. 命令行参数处理

用 process.argv 来自己去解析命令行中的参数。但是我们在这儿用 commander 这个包来做参数处理。修改 www.js 文件为如下内容,测试 commander 包。

#! /usr/bin/env node

// www.js
const commander = require('commander');
const package = require('../package.json'); // 设置一个默认的值
let parser = {
port: 10086,
host: 'localhost',
dir: process.cwd() // 1. 为什么不能用 __dirname
}
// 监听一个 --help 事件,当用户输入 `ks-server --help` 时,会将一下内容追加到显示的后面。
// 这个绑定事件得放在 声明 argvs 之前
commander.on('--help', function () {
console.log("Usage:")
console.log(" ks-server -p 10086 --host localhost")
})
let argvs = commander
.version(package.version)
.option('-p,--port', 'server port')
.option('-o,--host', 'server hostname')
.option('-d,--dir', 'server dir')
.parse(process.argv); parser = { ...parser, ...argvs };
  1. 注意最后的 .parse(process.argv) 是不能少的。
  2. 绑定事件得放在声明 argvs 之前
  3. 事件绑定时,事件名不能是-h, --help,-h
解惑
  1. 为什么不能用 __dirname?

    __dirname 为当前被执行的js所在目录; process.cwd() 当前node命令所在的目录

4. 起一个静态服务

在 ks-server 目录下新建一个 server/index.js 文件。

const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path'); // 第三方模块
const mime = require('mime');
const chalk = require('chalk'); // 粉笔
const debug = console.log;
const ejs = require('ejs'); // 模板 ejs、jade、handlebar

5. 实现逻辑

本来是想把代码贴过来的,发现也挺累的,还不如放到 github 上合适。/捂脸

https://github.com/MobroChu/ks-server

顺便给颗星星激励一下奋战在坚持与放弃边界线的菜鸟。项目有结构有所调整,es6诚然方便,单考虑到低版本node兼容性、低版本浏览器兼容行,故使用babel将es6语法解析成es5,并置于dist文件夹下。

6. 目录结构

目录在原有基础进行过优化,现在目录结构及其功能如下:

|-- dist 			// 打包后的代码
|-- bin // 命令解析相关文件
|-- www.js // 命令解析
|-- server // 静态服务
|-- server.js // 静态服务类文件
|-- node_modules // npm包
|-- src // es6 代码
|-- bin
|-- www.js
|--- server
|-- server.js
|-- static // 公共静态资源
|-- font // 字体图标
|-- logo // logo 图标
|-- template // 渲染模板
|-- template.html
|-- template.css
|-- template.js
|-- .babelrc
|-- .gitignore
|-- .npmignore
|-- package-lock.json
|-- package.json
|-- readme.md
|-- yarn.lock

你可知这百年爱人只能陪半途。 你且迷这风浪永远二十赶朝暮。 一一 记昨日书

实现一个类似 http-server 的静态服务 一一 ks-server的更多相关文章

  1. 如何使用 aph-cli 搭建本地静态开发环境(server + proxy + mock)

    前提资源 1.aph系统使用说明 2.aph-cli 使用说明 ================================== 一.如何使用aph-cli简单起一个服务 1.在APH管理系统注册 ...

  2. crtmp Server 开启rtsp服务功能

    Crtmp Server 包含了rtsp 服务功能,如果需要一个简单轻量的rtsp服务,Crtmp Server会是不错的选择. 默认情况下,rtsp功能是关闭的,需要在配置文件中打开.window环 ...

  3. (转)Nginx静态服务配置---详解root和alias指令

    Nginx静态服务配置---详解root和alias指令 原文:https://www.jianshu.com/p/4be0d5882ec5 静态文件 Nginx以其高性能著称,常用与做前端反向代理服 ...

  4. Nginx静态服务配置---详解root和alias指令

    Nginx静态服务配置---详解root和alias指令 静态文件 Nginx以其高性能著称,常用与做前端反向代理服务器.同时nginx也是一个高性能的静态文件服务器.通常都会把应用的静态文件使用ng ...

  5. 使用plupload做一个类似qq邮箱附件上传的效果

    公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...

  6. [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe

    写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...

  7. Ubuntu Server搭建svn服务以及迁移方法【转】

    转自:http://www.linuxidc.com/Linux/2013-05/84693.htm Ubuntu Server搭建svn服务以及迁移方法 采用apache+svn,http访问方式. ...

  8. Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目

    http://www.cnblogs.com/xiaocen/p/3736095.html amoeba实现mysql读写分离 application  shang  2年前 (2013-03-28) ...

  9. HTTPS静态服务搭建过程详解

    HTTPS服务对于一个前端开发者来说是一个天天打招呼的老伙计了,但是之前我跟HTTPS打交道的场景一直是抓包,自己没有亲自搭建过HTTPS服务,对HTTPS的底层知识也是一知半解.最近正好遇到一个用户 ...

随机推荐

  1. Redis Sentinel实现的机制与原理详解

    序言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案.实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署. 它的主要功能有以 ...

  2. python 1-100的数相加的和

    count = 1 sum = 0 while count <= 100: sum = sum + count count = count + 1 print(sum) 解释: count表示计 ...

  3. [svc]tcp三次握手四次挥手&tcp的11种状态(半连接)&tcp的time-wait

    TCP的状态转化过程(11种状态)以及TIME_WAIT状态 高性能网络 | 你所不知道的TIME_WAIT和CLOSE_WAIT 我相信很多都遇到过这个问题.一旦有用户在喊:网络变慢了.第一件事情就 ...

  4. LeetCode 5 最长对称串

    LeetCode 5 最长对称串 最早时候做这道题的时候还是用Java写的,用的是字符串匹配的思路,一直Time Limit Exceeded.甚至还想过用KMP开优化子串查找. public cla ...

  5. Nginx配置不当可能导致的安全问题

    Nginx配置不当可能导致的安全问题 Auther: Spark1e目前很多网站使用了nginx或者tenginx(淘宝基于Nginx研发的web服务器)来做反向代理和静态服务器,ningx的配置文件 ...

  6. Oracle 12.2报错ORA-15032、ORA-15410或ORA-15411解决

    现象:在Oracle 12.2.0.1 RAC环境,在其ASM实例中,如果添加不同大小或者不同数量的LUN到failgroup中,会报错: ORA-15032: not all alterations ...

  7. Angular5入门与搭建项目

    步骤 1. 设置开发环境 在开始工作之前,你必须设置好开发环境. 如果你的电脑里没有 Node.js®和 npm,请安装它们. 请先在终端/控制台窗口中运行命令 node -v 和 npm -v, 来 ...

  8. windows程序设计 Unicode和多字节之间转换

    Unicode转多字节:WideCharToMultiByte 多字节转Unicode:MultiByteToWideChar 代码演示 #include <windows.h> int ...

  9. 对于Java Bean的类型转换问题()使用 org.apache.commons.beanutils.ConvertUtils)

    在进行与数据库的交互过程中,由数据库查询到的数据放在 map 中,由 map 到 JavaBean 的过程中可以使用 BeanUtils.populate(map,bean)来进行转换 这里要处理的问 ...

  10. 论文速读(Jiaming Liu——【2019】Detecting Text in the Wild with Deep Character Embedding Network )

    Jiaming Liu--[2019]Detecting Text in the Wild with Deep Character Embedding Network 论文 Jiaming Liu-- ...