Собираю все JS файлы в webpack.
function DetailClass() {
this.add = function() {
//something...
}
}
var Detail = new DetailClass();
После сборки в 1 файл пытаюсь запустить функцию через HTML:
<div onclick="Detail.add();">Добавить</div>
Но ничего не срабатывает. Пишет Detail is not defined.
Внимание, ответ актуален для 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 кодом, то вам эти способы из коробки врядли подойдут, потому что они предназначены для случаев когда клиентская часть организована нормально =)
Продвижение своими сайтами как стратегия роста и независимости