hudada-cli
Version:
专为程序员准备的本地文档搜索,快捷开发工具
3 lines (2 loc) • 3.25 kB
JavaScript
import{createServer as e}from"http";import{readFile as o}from"fs/promises";import{join as t,extname as n}from"path";import s from"chalk";import r from"open";import{watch as c,readdirSync as i}from"fs";import{Server as l}from"socket.io";const a={".html":"text/html",".css":"text/css",".js":"text/javascript",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml"};async function p(m=1101){const d=e((async(e,s)=>{try{const r="/"===e.url?"/index.html":e.url,c=t(process.cwd(),r||""),i=n(c).toLowerCase();if(".html"===i||"/"===r){let e=await o(c,"utf-8");const t="\n <script src=\"/socket.io/socket.io.js\"><\/script>\n <script>\n const socket = io();\n socket.on('refresh', () => {\n location.reload();\n });\n <\/script>\n ";return e=e.replace("</body>",`${t}</body>`),s.setHeader("Content-Type","text/html"),void s.end(e)}s.setHeader("Content-Type",a[i]||"text/plain");const l=await o(c);s.end(l)}catch(e){if("ENOENT"===e.code){const e=process.cwd(),o=await async function(e){const o=i(e);return o.filter((e=>e.endsWith(".html")))}(e);s.setHeader("Content-Type","text/html"),s.end(`\n <html>\n <head>\n <title>Directory Listing</title>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n a { color: #0366d6; text-decoration: none; }\n a:hover { text-decoration: underline; }\n </style>\n </head>\n <body>\n <h2>Available HTML Files:</h2>\n ${o.map((e=>`\n <div><a href="/${e}">${e}</a></div>\n `)).join("")}\n <script src="/socket.io/socket.io.js"><\/script>\n <script>\n const socket = io();\n socket.on('refresh', () => {\n location.reload();\n });\n <\/script>\n </body>\n </html>\n `)}else s.statusCode=500,s.end("Internal Server Error")}})),h=new l(d);c(process.cwd(),{recursive:!0},((e,o)=>{o&&(console.log(s.blue(`检测到文件变化: ${o}`)),h.emit("refresh"))})),d.listen(m,(()=>{const e=`http://localhost:${m}`;console.log(s.green(`预览服务器启动在: ${e}`)),console.log(s.blue("文件监听已启动,修改文件将自动刷新浏览器")),r(e)})),d.on("error",(e=>{"EADDRINUSE"===e.code?(console.log(s.yellow(`端口 ${m} 已被占用,尝试使用端口 ${m+1}`)),p(m+1)):console.error(s.red(`服务器错误: ${e.message}`))})),process.on("SIGINT",(()=>{console.log(s.yellow("\n正在关闭服务器...")),h.close(),d.close((()=>{console.log(s.green("服务器已关闭")),process.exit(0)}))}))}export{p as startPreview};