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>
这里是问题和问题:
- 我不想从
<head>
加载它 – 因为速度 - 即使我从那里加载 – 我们有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') }); });
你可以使用像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认可他们没有任何问题,他们被浏览器加载。