Какие-нибудь инструменты для разработки модульных сервисов в машинописи? - PullRequest
1 голос
/ 14 марта 2020

Я хотел бы поделиться исходными модулями (классами) между веб-приложением и работником службы, но не могу найти способ сделать это, используя только машинопись. При использовании amd, как только я импортирую модуль, «self» больше не находится в начальном потоке. Весь этот источник модуля должен загружаться синхронно, в отличие от моего веб-приложения, где я могу требовать () его в asyn c. Я попытался использовать модуль es2015 вместо amd, но натолкнулся на «Невозможно использовать оператор импорта вне модуля». Даже если это удастся, у меня возникнет та же проблема, что и с amd. Кажется, что нет необходимости использовать importScripts () от работника службы.

Если бы я мог указать машинописи, что я нацеливаюсь на работника из файла tsconfig. json, он теоретически мог бы создать импорт в стиле serviceworker, но я не вижу такой поддержки. Итак, на мой вопрос:

Есть ли способ построить модульное решение для сервисных работников из машинописи?

Ошибка:

import { Module1 } from "./mods/module1.js";

self.addEventListener("install", (event: any) => {
  new Module1("from index");
});

Я подозреваю, что нет хорошего ответа, поскольку importScripts ничего не возвращает. Эти сценарии необходимо зарегистрировать в репо. Если бы у almond. js был синхронный режим, я думаю, что это решило бы мою проблему, поскольку Typescript генерирует это:

define(["require", "exports", "./mods/module1.js"], function (require, exports, module1_js_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    self.addEventListener("install", function (event) {
        new module1_js_1.Module1("from index");
    });
});

Если require () не были асинхронными c, я мог бы получить доступ к "self" на том же потоке и вещи должны go плавно. Удаление setTimeout () из миндаля. js ломает загрузчик.

ОБНОВЛЕНИЕ: есть шаблон, который работает с использованием загрузчика amd и миндаля:

self.importScripts("../node_modules/almond/almond.js");
self.addEventListener("install", event => {
  requirejs(["worker/index"], (worker: { run: () => void }) => worker.run());
});

Я только сейчас разрабатываю его так может столкнуться с ограничениями. worker / index.ts выглядит следующим образом:

import {Module1} from "../mods/module1";
export function run() {
    new Module1("running from worker");
}

и, следовательно, возвращает разработчика обратно к стандартным машинописным модулям.

...