Подтвердить что ты не робот

Meteor JS: использовать внешний script

Существуют некоторые службы (например, такие как FB или AddThis), которые предоставляют фрагмент кода. Он выглядит как

<div class="service-name" data-something="x"></div>
<script type="text/javascript" src="http://service-domain.com/service-name.js"></script>

ОК, круто, так что обычно вы вставляете его в свой HTML, и он работает. Не с Метеор.

Вот что я вижу:

  • <script> внутри шаблона/тела не загружается - я не вижу его в ресурсах, что-то в Метеор фактически не позволяет браузеру распознавать его как файл JS
  • работает от <head>

Теперь вот проблемы и вопросы:

  • Я не хочу загружать его из <head> - из-за скорости
  • Даже если я загружу его оттуда - у нас есть среды QA и PROD. Они должны загружать этот script из разных доменов (например, service-domain-qa.com vs. service-domain.com).

И удивительно, что не может использовать помощники/переменные шаблона в <head>.

С традиционными фреймворками это не вопрос - вы можете включать скрипты где угодно, и они просто загружаются; вы можете использовать логику/переменные в любой части ваших серверных шаблонов.

Итак, как мне это сделать в Метеор? Позвольте мне повторить:

  • Мне нужно, чтобы на мою страницу приложения были загружены внешние скрипты (размещенные на стороннем домене).
  • Сохранение этого script в моей папке проекта не опция
  • Script путь зависит от среды (у нас уже есть система настроек), поэтому место шаблона, которое его отображает, должно быть передано некоторыми данными из кода

Я знаю способ достижения этой цели с динамической загрузкой script из моего кода (с помощью LAB.js или что-то еще) на Template.created, но это настолько перебор...

4b9b3361

Ответ 1

теги в теле или шаблонах не выполняются Meteor, они анализируются, а затем обрабатываются системой шаблонов Meteor. Вы не можете ожидать тега script в любом из них, чтобы просто работать, как с обычной HTML-страницей.

Решение состоит в использовании событий Template (где вы могли бы вручную добавить тег script в тело или что-то еще) или загрузить его динамически, как вы сказали. Это не переполняет, как работает Meteor - помните, что нет традиционной HTML-страницы или тела, там только Meteor API, а Meteor API указывает, что для загрузки и выполнения внешних скриптов вы должны использовать соответствующие методы API.

Ответ 2

Мое решение - это пакеты использования. Подробнее см. https://github.com/meteor/meteor/tree/master/packages/spiderable.

Package.describe({
  summary: "External script"
});

Package.on_use(function (api) {
  api.use(['templating'], 'client');

  api.add_files('external_script.html', 'client');
});



<head><script type="text/javascript" src=""//mc.yandex.ru/metrika/watch.js""></script></head>

Ответ 3

Если вы используете IronRouter, вы можете загрузить внешний скрипт с помощью этого пакета: https://github.com/DerMambo/wait-on-lib

Router.map( function () {
  this.route('codeEditor',{
    waitOn: IRLibLoader.load('https://some-external.com/javascript.js')
  });
});

Ответ 4

Почему бы не использовать jquery-реквизит?

http://api.jquery.com/jquery.getscript/

Вы можете добавить функцию обратного вызова

Ответ 5

Вы можете использовать нечто вроде yepnope для асинхронной загрузки script. Я использую это для загрузки листовки, когда и когда мне нужно. Я начинаю переходить к загрузке большего количества скриптов через yepnope, так что мое приложение делает минимальный минимум при начальной загрузке страницы. Я помещаю материал yepnope внутри Template.created.

Ответ 6

Использование iframe и общедоступного каталога было взломом, который я использовал для ввода script кода. В этом он был для кода google adwords, и я сделал этот основной шаблон html:

<iframe src="/gads.html?v={{{unique}}}" seamless width="160" height="600"
 scrolling="no" frameborder="0" marginheight="0" marginwidth="0"
 style="margin:0;padding:0;border:none;width:160px;height:600px"></iframe>

а затем в общедоступном каталоге поместите файл gads.html с моим кодом Google AdWords, например:

<html>
<head>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-54*********";
google_ad_slot = "66******";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
</body>
</html>

который работал, чтобы получить код на странице, хотя он далеко не идеален (во-первых, я считаю, что это нарушает условия обслуживания Google).

Ответ 7

Я использую METEOR 1.0. Я поместил все внешние теги SCRIPT внутри элемента DIV прямо перед тегом в шаблоне макета. Meteor распознает их без каких-либо проблем, и они загружаются браузером.