Как запустить работника с зависимостями в javascript и sveltekit?
Я пытаюсь использовать модуль zxcvbn в своем проекте. Это нормально для паролей длиной до 50 символов. Ведь оценка каждого пароля занимает слишком много времени.
Я пытаюсь использовать работников для запуска функции и обновления состояния в sveltekit. Код выглядит следующим образом.
// src/generator/+page.svelte
onMount(() => {
const w = new Worker("src/routes/generator/worker");
w.postMessage("password");
w.onmessage = function (event) {
console.log(event.data);
};
});
// src/generator/worker.ts
import zxcvbn from "zxcvbn"; // throws error "Uncaught SyntaxError: Cannot use import statement outside a module (at worker.ts:1:1)"
const passwordStrength = (password: string) => {
const res = zxcvbn(password);
postMessage(res);
};
self.onmessage = (e) => {
passwordStrength(e.data);
};
Я новичок в Sveltekit и javascript/typescript в целом, поэтому любые предложения приветствуются.
2 ответа
Вы могли бы добавить атрибутtype="module"
на каждогоscript
тег, который вы использовали. Посмотрите пример ниже:
<script src="/path/to/your/amazing/script.js" type="module"></script>
В итоге я импортировал работника как такового
// src/generator/+page.svelte
import MyWorker from "src/generator/worker?worker";
const w = new MyWorker();
w.postMessage("password");
w.onmessage = function (event) {
console.log(event.data);
};
// src/generator/worker.ts
import zxcvbn from "zxcvbn";
const passwordStrength = (password: string) => {
const res = zxcvbn(password);
postMessage(res);
};
self.onmessage = (e) => {
passwordStrength(e.data);
};
Vite поддерживает прямой импорт работника. Тогда я мог бы запустить его без проблем, и он не блокировал бы другой JavaScript. Другое решение, которое я видел, заключалось в том, чтобы сделать рабочего такимnew Worker("/my/path/workerfile?worker", {type: "module"})
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Решение/объяснение может быть не на 100% правильным, поскольку я все еще учусь.