我正在开发谷歌应用脚本的HtmlServices。在这个脚本中,我实现了两个功能,Autocomplete和DataTable,为此使用了许多js和css文件。所有功能都运行良好,但是当脚本加载时,它需要花费太多时间。一旦脚本完全加载,那么它的工作正常。该脚本在网上发布。
那么,有什么办法可以减少加载时间吗?
答案 0 :(得分:1)
我遇到了同样的问题,但得出的结论是我设计的脚本是如何导致问题的。最初我设计了我的脚本来构建整个页面,然后将它呈现给用户。当脚本开始时,第一页似乎需要很长时间才能显示页面看起来很慢。这很慢。
我现在正在切换到呈现一个快速显示的“加载...”类型页面。加载后,它会对服务器进行回调以构建页面的其余部分,并将其传递回客户端脚本以显示它。我还没有完全做到这一点,但看起来很有希望。
我不确定GAS会不会很快,因为它依赖于Caja。因此,我们需要在代码中使用良好的设计来尽可能地提供帮助。
答案 1 :(得分:1)
似乎在doGet()
开始和google.script.run
第一次执行时之间存在显着滞后。我创建了一个名为Simple的虚拟应用程序,它具有与我的应用程序类似的结构(基于演示应用程序),除了单个jQuery调用以在我的模板中设置文本之外什么都不做。
doGet()
加载了我的index.html
模板。我在我的index.html
模板中包含了我的CSS和Javascript,以进一步简化操作。
我设置了doGet()以在加载后立即评估模板。
在评估时,google.script.run
调用code.gs
中的虚函数,该函数不执行任何操作并返回null。成功之后,它调用javascript来更新页面,这会执行单个jQuery来更新我的html元素。模板有" Hello world!"在其中,这被替换为"你好其他世界!"
这是微不足道的。模板几乎立即加载,显示" Hello world!"但是单个jQuery调用更新内容大约需要6秒钟。此性能反映了我的实际应用程序正在做的事情一旦应用程序进入javascript,后续调用google.script.run的速度非常快。
有趣的是,我可以在Web开发环境中评估doGet()
并在半秒钟内运行,执行脚本确认所有适当的调用,包括jQuery引用。
这表明了一些事情。首先,doGet()
正在加载并快速显示模板(在调用template.evaluate()
上)。似乎第一次调用google.script.run
是延迟的地方,但只有当应用程序呈现给网络时才会这样。对google.script.run
的后续调用非常快,由我的工作应用程序演示,该应用程序有一个表单,我可以通过使用通过URL传递的变量调用google.script.run
来更新页面。
这种延迟使得针对网络应用的Google应用脚本对我能想到的大多数基于Web的应用都没有吸引力。这是不幸的,因为环境中有很多其他东西使它具有吸引力。
我很乐意根据要求与任何人分享我的示例代码。我也很想知道谷歌是否意识到这一点以及该问题的立场是什么。代码包含在下面:
function doGet(e) {
Logger.log('start');
var template = HtmlService.createTemplateFromFile('Index');
// Build and return HTML in IFRAME sandbox mode.
Logger.log('before template.evalute()');
return template.evaluate()
.setTitle('Web App Window Title')
.setSandboxMode(HtmlService.SandboxMode.IFRAME);
Logger.log('after template.evaluate()');
}
function getFolderContents() {
var contents = 0;
return contents;
}
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
<h1 id="main-heading">Hello world!</h1>
<!-- Use a templated HTML printing scriptlet to import JavaScript. -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
/**
* Run initializations on web app load.
*/
$(function() {
// Call the server here to retrieve any information needed to build the page.
google.script.run
.withSuccessHandler(function(contents) {
// Respond to success conditions here.
updateDisplay(contents);
})
.withFailureHandler(function(msg) {
// Respond to failure conditions here.
$('#main-heading').text(msg);
})
.getFolderContents();
});
function updateDisplay() {
$('#main-heading').text("Hello other world!");
}
</script>