perf: skulpt 改为按需加载,client-zip 换成 fflate
skulpt 此前被 SubmitCode.vue 静态引用,945K 的 chunk 落在做题页首屏, 学生打开任何一道题都要下 233KB gzip,只为提交时拿一个语法错误行号。 改成 import() 懒加载并在语言切到 Python3 时预取,加载失败放行提交、 交给后端判题兜底。构建产物确认该 chunk 只剩一处 import() 引用, index.html 不再引用。 client-zip 的能力 fflate 已经覆盖(utils/functions.ts 本就在用 zlibSync), 新增 createZipBlob 统一两处测试用例打包,删掉该依赖。压缩方式由 store 变为 deflate,Python zipfile 透明解压,后端不受影响。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,14 @@
|
||||
import { getTime, intervalToDuration, parseISO, type Duration } from "date-fns"
|
||||
import { User } from "./types"
|
||||
import { USER_TYPE } from "./constants"
|
||||
import { strFromU8, strToU8, unzlibSync, zlibSync } from "fflate"
|
||||
import {
|
||||
strFromU8,
|
||||
strToU8,
|
||||
unzlibSync,
|
||||
zipSync,
|
||||
zlibSync,
|
||||
type Zippable,
|
||||
} from "fflate"
|
||||
import copyTextFallback from "copy-text-to-clipboard"
|
||||
import { customAlphabet } from "nanoid"
|
||||
|
||||
@@ -208,6 +215,22 @@ export function atou(base64: string): string {
|
||||
return strFromU8(unzipped)
|
||||
}
|
||||
|
||||
/**
|
||||
* 把若干文本文件打包成 zip Blob
|
||||
* @param files 文件名和文本内容
|
||||
* @param mtime 归档内的修改时间,默认当前时间
|
||||
*/
|
||||
export function createZipBlob(
|
||||
files: { name: string; content: string }[],
|
||||
mtime: Date = new Date(),
|
||||
): Blob {
|
||||
const entries: Zippable = {}
|
||||
for (const f of files) {
|
||||
entries[f.name] = strToU8(f.content)
|
||||
}
|
||||
return new Blob([zipSync(entries, { mtime })], { type: "application/zip" })
|
||||
}
|
||||
|
||||
/**
|
||||
* 复制文本到剪贴板
|
||||
* 优先使用 Clipboard API(支持在 modal 中使用),失败时回退到 copy-text-to-clipboard
|
||||
|
||||
Reference in New Issue
Block a user