Вызов 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>