Files
TankIC/tools/pack_unpacked.js
TermiNexus 4005213226 feat(tools): 新版本工具链移植 + 本地镜像单包加载,中继改为原样直发与异步有序落盘
- hornet 工具链:无 ght 启动;透视冻结节点拖拽跟随、金箱标记、性能优化;雷达死亡红叉;鼠标稳定器;窗口布局持久化

- 本地镜像:切割与单包加载(pack_unpacked.js)+ SW 单包缓存 + F5 兜底刷新;入口更新为 main.9f4e7a89.js

- 中继 wss_server.js:转发改 socket 反压的原样直发(零等待零缓存);落盘改单条有序异步队列(默认开启);新增反压看门狗(默认 60s)
2026-10-11 19:35:54 +08:00

67 lines
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// pack_unpacked.js — 把切割产物打成单个包,减少「一堆小文件」的请求开销
//
// 打包对象:3dtank.com/play/static/js/unpacked/ 下的
// · module_*.js (126 个代码模块)
// · resources.json (资源映射表)
// 产物:3dtank.com/play/static/js/unpacked.pack.json
// { version, base, files: { "<文件名>": "<内容>" } }
// version = 文件名+内容的 sha1,用于 SW 缓存版本号(内容不变则版本不变)
//
// 谁在用:
// 1) 加载器(main.*.js)优先读这个包,一次请求拿到全部模块(失败才回退逐文件 fetch)
// 2) hornet_sw.js 用它把 /play/static/js/unpacked/* 的请求就地命中(不再走磁盘小文件)
//
// 用法:node pack_unpacked.js [unpacked目录] [输出文件]
// 不带参数时默认打包 ../../../3dtank.com/play/static/js/unpacked
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const DEFAULT_DIR = path.resolve(__dirname, '..', '3dtank.com', 'play', 'static', 'js', 'unpacked');
const UNPACKED_DIR = process.argv[2] ? path.resolve(process.argv[2]) : DEFAULT_DIR;
const OUT_FILE = process.argv[3]
? path.resolve(process.argv[3])
: path.join(path.dirname(UNPACKED_DIR), 'unpacked.pack.json');
function main() {
if (!fs.existsSync(UNPACKED_DIR)) {
console.error('[ERROR] 目录不存在: ' + UNPACKED_DIR);
process.exit(1);
}
const Names = fs
.readdirSync(UNPACKED_DIR)
.filter((N) => /^module_\d+\.js$/.test(N) || N === 'resources.json')
.sort();
if (Names.length === 0) {
console.error('[ERROR] 没找到 module_*.js / resources.json(先跑 split.js 切割)');
process.exit(1);
}
const Hash = crypto.createHash('sha1');
const Files = {};
let Total = 0;
for (const Name of Names) {
const Text = fs.readFileSync(path.join(UNPACKED_DIR, Name), 'utf8');
Files[Name] = Text;
Hash.update(Name).update('\u0000').update(Text);
Total += Buffer.byteLength(Text, 'utf8');
}
const Pack = {
version: Hash.digest('hex').slice(0, 16),
base: '/play/static/js/unpacked/',
count: Names.length,
files: Files,
};
const Json = JSON.stringify(Pack);
fs.writeFileSync(OUT_FILE, Json);
console.log('[OK] 打包 ' + Names.length + ' 个文件 ' + (Total / 1048576).toFixed(2) + ' MB');
console.log(' 版本: ' + Pack.version);
console.log(' 输出: ' + OUT_FILE + ' (' + (Json.length / 1048576).toFixed(2) + ' MB)');
}
main();