#javascript #typescript #requirejs
Вопрос:
Я пытаюсь перенести свои файлы Javascript в файлы машинописного текста, однако я застрял, когда пытаюсь использовать перенесенный файл javascript на html-странице и получаю следующую ошибку:
https://requirejs.org/docs/errors.html#notloaded
at makeError (require.min.js:1)
at Object.s [as require] (require.min.js:1)
at requirejs (require.min.js:1)
at helloworld.js:4
Мой файл машинописного текста
import * as $ from "jquery";
export class Loading {
public showLoadingModal(msg?: string) {
if (msg === undefined) {
msg = "Loading ...";
}
$("#dialog1 label").html(msg);
//$('#pleaseWaitDialog').modal({ backdrop: 'static', keyboard: false });
}
public hideLoadingModal() {
// $('#pleaseWaitDialog').modal('hide');
}
public keepOpenLoadingModal() {
$("#dialog1").on("hide.bs.modal", function () {
return false;
});
this.showLoadingModal();
}
}
Транспилированный файл Javascript
"use strict";
exports.__esModule = true;
exports.Loading = void 0;
var $ = require("jquery");
var Loading = /** @class */ (function () {
function Loading() {
}
Loading.prototype.showLoadingModal = function (msg) {
if (msg === undefined) {
msg = "Loading ...";
}
$("#dialog1 label").html(msg);
//$('#dialog1').modal({ backdrop: 'static', keyboard: false });
};
Loading.prototype.hideLoadingModal = function () {
// $('#dialog1').modal('hide');
};
Loading.prototype.keepOpenLoadingModal = function () {
$("#dialog1").on("hide.bs.modal", function () {
return false;
});
this.showLoadingModal();
};
return Loading;
}());
exports.Loading = Loading;
Я загрузил Jquery из CDN, как показано ниже
<html lang="en">
<head>
<meta charset="utf-8" />
<title></title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-KyZXEAg3QhqLMpG8r 8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We"
crossorigin="anonymous"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
var exports = {};
</script>
<script src="helloworld.js"></script>
</head>
<body>
<h3 class="text-center mt-2 mb-2">Demo</h3>
</body>
</html>
Я также попытался загрузить jquery с приведенным ниже кодом, но безуспешно
var exports = {};
requirejs.config({
baseUrl: "/js/lib",
paths: {
jquery: "jquery.min",
},
});
requirejs(["jquery"], function (jquery) {
console.log(jquery); // OK
});
</script>```
Can you please help me resolve the error, I know this is very first step in my migration journey and I am badly stuck here, any help is much appreciated.
Ответ №1:
Вы переместили код с машинописного текста на обычный.
Браузеры не поддерживают систему модулей CommonJS, они поддерживают только систему модулей ECMAScript.
Используемая requirejs
вами библиотека поддерживает только модульную систему AMD.
Вы должны исправить это в момент переноса кода. Вам нужно настроить таргетинг на браузеры. Чаще всего это делается с помощью Webpack, в котором есть загрузчик для модулей машинописи.
В стороне: если вы import
используете (и, следовательно, объединяете) jQuery, вам также не следует загружать его с CDN.
Комментарии:
1. спасибо за ваш ответ. Если я настрою часть транспиляции с помощью webpack, как вы предложили, то как будут учитываться зависимости для Jquery или Bootstrap.js? будет ли об этом заботиться сам веббэк?
2. Вы
import
редактируете jQuery, поэтому jQuery будет включен в пакет, созданный Webpack.3. Отлично, так что это означает, что там, где мне нужно использовать файл пакета, мне не нужно беспокоиться о запросе или Bootstrap.js. Также будет ли это возможно, если я смогу создать отдельные файлы js для каждого файла ts? когда я буду строить из проекта webpack или это будет единый пакет, содержащий все файлы ts?
4. Спасибо за быстрый ответ, я попробую и, возможно, побеспокоюсь, если застряну.
5. Еще одна справка/запрос, предположим, что у меня есть пакет, созданный с помощью веб-пакета, и я загрузил bundle.js файл на html-странице. Теперь, если мне понадобится использовать классы, созданные из этого bundle.js файл, то как его следует называть? Предположим, что у меня есть класс showLoading в файле showLoading.ts, и я хотел бы использовать его из этого bundle.js.