Вызов webpacked кода извне (тег script HTML)
Предположим, что у меня есть класс, подобный этому (написанный в typescript), и я связываю его с webpack в bundle.js
.
export class EntryPoint {
static run() {
...
}
}
В моем index.html я включу пакет, но тогда я также хотел бы назвать этот статический метод.
<script src="build/bundle.js"></script>
<script>
window.onload = function() {
EntryPoint.run();
}
</script>
Однако в этом случае EntryPoint
undefined. Как я могу назвать связанный javascript из другого script, затем?
Добавлен: файл конфигурации Webpack.
Ответы
Ответ 1
Кажется, что вы хотите открыть пакет webpack в качестве библиотеки. Вы можете настроить webpack, чтобы выставить свою библиотеку в глобальном контексте в пределах вашей собственной переменной, например EntryPoint
.
Я не знаю TypeScript, поэтому вместо примера используется простой JavaScript. Но важной частью здесь является файл конфигурации webpack и, в частности, раздел output
:
webpack.config.js
module.exports = {
entry: './index.js',
output: {
path: './lib',
filename: 'yourlib.js',
libraryTarget: 'var',
library: 'EntryPoint'
}
};
index.js
module.exports = {
run: function () {
console.log('run from library');
}
};
Затем вы сможете получить доступ к своим библиотечным методам, как вы ожидаете:
<script src="lib/yourlib.js"></script>
<script>
window.onload = function () {
EntryPoint.run();
};
</script>
Проверьте суть с фактическим кодом.
Ответ 2
Мне удалось получить эту работу без каких-либо дополнительных модификаций webpack.config.js
, просто используя оператор import
, который я вызвал из файла main/index.js:
import EntryPoint from './EntryPoint.js';
window.EntryPoint = EntryPoint;
![введите описание изображения здесь]()
Для справки, здесь мой weback.config.js
файл.
Сначала я попытался выполнить то же самое с помощью require
, однако он присвоил оболочке модуля window.EntryPoint
в отличие от фактического класса.
Ответ 3
В моих обстоятельствах я смог вызвать функцию из встроенного JavaScript из другого script, написав эту функцию в окне при ее создании.
// In the bundled script:
function foo() {
var modal = document.createElement('div');
}
// Bind to the window
window.foo = foo;
// Then, in the other script where I want to reference the bundled function I just call it as a normal function
<button onClick="window.foo()">Click Me</button>
Я не смог использовать Babel, так что это сработало для меня.
Ответ 4
У меня была похожая проблема, я хотел создать пакет для нескольких страниц в путешествии и хотел, чтобы каждая страница имела свою точку входа в код и без отдельного пакета для каждой страницы.
Вот мой подход, который очень похож на Курта Уильямса, но с немного иной точки зрения, также без изменения конфигурации веб-пакета:
JourneyMaster.js
import { getViewData } from './modules/common';
import { VIEW_DATA_API_URL } from './modules/constants';
import { createLandingPage, createAnotherPage } from './modules/components/pageBuilder';
window.landingPageInit = () => {
getViewData(VIEW_DATA_API_URL).then(viewData => {
createLandingPage(viewData);
});
};
window.anotherPageInit = () => {
getViewData(VIEW_DATA_API_URL).then(viewData => {
createAnotherPage(viewData);
});
};
// I appreciate the above could be one liners,
// but readable at a glance is important to me
Затем пример того, как я вызываю эти методы в конце html
страницы:
<script src="/js/JourneyMaster.js"></script>
<script>window.landingPageInit();</script>
Ответ 5
App.ts:
namespace mytypescript.Pages {
export class Manage {
public Initialise() {
$("#btnNewActivity").click(() => {
alert("sdc'");
});
}
}
}
mypage.html:
<input class="button" type="button" id="btnNewActivity" value="Register New Activity" />
<script type="text/javascript">
var page = new mytypescript.Pages.Manage();
page.Initialise();
</script>