1

我正在研究 Google Apps 脚本的 HtmlServices。在这个脚本中,我实现了两个功能,Autocomplete 和 DataTable,因为它使用了许多 js 和 css 文件。所有功能都运行良好,但是在加载脚本时,它花费了太多时间。一旦脚本完全加载,它就可以正常工作了。该脚本发布在网络上。

那么,有什么办法可以减少加载时间呢?

4

2 回答 2

2

doGet()似乎在开始和google.script.run第一次执行之间存在明显的滞后。我创建了一个名为 Simple 的虚拟应用程序,它与我的应用程序(基于演示应用程序)具有相似的结构,除了一个 jQuery 调用来设置我的模板中的文本之外什么都不做。

doGet()加载我的index.html模板。我在我的模板中包含了我的 CSS 和 Javascriptindex.html以进一步简化事情。

我设置 doGet() 以在加载模板后立即对其进行评估。

在评估时,google.script.run调用一个code.gs不执行任何操作并返回 null 的虚拟函数。成功时,它调用 javascript 来更新页面,该页面执行单个 jQuery 来更新我的 html 元素。模板有“Hello world!” 在其中,它被替换为“Hello other world!”

这几乎是微不足道的。模板几乎立即加载,显示“Hello world!” 但是通过单个 jQuery 调用更新内容大约需要 6 秒。这种性能反映了我的实际应用程序正在做什么。应用程序访问 javascript 后,对 google.script.run 的后续调用非常快。

有趣的是,我可以doGet()在 web 开发环境中进行评估,它在半秒内运行,执行记录确认所有适当的调用,包括 jQuery 引用,都已进行。

这说明了几件事。首先,非常快速地doGet()加载和显示模板(在调用时template.evaluate())。似乎第一次调用google.script.run是延迟所在,但仅当应用程序呈现给网络时。我的工作应用程序证明了后续调用google.script.run非常快,该应用程序有一个表单,我可以通过调用google.script.run通过 URL 传递的变量来更新页面。

这种延迟使得网络应用程序的谷歌应用程序脚本对于我能想到的大多数基于网络的应用程序都没有吸引力。这是不幸的,因为环境有很多其他的东西使它有吸引力。

我很高兴应要求与任何人分享我的示例代码。我也很想知道谷歌是否意识到这一点以及在这个问题上的立场。代码如下:

代码.gs:

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;
}

索引.html

<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>

于 2015-07-01T20:36:40.570 回答
1

我遇到了同样的问题,但得出的结论是我设计脚本的方式导致了这个问题。最初我设计我的脚本来构建整个页面,然后将其呈现给用户。当脚本开始时,第一页似乎需要很长时间才能呈现,这使得页面看起来很慢。它很慢。

我现在正在切换到呈现快速显示的“正在加载...”类型的页面。加载后,它对服务器进行回调以构建页面的其余部分,并将其传递回客户端脚本以呈现它。我还没有完全完成这个,但它看起来很有希望。

我不确定 GAS 是否会很快,因为它依赖于 Caja。因此我们需要在我们的代码中使用好的设计来尽可能地帮助。

于 2012-12-18T12:30:01.273 回答