Выполнение JS из проекта RCL не используя type="module"
У меня есть 5 JS файлов, которые хранились в Blazor проекте в папке "wwwroot/js" и успешно выполнялись через <Script "...">, но после переноса JS в новый RCL проект возникла проблема:
Навязчивое исключение об использовании import вне модуля.
RCL проект с js-скриптами называется AMBlazorNodes.
Код скриптов следующий, и в логике схож, то есть он не экспортирует функции или переменные, а добавляет некоторые объекты в window[]:
//#AMBlazorNodes/wwwroot/js/DotNetServiceAttacher.js
console.log("Initialization... DotNetServiceAttacher.");
window['addDotNetSingletonService'] = (name, dotNetServiceRef) => {
window[name] = dotNetServiceRef;
};
//#AMBlazorNodes/wwwroot/js/NodeDragHandler.js
console.log("Initialization... NodeDragHandler.");
class NodeDragHandler {
constructor() {
this.startNodeDrag = () => {
//console.log("starting node drag");
document.addEventListener('mousemove', window['NodeDragHandler'].dragNode);
document.addEventListener('mouseup', () => document.removeEventListener('mousemove', window['NodeDragHandler'].dragNode));
};
this.dragNode = (event) => {
window['DotNetNodeDragService'].invokeMethodAsync("DragNode", event.clientX, event.clientY);
};
}
}
window["NodeDragHandler"] = new NodeDragHandler();
Для того, чтобы не импортировать 5 разных JS файла из библиотеки - создал следующий JS файл:
//#AMBlazorNodes/wwwroot/AMBlazorNodes.lib.module.js
console.log("AMBlazorNodes initialization started...");
import './js/DotNetServiceAttacher.js';
import './js/NodeDragHandler.js';
import './js/NoodleDragHandler.js';
import './js/ZoomHandler.js';
console.log("AMBlazorNodes initialization finished!");
И в Razor проекте подгружаю его следующим способом:
//#_Host.cshtml
<!-- AMBlazorNodes -->
<script src="_content/AMBlazorNodes/AMBlazorNodes.lib.module.js"></script>
JS-скрипты выполняются, как ожидалось, но выдает исключение:
_content/AMBl…des.lib.module.js:2 -> Uncaught SyntaxError: Cannot use import statement outside a module
Добавил аттрибут type="module", что убрало исключение Uncaught SyntaxError (представленное выше), но можно ли обойтись без этого аттрибута? Интересно, как это устроено в RCL с Nuget, где можно использовать без type="module", или может здесь есть решение проще?
И как второстепенный вопрос, почему файл выполняется не по порядку? Как видно из лога, сообщение о начале инициализации выводится в конце:\
DotNetServiceAttacher.js:1 Initialization... DotNetServiceAttacher.\
NodeDragHandler.js:1 Initialization... NodeDragHandler.\
NoodleDragHandler.js:1 Initialization... NoodleDragHandler.\
ZoomHandler.js:1 Initialization... ZoomHandler.\
AMBlazorNodes.lib.module.js:1 AMBlazorNodes initialization starting...\
AMBlazorNodes.lib.module.js:6 AMBlazorNodes initialization finished!\
Спасибо за помощь с банальными вопросами, я в .NET уже много лет, но с Blazor и Razor только начинаю осваиваться.
Код в большей части не мой, это скрипты из проекта Nodexr