@sheto/static
Version:
一个简单易用的前端静态网页运行工具库
184 lines (183 loc) • 6.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var proxy_1 = require("./proxy");
var logger_1 = require("./core/logger");
var types_1 = require("./types");
var http_1 = require("http");
var fs_1 = require("fs");
var path_1 = require("path");
var mime_1 = require("./core/mime");
// 常量
var DEFAULT_DIR = '.';
var DEFAULT_PATH = '/';
var DEFAULT_ENCODING = 'utf-8';
var DEFAULT_CONFIG = {
host: '127.0.0.1',
port: 80,
home: 'index.html',
dir: "".concat(DEFAULT_DIR).concat(DEFAULT_PATH)
};
var ProcessArgv = GetProcessArgv();
if (typeof ProcessArgv === 'function') {
ProcessArgv();
}
else {
/**
* @description 获取本地ip地址,当传递0.0.0.0时需要获取ip进行访问
*/
var GetLIP_1 = function () {
var networkInterfaces = require('os').networkInterfaces;
var networkInfo = networkInterfaces();
for (var _i = 0, _a = Object.keys(networkInfo); _i < _a.length; _i++) {
var name_1 = _a[_i];
for (var _b = 0, _c = networkInfo[name_1]; _b < _c.length; _b++) {
var iface = _c[_b];
if (iface.family === 'IPv4' && !iface.internal) {
return iface.address;
}
}
}
return 'localhost';
};
/**
*
* @param {*} _path
* @param {(_err: NodeJS.ErrnoException | null,_data: Buffer) => void} _$callback
*/
var ReadFilePlus_1 = function (_path, _$callback) {
var path = typeof _path === 'string' ? _path : DEFAULT_PATH;
// 处理空路径
if (path === DEFAULT_PATH) {
path = ProcessArgv.home;
}
// 正常流程
else {
path = "".concat(DEFAULT_CONFIG.dir).concat(path);
}
// 读取文件
(0, fs_1.readFile)(GetPath_1(path), function (_err, _data) { return _$callback(_err, _data, path); });
};
/**
* @nmae 主函数
* @param {IncomingMessage} _Req
* @param {ServerResponse} _Res
*/
var Request_1 = function (_Req, _Res) {
// 如果是一个api,则进行代理
// 前提要设置代理前缀才会进入请求代理检测
if ('prefix' in ProcessArgv && typeof ProcessArgv.prefix === 'string') {
if (new RegExp(ProcessArgv.prefix).test(_Req.url)) {
ServiceStatus_1.proxy(_Req, _Res);
return;
}
}
// 读取文件并响应
ReadFilePlus_1(_Req.url, function (_err, _data, _path) {
// 读取发生错误
if (_err) {
_Res.writeHead(404);
_Res.end();
}
// 正常响应
else {
// 响应统一配置
_Res.setHeader('Content-Type', "".concat(getType_1(_path), ";charset=").concat(DEFAULT_ENCODING));
_Res.end(_data);
}
});
};
/**
* @name 组合文件完整路径
* @param {string} _File
*/
var GetPath_1 = function (_File) {
var path = _File;
// 是否允许查询参数
if ('q' in ProcessArgv && ProcessArgv.q === 'false') {
path = NeedInquire_1(path);
}
// 如果为一个路径
if (/^\//.test(_File)) {
path = (0, path_1.normalize)("../".concat(path));
}
return (0, path_1.resolve)(process.cwd(), ProcessArgv.dir, path);
};
/**
* @name 查找文件的时候是否需要带上查询参数
* @param {string} _Path
*/
var NeedInquire_1 = function (_Path) {
if (/\?/.test(_Path)) {
_Path = _Path.split('?')[0];
}
return _Path;
};
var Station_1 = new http_1.Server(Request_1);
var ServiceStatus_1 = {
proxy: undefined,
static: undefined
};
// @ts-ignore
var getType_1 = new mime_1.Mime(types_1.default).getType;
Station_1.listen(ProcessArgv.port, ProcessArgv.host);
// 检测是否存在入口文件
ReadFilePlus_1(ProcessArgv.home, function (_err, _data) {
if (_err) {
logger_1.default.warn("\u672A\u8BFB\u53D6\u5230\u5165\u53E3\u6587\u4EF6\uFF0C\u8BF7\u68C0\u67E5\u8FD0\u884C\u76EE\u5F55".concat(ProcessArgv.dir, "\u662F\u5426\u5B58\u5728\u5165\u53E3\u6587\u4EF6").concat(ProcessArgv.home));
// 关闭服务
Station_1.close();
}
else {
var port = Number(ProcessArgv.port) === 80 ? '' : ":".concat(ProcessArgv.port);
var isOpen = parseFloat(ProcessArgv.host) === 0;
// 启动成功友情提示
logger_1.default.info("\u9759\u6001\u7F51\u7AD9\u542F\u52A8\u6210\u529F,\u8BBF\u95EE http://".concat(isOpen ? GetLIP_1() : ProcessArgv.host).concat(port, " \u8FDB\u884C\u67E5\u770B"));
if (isOpen) {
logger_1.default.info('同时你打开了外网访问权限,在局域网内可以通过ip进行访问');
}
// 消费buffer
_data.toString();
// 是否需要代理
if ('proxy' in ProcessArgv) {
ServiceStatus_1.proxy = (0, proxy_1.default)(ProcessArgv);
}
}
});
}
/**
* @name 获取运行参数
*/
function GetProcessArgv() {
var argv = process.argv;
if (argv.includes('-h')) {
return function () {
logger_1.default.info('host 访问地址配置');
logger_1.default.log(' --host 127.0.0.1 默认');
logger_1.default.log(' --host 0.0.0.0\n');
logger_1.default.info('port 访问端口配置');
logger_1.default.log('--port 80 默认');
logger_1.default.log('--port 等等...\n');
logger_1.default.info('home 入口文件配置');
logger_1.default.log('--home index.html 默认');
logger_1.default.log('--home 其他.html\n');
logger_1.default.info('dir 运行目录配置');
logger_1.default.log('--dir . 默认');
logger_1.default.log('--dir xx');
logger_1.default.log('--dir /xx/xx\n');
logger_1.default.info('proxy 运行目录配置');
logger_1.default.log('--proxy /api 默认 将/api请求代理到http://127.0.0.1');
logger_1.default.log('--proxy http://baidu.com/api 将/api请求代理到http://baidu.com');
logger_1.default.log('--proxy baidu.com/api 将/api请求代理到baidu.com\n');
};
}
var processArgv = {};
for (var i = 0; i < argv.length; i++) {
if (/^--/.test(argv[i])) {
var configName = argv[i].substring(2);
var nextArgv = argv[i + 1];
processArgv[configName] = typeof nextArgv === 'string' ? /^--/.test(nextArgv) ? DEFAULT_CONFIG[configName] : nextArgv : DEFAULT_CONFIG[configName];
}
}
return Object.assign({}, DEFAULT_CONFIG, processArgv);
}