Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions rspack.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down Expand Up @@ -229,6 +234,7 @@ export default defineConfig({
optimization: {
minimizer: [
new rspack.SwcJsMinimizerRspackPlugin({
test: /\.[cm]?js(\.bin)?(\?.*)?$/,
minimizerOptions: {
minify: !isDev,
mangle: {
Expand All @@ -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,
Expand All @@ -261,7 +267,7 @@ export default defineConfig({
format: {
comments: false,
beautify: false,
ecma: 2020,
ecma: 2022,
},
},
}),
Expand Down
13 changes: 10 additions & 3 deletions scripts/pack.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
],
},
},
};

Expand Down Expand Up @@ -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
Expand Down
12 changes: 8 additions & 4 deletions src/pkg/utils/monaco-editor/index.ts
Original file line number Diff line number Diff line change
@@ -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");
Expand Down Expand Up @@ -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<Worker>
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<T extends keyof typeof langs>(key: T) {
Expand Down
23 changes: 23 additions & 0 deletions src/pkg/utils/monaco-editor/utils.ts
Original file line number Diff line number Diff line change
@@ -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();

Expand Down
Loading