Я ищу помощь в понимании чего-то в проекте, над которым я работаю. Я написал некоторый код, который работает, хотя я не уверен, почему.
На сервере Node.js в /public/js есть два скрипта. Один (file1.js
) имеет функцию func()
. file2.js
в том же каталоге успешно вызывает func()
. Нигде нет module.export
ing или require
ing, но эти два файла работают вместе. Однако они оба упоминаются в файле index.ejs. Здесь они становятся способными общаться?
//file1.js
function func() {
console.info("foo")
}
//file2.js
func()
//index.ejs
...
<script src = "public/js/file1.js"></script>
<script src = "public/js/file2.js"></script>
...
Целый день читаю и ничего не могу найти по этой теме.
«Именно здесь они становятся способными общаться?». Абсолютно.
Я думаю, что путаница здесь заключается в том, что «вызывается из другого файла». Он не вызывается из другого файла. Этот файл извлекается и обрабатывается в вашем основном файле. Фактическое выполнение вызова происходит из основного файла.
Потрясающе, спасибо!
Продолжите, тогда зачем module.exports вообще необходим?
@jsarbour Это статические файлы javascript, которые анализируются и выполняются браузером. Браузер не поддерживает синтаксис module.exports
. Возможно, вы захотите просмотреть этот пост – matteoagosti.com/blog/2013/02/24/…
Вы должны понимать, как глобальное пространство ведет себя в Javascript.
Этот код:
<script src = "public/js/file1.js"></script>
<script src = "public/js/file2.js"></script>
То же, что:
<script>
//file1.js
function func() {
console.info("foo");
}
func();
</script>
Потому что, как только file1.js
загружается, все, что определено внутри него, становится доступным в любом месте той страницы, где оно было включено.
Поскольку file2.js
использует содержимое file1.js
, это будет работать, потому что func
доступен для использования в любом месте ниже включения file1.js
.
Спасибо! Тогда почему модуль module.exports() и необходимость локального файла всегда необходимы? Это потому, что такие файлы не указаны в файле index.ejs?
Я думаю, вы что-то путаете здесь. При экспорте модуля вы хотите, чтобы содержимое, которое вы экспортируете, было доступно с помощью вызова «import». Так что этот ответ предназначен только для вашего обычного приложения и не связан с какими-либо модулями.
импорт? Не требуется ()?
Те модули, о которых вы говорите, основаны на сервере. и Не в браузере. Таким образом, вы не можете поместить файл, который вам нужно использовать, в браузере на сервисных модулях.
@jsarbour Вы должны проверить мой комментарий к вопросу. Там есть ссылка на статью, которая может помочь вам понять эти концепции.
Да, require() не импортируется, извините, чувак. лол, я много делаю Type Script с Angular, вот почему. Извини за это.
Ваш вопрос о том, как JavaScript работает в браузере.
Node.js здесь неуместен. Все, что он делает, — это запускает программу HTTP-сервера, которая передает браузеру статические файлы.
Когда вы загружаете скрипт в браузер с помощью элемента скрипта (и не используете type = "module"
), любая переменная в самой внешней области действия файла скрипта (например, которая не находится let
внутри блока или var
внутри функции) становится Глобальный и доступен для любого другого скрипта, загруженного таким же образом в тот же HTML-документ.
Глобальные переменные запутаны, и это хороший способ случайного взаимодействия разных фрагментов кода друг с другом, поэтому современный JavaScript обычно избегает их использования. Этот стиль программирования на JavaScript не был распространен, когда JS впервые был реализован в браузерах: отсюда и поведение, описанное выше.
Вот почему люди начали использовать такие методы, как раскрывающийся шаблон модуля, и почему модули AMD и Узел были разработаны до того, как стандартные модули JavaScript был добавлен в спецификацию.
Тег
script
заставляет логику извлекать и включать источники файлов в файл, как если бы они были встроенными. Как только файл file1.js будет обработан, все ресурсы, которые он определяет глобально, будут доступны с этого момента.