meteorJS:使用外部脚本

有一些服务(比如像FB或AddThis)提供了一段代码。 看起来像

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

好的,酷,所以通常你把它粘贴到你的HTML和它的作品。 不与meteor。

以下是我所看到的:

  • 模板/正文内的<script> 没有加载 – 我没有看到它在资源中,meteor的东西实际上是阻止浏览器识别它作为一个JS文件
  • 它从<head>

这里是问题和问题:

  1. 我不想从<head>加载它 – 因为速度
  2. 即使我从那里加载 – 我们有QA和PROD环境。 他们必须从不同的域加载这个脚本(比如service-domain-qa.com和service-domain.com)

令人惊讶的是,你不能<head>使用模板助手/variables。

使用传统的框架,这根本不是一个问题 – 你可以在任何地方包含脚本,只需加载; 你可以在你的服务器模板的任何部分使用逻辑/variables。

那么,我应该如何在meteor里做这个? 让我重复一遍:

  • 我需要一些外部脚本(托pipe在第三方域)加载到我的应用程序页面
  • 将这个脚本保存到我的项目文件夹不是一个选项
  • 脚本path取决于环境(我们已经有设置系统),所以呈现它的模板的位置应该从代码中传递一些数据

我知道如何通过Template.created从我的代码(使用LAB.js或其他)加载dynamic脚本来实现这一点,但这太过于夸张了。

正文或模板中的<script>标签不被Meteor执行,它们被parsing,然后由Meteor的模板系统处理。 你不能期望任何一个脚本标记就像正常的HTML页面那样工作。

解决scheme是使用模板事件(您可以手动将脚本标签附加到正文或其他东西)或dynamic加载它,就像你说的。 这不是矫枉过正,它是Meteor的工作原理 – 记住,没有传统的HTML页面或主体,只有Meteor API,Meteor API指定为了加载和执行外部脚本,必须使用适当的API方法。

我的解决scheme是使用包。 有关更多详细信息,请参阅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> 

如果您使用IronRouter,则可以使用以下软件包加载外部scipt: https : //github.com/DerMambo/wait-on-lib

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

为什么不使用jQuery的getscript?

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

您可以添加一个callback函数

你可以使用像yepnope这样的asynchronous加载脚本。 当我需要的时候,我使用它来加载传单。 我开始转移到通过yepnope加载更多的脚本,以便我的应用程序呈现初始页面加载时的最小值。 我把yepnope的东西放在Template.created里面。

使用iframe和公共目录是我用来获取embedded脚本代码的黑客。 在这是谷歌的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文件,并使用我的谷歌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> 

尽pipe这样做并不理想(但我认为这违反了谷歌的服务条款)。

我正在使用METEOR 1.0。 我已经将所有外部SCRIPT标签放在布局模板中标签之前的DIV元素中。 meteor认可他们没有任何问题,他们被浏览器加载。