Обновление. Похоже, проблема связана с protobuf. Меня устраивает и другое решение, которое помогает мне исправить проблемы с Google protobuf. Эта проблема сводится к следующему:
- Как интегрировать Google protobuf с Typescript / Javascript для браузера?
Я оставляю ниже вопрос для использования в будущем.
Мы переместили наше приложение с Javascript на Typescript для очевидных преимуществ ООП и т. Д.
Ранее вызов прямой функции javascript из Html был таким же простым, как:
<script>window.MyFunction()</script>
Теперь с помощью Typescript все файлы объединены в один автоматически сгенерированный файл .js.
В этом единственном файле индивидуальный код каждого файла изолирован внутри System.register()
. Обычно это выглядит примерно так:
System.register("<filename>", ["<import_1>", ..., "<import_N>"],
function (exports_13, context_13) {
"use strict";
...
function MyFunction () { ... } // somewhere inside the external function
}
Короче говоря, все, что написано в файле .ts, после запуска компилятора tsc
упаковывается в безымянную функцию.
Теперь я не знаю, как вызвать функцию, которая находится внутри другой функции, которая, в свою очередь, указана в System.register(...)
Вопрос: каков правильный синтаксис для вызова такой функции извне из файла Html?
<script> ??? </script>
Обновление:
HTML пытается вызвать в теге body следующим образом:
<script>
System.import("Main").then( // Main.ts is one of the file
function (module)
{
throw 0; // Temporary, to see if we reach till here
module.main(); // "main()" is the function, which is the entry point
});
</script>
В моем коде я использую "browserify", чтобы иметь возможность использовать protobuf Google для JS. Ошибка возникает только для файлов, связанных с protobuf. Эти определения и исходные файлы представлены в форматах .d.ts и .js.
Ошибка выглядит примерно так:
js: Uncaught (in promise) Error: Fetch error: 404 NOT FOUND
Instantiating http://localhost:50000/folder/external/Server_pb
Loading http://localhost:50000/folder/external/_External
Loading Main
Обратите внимание, что 50000 - это временный порт, а «папка» - это просто любая папка, в которой хранятся .js. Server_pb - это созданный пользовательский файл protobuf.
Мою проблему можно точно описать как эту ссылку сильный>.
Связанный:
- Что означает System.register в файле JS?
- Как вызвать именованный модуль из пакета (‹- может быть полезно, но не знаю синтаксиса как новичок)
- Как запустить приложение Typescript с модулями SystemJS? (почти дублирует, но пока не может решить проблему с помощью этого подхода)
- Как заставить TypeScript связывать стороннюю библиотеку из node_modules? (похоже, еще одно близкое совпадение; пытаюсь разобраться в этом прямо сейчас, чтобы исправить проблему с protobuf)
window.myfn()
, если вы уверены, что онwindow
- person Daniel Lizik   schedule 29.06.2018window.myfn = function () {}
в этом случае не сработает, потому что после автогенерации файла .js все глобальные операторы будут частью функции. - person iammilind   schedule 29.06.2018