Дополнительно
Как включить файл JavaScript в другой файл JavaScript?
Есть ли что-то в JavaScript, похожее на @ import
в CSS, которое позволяет включать файл JavaScript в другой файл JavaScript?
4870
50
Старые версии JavaScript не имели импорта, включения или требования, поэтому было разработано много различных подходов к этой проблеме.
Но с 2015 года (ES6) JavaScript имеет стандарт ES6 modules для импорта модулей в Node.js, который также поддерживается [большинством современных браузеров] ( https ://caniuse.com/#feat=es6-модуль).
Для совместимости со старыми браузерами можно использовать инструменты build и / или transpilation.
ES6 Модули
Модули ECMAScript (ES6) поддерживаются в Node.js с версии 8.5 с флагом
-experimental-modules
. Все задействованные файлы должны иметь расширение.mjs
.ECMAScript модули в браузерах
Браузеры имели поддержку для прямой загрузки модулей ECMAScript (никакие инструменты, такие как Webpack, не требуются) с тех пор Safari 10.1, Chrome 61, Firefox 60 и Edge 16. Проверьте текущую поддержку в caniuse.
Узнайте больше на https://jakearchibald.com/2017/es-modules-in-browers/
Динамический импорт в браузерах
Динамический импорт позволяет сценарию загружать другие сценарии по мере необходимости:
Узнайте больше на https://developers.google.com/web/updates/2017/11/dynamic-import
Node.js требуется
Старый стиль импорта модулей, все еще широко используемый в Node.js, - это система module.exports / require.
Есть и другие способы для JavaScript включить внешнее содержимое JavaScript в браузерах, которые не требуют предварительной обработки.
AJAX Загрузка
Вы можете загрузить дополнительный скрипт с помощью вызова AJAX, а затем использовать
eval
для его запуска. Это самый простой способ, но он ограничен вашим доменом из-за модели безопасности песочницы JavaScript. Использованиеeval
также открывает двери для ошибок, взломов и проблем безопасности.Получить Загрузка
Как и Dynamic Imports, вы можете загрузить один или несколько сценариев с помощью вызова
fetch
, используя обещания управлять порядком выполнения для зависимостей сценариев, используя библиотеку Fetch Inject.:jQuery Загрузка
Библиотека jQuery обеспечивает функцию загрузки в одной строке:
Динамический скрипт Загрузка
Вы можете добавить тег сценария с URL-адресом сценария в HTML. Чтобы избежать накладных расходов jQuery, это идеальное решение.
Сценарий может даже находиться на другом сервере. Кроме того, браузер оценивает код. Тег
< script >
можно ввести либо на веб-страницу< head >
, либо вставить непосредственно перед тегом закрытия< / body >
.Вот пример того, как это может работать:
Эта функция добавит новый тег
< script >
в конец раздела заголовка страницы, где атрибутsrc
устанавливается на URL, который задается функции в качестве первого параметра.Оба эти решения обсуждаются и иллюстрируются в JavaScript Madness: загрузка динамического скрипта.
Обнаружение, когда сценарий был выполнен
Теперь есть большая проблема, о которой вы должны знать. Это означает, что вы удаленно загружаете код . Современные веб-браузеры будут загружать файл и продолжать выполнять ваш текущий скрипт, потому что они загружают все асинхронно для повышения производительности. (Это относится как к методу jQuery, так и к методу ручной динамической загрузки скрипта.)
Это означает, что если вы используете эти трюки напрямую, вы не сможете использовать свой недавно загруженный код в следующей строке после того, как вы попросили его загрузить , потому что он все еще будет загружаться.
Например:
my_lovely_script.js
содержитMySuperObject
:Затем вы перезагружаете страницу, нажав F5 < / kbd >. И это работает! Смущает...
Так что с этим делать ?
Ну, вы можете использовать взлом, который автор предлагает в ссылке, которую я вам дал. Таким образом, для людей, которые спешат, он использует событие для запуска функции обратного вызова при загрузке сценария. Таким образом, вы можете поместить весь код с помощью удаленной библиотеки в функцию обратного вызова. Например:
Затем вы пишете код, который хотите использовать ПОСЛЕ загрузки скрипта в функцию lambda:
Тогда вы запускаете все это:
Обратите внимание, что скрипт может выполняться после загрузки DOM или до этого, в зависимости от браузера и от того, включили ли вы строку
script.async = false;
. Есть отличная статья о загрузке Javascript в целом, в которой обсуждается это.Исходный код слияния / предварительной обработки
Как упомянуто в верхней части этого ответа, многие разработчики используют в своих проектах инструменты сборки / переплета, такие как Parcel, Webpack или Babel, что позволяет им использовать предстоящий синтаксис JavaScript, обеспечивает обратную совместимость для старых браузеров, объединяет файлы, измельчает, выполнить разделение кода и т. д.
Если кто-то ищет что-то более продвинутое, попробуйте RequireJS. Вы получите дополнительные преимущества, такие как управление зависимостями, лучший параллелизм и избегание дублирования (то есть извлечение сценария более одного раза).
Вы можете написать свои файлы JavaScript в «модулях», а затем ссылаться на них как на зависимости в других скриптах. Или вы можете использовать RequireJS как простое решение «перейти к этому сценарию».
Пример:
Определите зависимости как модули:
some-dependency.js
implementation.js - это ваш «основной» файл JavaScript, который зависит от some-dependency.js
Отрывок из GitHub README:
На самом деле is способ загрузить файл JavaScript not асинхронно, чтобы вы могли использовать функции, включенные в ваш недавно загруженный файл, сразу после его загрузки, и я думаю, что он работает во всех браузерах.
Вам необходимо использовать
jQuery.append ()
в элементе< head >
, который:Однако, у этого метода также есть проблема: если в импортированном файле JavaScript произошла ошибка, ,[Firebug]1] ,(а также Firefox Error Console и [Инструменты разработчика Chrome]2] также) сообщит о своем месте неправильно, это большая проблема, если вы используете Firebug для отслеживания ошибок JavaScript (Я делаю). Firebug просто не знает о недавно загруженном файле по какой-то причине, поэтому, если в этом файле возникает ошибка, он сообщает, что она произошла в вашем основном файле HTML, и у вас возникнут проблемы с поиском реальной причины для ошибки.
Но если это не проблема для вас, то этот метод должен работать.
Я на самом деле написал плагин jQuery под названием $.import_js () , который использует этот метод:
Таким образом, все, что вам нужно сделать, чтобы импортировать JavaScript:
Я также сделал простой тест для этого в Пример.
Он включает файл main.js в главном HTML, а затем скрипт в
main.js
использует$.import_js ()
для импорта дополнительного файла с именемincluded.js
, который определяет эту функцию:И сразу после включения
included.js
вызывается функцияhello ()
, и вы получаете предупреждение.(Этот ответ в ответ на комментарий e-satis).
Другой способ, который, на мой взгляд, намного чище, - это сделать синхронный запрос Ajax вместо использования тега
< script >
. Так же и [Node.js][1] включает в себя маркеры.Вот пример использования jQuery:
Есть хорошие новости для вас. Очень скоро вы сможете легко загрузить код JavaScript. Это станет стандартным способом импорта модулей кода JavaScript и станет частью самого основного JavaScript.
Вам просто нужно написать
import cond из 'cond.js';
, чтобы загрузить макрос с именемcond
из файлаcond.js
.Таким образом, вам не нужно полагаться на какие-либо рамки JavaScript, а также не нужно явно совершать вызовы Ajax.
Обратитесь к:
[3]: http://wiki.ecmascript.org/doku.php?id = гармония: module_loaders
Можно динамически генерировать тег JavaScript и добавлять его в документ HTML из другого кода JavaScript. Это загрузит целевой файл JavaScript.
Заявление
import
содержится в ECMAScript 6.Синтаксис
Может быть, вы можете использовать эту функцию, которую я нашел на этой странице [Как включить файл JavaScript в файл JavaScript?][1] :
[1]: http://forums.digitalpoint.com/showthread.php?t = 146094
Вот синхронная версия без jQuery :
Я только что написал этот код JavaScript (используя Прототип для манипуляции DOM):
Использование:
Кулак: http://gist.github.com/284442.
Вот обобщенная версия того, как Facebook делает это для своей вездесущей кнопки «Мне нравится»
& Лт;!- начать фрагмент: js скрыть: false - >
& Лт;!- конец фрагмента - >
Если это работает для Facebook, это будет работать для вас.
Причина, по которой мы ищем первый элемент
script
вместоhead
илиbody
, заключается в том, что некоторые браузеры не создают его, если он отсутствует, но у нас гарантированно есть элементscript
- этот. Узнайте больше на http://www.jspatterns.com/the-ridiculous-case-of-adding-a-script-element/.Если вы хотите в чистом JavaScript, вы можете использовать
document.write
.Если вы используете библиотеку jQuery, вы можете использовать метод
$ .getScript
.Вы также можете собрать свои сценарии, используя PHP:
Файл
main.js.php
:Большинство решений, показанных здесь, подразумевают динамическую нагрузку. Вместо этого я искал компилятор, который собирал все зависающие файлы в один выходной файл. Так же, как препроцессоры Less / Sass имеют дело с правилом CSS
@import
. Поскольку я не нашел ничего приличного в этом роде, я написал простой инструмент для решения проблемы.Итак, вот компилятор https://github.com/dsheiko/jsic, который надежно заменяет
$ import ("file-path")
запрашиваемым содержимым файла. Вот соответствующий плагин Grunt: https://github.com/dsheiko/grunt-jsic.В основной ветке jQuery они просто объединяют файлы атомного источника в один, начиная с
intro.js
и заканчиваяouttro.js
. Это меня не устраивает, так как не обеспечивает гибкости при разработке исходного кода. Проверьте, как это работает с jsic:Теперь мы можем запустить компилятор:
И получите объединенный файл
build / main.js
Если вы хотите загрузить файл JavaScript с использованием функций из импортированного / включенного файла , вы также можете определить глобальный объект и установить функции в качестве элементов объекта. Например:
global.js
file1.js
file2.js
main.js
Вам просто нужно быть осторожным, когда вы включаете сценарии в файл HTML. Заказ должен быть как ниже:
Это должно сделать:
Или вместо включения во время выполнения используйте скрипт для объединения перед загрузкой.
Я использую Прокетки (я не знаю, есть ли другие). Вы создаете свой код JavaScript в отдельных файлах и включаете комментарии, которые обрабатываются механизмом Sprockets в том виде, в каком они есть. Для разработки вы можете включать файлы последовательно, а затем для производства, чтобы объединить их...
Смотрите также:
Если вы используете Web Workers и хотите включить дополнительные сценарии в область действия работника, другие ответы предоставляются о добавлении сценариев в тег
head
и т. Д. не будет работать для вас.К счастью, Web Workers имеют свою собственную функцию
importScripts
, которая является глобальной функцией в области веб-работника, которая является родной для самого браузера, поскольку она является частью спецификации.Кроме того, как второй самый высокий ответ, проголосовавший за ваш вопрос, RequireJS также может обрабатывать включение скриптов в веб-работника (вероятно, называя «importScripts» сам, но с некоторыми другими полезными функциями).
У меня была простая проблема, но я был озадачен ответами на этот вопрос.
Мне пришлось использовать переменную (myVar1), определенную в одном файле JavaScript (myvariables.js) в другом файле JavaScript (main.js).
Для этого я сделал, как ниже:
Загрузил код JavaScript в файле HTML, в правильном порядке, сначала mystariables.js, затем main.js:
Файл: myvariables.js
Файл: main.js
Как вы видели, я использовал переменную в одном файле JavaScript в другом файле JavaScript, но мне не нужно было включать одну в другой. Мне просто нужно было убедиться, что первый файл JavaScript загружен перед вторым файлом JavaScript, а переменные первого файла JavaScript доступны во втором файле JavaScript автоматически.
Это спасло мой день. Я надеюсь, что это поможет.
Синтаксис
@ import
для достижения импорта JavaScript в стиле CSS возможен с помощью инструмента, такого как [Mixture] (), через их специальный тип файла.mix
(см. Здесь). Я предполагаю, что приложение просто использует один из вышеупомянутых методов в отдельности, хотя я не знаю.Из документации по смеси в файлах
.mix
:Вот пример файла
.mix
, который объединяет несколько файлов.js
в один:Смесь выводит это как
scripts-global.js
, а также как минифицированная версия (scripts-global.min.js
).Примечание: я никоим образом не связан с Mixture, кроме как использовать его в качестве внешнего инструмента разработки. Я столкнулся с этим вопросом, увидев файл JavaScript
.mix
в действии (в одной из котельных смесей) и немного смутившись этим («вы можете сделать это?"Я думал про себя). Тогда я понял, что это был тип файла для конкретного приложения (несколько разочаровывающий, согласованный). Тем не менее, понял, что знания могут быть полезны для других.ОБНОВЛЕНИЕ : Смесь теперь бесплатная (офлайн).
ОБНОВЛЕНИЕ : Смесь сейчас снята с производства. Старые выбросы смеси все еще доступны