UNPKG

@sheto/static

Version:

一个简单易用的前端静态网页运行工具库

184 lines (183 loc) 6.96 kB
#!/usr/bin/env node "use strict"; 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); }