Как получить доступ к функции после компиляции webpack?

348
27 января 2017, 07:56

Собираю все JS файлы в webpack.

function DetailClass() { 
  this.add = function() { 
    //something... 
    } 
} 
 
var Detail = new DetailClass();

После сборки в 1 файл пытаюсь запустить функцию через HTML:

<div onclick="Detail.add();">Добавить</div>

Но ничего не срабатывает. Пишет Detail is not defined.

Answer 1

Внимание, ответ актуален для webpack 1 а не для вышедшего в релиз пару недель назад webpack 2. Там вероятно остаются те же принципы, но несколько отличается API.

Через свой html вы обращаетесь к Detail как к глобальной переменной.

Она у вас глобальной и была видимо потому что var Detail = new DetailClass(); выполнялось на уровне всего документа.

Вебпак же ожидает, что модули которые вы ему подсовываете - реальные модули, без побочных эффектов. Поэтому совершенно спокойно оборачивает все в замыкание и переменная Detail больше не глобальная и больше не видна из глобального контекста в котором работает инлайн обработчик.

Что делать?
1. Простой грязный способ.
Была переменная глобальной, глобальной ее и оставим.

window.Detail = new DetailClass();

Ну и разумеется этот код нужно выполнить раньше выполнить, чем позвать Detail из html.
В вашем коде вероятнее всего пойдет и так, потому что сомневаюсь что структура приложения у вас хорошо организована.

2. Правильный способ.
Внимательно прочитать раздел документации, который касается работы с легаси кодом который не модулен, и выбрать способ подходящий именно вам (imports-loader/exports-loader/ProvidePlugin)

Но если у вас прямо такой кусок html разметки с инлайновым обработчиком, и он не создается никаким шаблонизатором/js кодом, то вам эти способы из коробки врядли подойдут, потому что они предназначены для случаев когда клиентская часть организована нормально =)

READ ALSO
У кого были ошибки с bootstrap + jQ?

У кого были ошибки с bootstrap + jQ?

Работаю над сайтом на bootstrap 4 + библиотека bootstrap-material-design, которая ориентирована на bootstrap3, но вполне себе работала и на 4Работала, кроме одного...

335
как подхватить селектор в phpQuery так же как и в jQuery?

как подхватить селектор в phpQuery так же как и в jQuery?

Пытаюсь подхватить элементы в jQuery все работает как надо :

268
PostCSS проверка существование класса &amp;?

PostCSS проверка существование класса &?

Начал использовать PostCSS в мелком проекте, раньше использовал препроцессор LessЧасто сталкиваюсь с задачей, что если у элемента есть такой класс,...

278
Фиксированый header на Jquery

Фиксированый header на Jquery

Здравсвуйте,зделал фикированый header на jqueryЗаметел что при прокрутки на начале страницы он неприятно дергается

339