解决 1.95.0 vscode 无法实现 worker 发起网络请求的问题

This commit is contained in:
锦恢 2024-10-31 20:05:32 +08:00
parent 48dd0166fd
commit 3834ffe02c
6 changed files with 23 additions and 33 deletions

View File

@ -12,27 +12,19 @@
<link rel="stylesheet" href="vcd.css"> <link rel="stylesheet" href="vcd.css">
<link rel="stylesheet" href="iconfont.css"> <link rel="stylesheet" href="iconfont.css">
<link rel="stylesheet" href="animation.css"> <link rel="stylesheet" href="animation.css">
<!-- <script src="vcd.js"></script> -->
<script></script> <script></script>
<script> <script>
window.readVcdFile = async () => { window.readVcdFile = async () => {
let inputVcdFile = 'test.vcd'; let inputVcdFile = 'test.vcd';
let inputViewFile = 'test.view'; let inputViewFile = 'test.view';
const response = await fetch(inputVcdFile); const response = await fetch(inputVcdFile);
const blob = await response.blob(); const arrayBuffer = await response.arrayBuffer();
const reader = new FileReader(); return [arrayBuffer, inputVcdFile, inputViewFile];
return new Promise((resolve, reject) => {
reader.onload = event => {
const arrayBuffer = event.target.result;
resolve([arrayBuffer, inputVcdFile, inputViewFile]);
};
reader.readAsArrayBuffer(blob);
});
} }
window.workerPath = 'worker.js'; window.workerPath = 'worker.js';
window.workerRoot = ''; window.vcdJsPath = 'vcd.js';
window.wasmPath = 'vcd.wasm';
</script> </script>
</head> </head>

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -1,17 +1,8 @@
self.onmessage = async event => { self.onmessage = async event => {
const { arrayBuffer, workerRoot } = event.data; const { arrayBuffer, vcdSource, wasmBinary } = event.data;
eval(vcdSource);
self.locateFile = wasmBinaryFile => { const moduleArg = { wasmBinary };
if (workerRoot) { const vcdstream = await makeVcdStream(moduleArg);
return workerRoot + (workerRoot.endsWith('/') ? '': '/') + wasmBinaryFile;
} else {
return wasmBinaryFile;
}
};
importScripts('vcd.js');
const vcdstream = await makeVcdStream();
vcdstream.consume(arrayBuffer); vcdstream.consume(arrayBuffer);
const info = vcdstream.getBasicInfo(); const info = vcdstream.getBasicInfo();
self.postMessage(info); self.postMessage(info);

View File

@ -75,7 +75,13 @@ onMounted(async () => {
type: 'classic' type: 'classic'
}); });
worker.postMessage({ arrayBuffer, workerRoot: window.workerRoot }, [arrayBuffer]); const vcdSourceResponse = await fetch(window.vcdJsPath);
const vcdSource = await vcdSourceResponse.text();
const wasmBinaryResponse = await fetch(window.wasmPath);
const wasmBinary = await wasmBinaryResponse.arrayBuffer();
worker.postMessage({ arrayBuffer, vcdSource, wasmBinary }, [arrayBuffer]);
worker.addEventListener('message', event => { worker.addEventListener('message', event => {
const workerVars = event.data; const workerVars = event.data;

View File

@ -9,7 +9,7 @@ const type = 'application/javascript';
* }} options * }} options
* @returns {Promise<string>} * @returns {Promise<string>}
*/ */
async function getCrossOriginWorkerURL (originalWorkerUrl, options = {}) { async function getCrossOriginWorkerURL(originalWorkerUrl, options = {}) {
const skipSameOrigin = options.skipSameOrigin || true; const skipSameOrigin = options.skipSameOrigin || true;
const useBlob = options.useBlob || true; const useBlob = options.useBlob || true;
@ -27,14 +27,15 @@ async function getCrossOriginWorkerURL (originalWorkerUrl, options = {}) {
workerPath.pop(); workerPath.pop();
// 给 importScripts 的每一个引入的js文件增加 workerPath 组成绝对路径 // 给 importScripts 的每一个引入的js文件增加 workerPath 组成绝对路径
const importScriptsFix = `const _importScripts = importScripts; // const importScriptsFix = `const _importScripts = importScripts;
const _fixImports = (url) => new URL(url, '${workerPath.join('/') + '/'}').href; // const _fixImports = (url) => new URL(url, '${workerPath.join('/') + '/'}').href;
importScripts = (...urls) => _importScripts(...urls.map(_fixImports)); // importScripts = (...urls) => _importScripts(...urls.map(_fixImports));
`; // `;
// 以 MIME 协议组成 blob从而进行装载 // 以 MIME 协议组成 blob从而进行装载
let resultURL = `data:${type},` + encodeURIComponent(importScriptsFix + workerJsCode); // let resultURL = `data:${type},` + encodeURIComponent(importScriptsFix + workerJsCode);
let resultURL = `data:${type},` + encodeURIComponent(workerJsCode);
if (useBlob) { if (useBlob) {
// 在外面再套一层 importScripts这样第二次请求得到的 worker 就不是 blob worker 了 // 在外面再套一层 importScripts这样第二次请求得到的 worker 就不是 blob worker 了
// 直接使用 createObjectURL 请求一个 worker 的源码是不行的,因为这样得到的 blob worker // 直接使用 createObjectURL 请求一个 worker 的源码是不行的,因为这样得到的 blob worker