Uncaught ReferenceError - как получить доступ к функции, связанной с веб-пакетом

Я использую https://github.com/sloria/cookiecutter-flask для проекта, и я пытаюсь добавить функцию javascript в файл js, который связан с веб-пакетом, и получить к нему доступ из html. Я думаю, что мне не хватает чего-то базового.

Исходные файлы для фона:

Я добавляю в plugins.js следующий код:

function foo () {
    console.info('bar')
}

И пытаюсь вызвать его из html-документа для проверки следующим образом

<script type = "text/javascript">
    foo();
</script>

Я вижу, что моя функция была объединена, но я не могу получить к ней доступ. Uncaught ReferenceError - как получить доступ к функции, связанной с веб-пакетом

И вот ошибка, которую я получаю: Uncaught ReferenceError - как получить доступ к функции, связанной с веб-пакетом

Мне уже пришлось добавить expose-loader в мой webpack.config.js, чтобы jquery работал согласно Эта проблема: Uncaught ReferenceError - как получить доступ к функции, связанной с веб-пакетом

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 065
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В моем опыте, когда я использую Webpack, я объединяю код в модули, которые инкапсулируют их в область видимости этого модуля. Код, который я хочу быть доступен вне модуля, я явно export, а затем import или require в новую область, где я хочу получить к нему доступ.

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

function foo() {
    console.info('bar!');
}

if (!Window.foo) {
    Window.foo = foo;
} else {
    console.warn('Foo is already assigned!');
}

Тем не менее, я бы порекомендовал вам избегать подобной разработки - загрязнение глобального пространства имен обычно не является хорошим шаблоном и приводит к большому количеству потенциальных конфликтов. Если вы должен работает таким образом, по крайней мере, назначьте объект пространству имен, прикрепленному к Window, где вы можете разместить функциональные возможности своих приложений, не рискуя конфликтом с другими свойствами Window:

Window.myApp = {
    foo: function () {
        console.info('bar!');
    }
}

Window.myApp.printGreeting = function () {
    console.info('Hello!');
}

// ...etc

Спасибо за быстрый ответ Александр. Я счастлив определить модуль. Я зацикливаюсь на синтаксисе. Как выглядит простой модуль, в котором есть только одна функция, которая регистрирует строку? Как мне потом его импортировать? В частности, webpack генерирует JS-файл с хешем, поэтому я не уверен, что вставить после, например, «import Module from»

sshevlyagin 17.03.2018 21:29

@sshevlyagin - это зависит от того, используете ли вы синтаксис ES6 или синтаксис модуля Node. Если вы используете ES6, вам следует проверить страницы Импортировать и экспорт на MDN. Как правило, я бы сказал, что если вы экспортируете только одну функцию из модуля, вы можете использовать export default myFunction. Затем его можно записать на import с любым именем: import theFunction from './../someFolder/myFunction'.

Alexander Nied 17.03.2018 23:27

Спасибо, Александр. Я провел еще несколько экспериментов, и похоже, что то, как веб-пакет настраивает файл js, в который я добавляю вещи, ожидает jquery. Я собираюсь опубликовать, как я это исправил в jquery.

sshevlyagin 18.03.2018 01:54

Я не мог понять, как заставить синтаксис ES6 работать в файле, постоянно сталкивался с этой ошибкой: error

Вот обходной путь, основанный на этом связанный вопрос

Другие вопросы по теме