diff --git a/rspack.config.ts b/rspack.config.ts index 6409878d5..4a3b90857 100644 --- a/rspack.config.ts +++ b/rspack.config.ts @@ -62,7 +62,12 @@ export default defineConfig({ }, output: { path: `${dist}/ext/src`, - filename: "[name].js", + filename(pathData, _assetInfo) { + if (pathData.runtime === "ts.worker") { + return "[name].js.bin"; + } + return "[name].js"; + }, clean: true, }, resolve: { @@ -229,6 +234,7 @@ export default defineConfig({ optimization: { minimizer: [ new rspack.SwcJsMinimizerRspackPlugin({ + test: /\.[cm]?js(\.bin)?(\?.*)?$/, minimizerOptions: { minify: !isDev, mangle: { @@ -243,7 +249,7 @@ export default defineConfig({ passes: 2, drop_console: false, drop_debugger: !isDev, - ecma: 2020, + ecma: 2022, arrows: true, dead_code: true, ie8: false, @@ -261,7 +267,7 @@ export default defineConfig({ format: { comments: false, beautify: false, - ecma: 2020, + ecma: 2022, }, }, }), diff --git a/scripts/pack.js b/scripts/pack.js index 26d0f79a2..85f66307a 100644 --- a/scripts/pack.js +++ b/scripts/pack.js @@ -89,6 +89,15 @@ firefoxManifest.browser_specific_settings = { // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/userScripts#browser_compatibility // Firefox 136 (Released 2025-03-04) strict_min_version: "136.0", + data_collection_permissions: { + required: [ + "none", // 没有必须传送至第三方的资料。安装转页没有记录用户何时何地安装了什么。 + ], + optional: [ + "authenticationInfo", // 使用 Cloud Backup / Import 时,有传送用户的资料至第三方作登入验证 + "personallyIdentifyingInfo", // 使用 电邮 或 帐密 让第三方识别个人身份进行 Cloud Backup / Import + ], + }, }, }; @@ -126,10 +135,8 @@ firefox.file("manifest.json", JSON.stringify(firefoxManifest)); await Promise.all([ addDir(chrome, "./dist/ext", "", ["manifest.json"]), - addDir(firefox, "./dist/ext", "", ["manifest.json", "ts.worker.js"]), + addDir(firefox, "./dist/ext", "", ["manifest.json"]), ]); -// 添加ts.worker.js名字为gz -firefox.file("src/ts.worker.js.gz", await fs.readFile("./dist/ext/src/ts.worker.js", { encoding: "utf8" })); // 导出zip包 chrome diff --git a/src/pkg/utils/monaco-editor/index.ts b/src/pkg/utils/monaco-editor/index.ts index 6c91de174..8a055c44f 100644 --- a/src/pkg/utils/monaco-editor/index.ts +++ b/src/pkg/utils/monaco-editor/index.ts @@ -1,7 +1,7 @@ import { globalCache, systemConfig } from "@App/pages/store/global"; import EventEmitter from "eventemitter3"; import { languages } from "monaco-editor"; -import { findGlobalInsertionInfo, updateGlobalCommentLine } from "./utils"; +import { findGlobalInsertionInfo, getEditorWorkerPromise, getTsWorkerPromise, updateGlobalCommentLine } from "./utils"; // 注册eslint const linterWorker = new Worker("/src/linter.worker.js"); @@ -455,12 +455,16 @@ type Prompt = (typeof langs)["zh-CN"]["prompt"]; type LangEntry = (typeof langs)["zh-CN"]; export default function registerEditor() { + const editorWorker = getEditorWorkerPromise(); + const tsWorkerPromise = getTsWorkerPromise(); window.MonacoEnvironment = { - getWorkerUrl(moduleId: any, label: any) { + // https://microsoft.github.io/monaco-editor/typedoc/interfaces/Environment.html#getWorker + // Returns Worker | Promise + getWorker(workerId: string, label: string) { if (label === "typescript" || label === "javascript") { - return "/src/ts.worker.js"; + return tsWorkerPromise; } - return "/src/editor.worker.js"; + return editorWorker; }, }; function asLangEntry(key: T) { diff --git a/src/pkg/utils/monaco-editor/utils.ts b/src/pkg/utils/monaco-editor/utils.ts index 978742ffb..7f0e9fc72 100644 --- a/src/pkg/utils/monaco-editor/utils.ts +++ b/src/pkg/utils/monaco-editor/utils.ts @@ -1,5 +1,28 @@ import type { editor } from "monaco-editor"; +export const getEditorWorkerPromise = () => { + return Promise.resolve( + new Worker("/src/editor.worker.js", { + credentials: "omit", + name: "editorWorker", + type: "module", + }) + ); +}; + +export const getTsWorkerPromise = () => { + return fetch(chrome.runtime.getURL(`/src/ts.worker.js.bin`)) + .then((resp) => (resp.ok ? resp.blob() : null)) + .catch(() => null) + .then(async (blob) => { + if (blob) { + const blobUrl = URL.createObjectURL(new Blob([blob], { type: "text/javascript" })); + return new Worker(blobUrl, { credentials: "omit", name: "tsWorker", type: "module" }); + } + throw new Error("no ts.worker.js"); + }); +}; + export const findGlobalInsertionInfo = (model: editor.ITextModel) => { const lineCount = model.getLineCount();