// 打包 web/main.ts → web/dist/app.js(IIFE,可 file:// 直接打开)。 // --serve 时起本地服务并监听改动,手机同一 Wi-Fi 下访问启动时打印的地址。 // 端口:--port 4000 或 PORT=4000,不给就从 8100 起自动找空闲端口。 import * as esbuild from 'esbuild'; import { networkInterfaces } from 'node:os'; const argv = process.argv.slice(2); const serve = argv.includes('--serve'); const portArg = argv[argv.indexOf('--port') + 1]; const port = argv.includes('--port') ? Number(portArg) : process.env.PORT ? Number(process.env.PORT) : 8100; const ctx = await esbuild.context({ entryPoints: ['web/main.ts'], bundle: true, format: 'iife', target: ['es2020'], outfile: 'web/dist/app.js', sourcemap: serve ? 'inline' : false, minify: !serve, logLevel: 'info', loader: { '.json': 'json' }, }); if (!serve) { await ctx.rebuild(); await ctx.dispose(); } else { await ctx.watch(); const served = await ctx.serve({ servedir: 'web', host: '0.0.0.0', port }); let lan = []; try { lan = Object.values(networkInterfaces()) .flat() .filter((i) => i && i.family === 'IPv4' && !i.internal) .map((i) => i.address); } catch { // 受限环境拿不到网卡列表,只打印 localhost } console.log(`\n 本机: http://localhost:${served.port}/`); for (const ip of lan) console.log(` 手机: http://${ip}:${served.port}/`); console.log(` (监听 ${served.host}:${served.port},改动自动重新打包,刷新页面即可)\n`); }