如何告诉Dojo构建忽略“缺失”模板

时间:2013-04-29 16:18:00

标签: build dojo

我们的应用程序有许多小部件,它们使用通过JSP动态生成的模板。

在前端代码中,使用dojo / text插件包含它们。这可以确保在模板解析完成后,Widget生命周期不会启动,并且工作正常。

不幸的是,当我们尝试执行构建时,我们收到311错误:

  

错误(311)缺少依赖性。模块:   应用程序/导航/ NavigationManager;依赖性:   道场/文/author/app/templates/NavigationManager-content.html!;错误:   错误:文本资源   (/author/app/templates/NavigationManager-content.html/x)缺少

我理解这里发生了什么,构建过程试图内化字符串,但是当它去寻找它时,它无法找到它,因此将其标记为缺少的依赖项。

我在这里看到了很多选项:

  1. 不知怎的,告诉Dojo忽略这个缺失的依赖 - 这没关系,但是我需要能够具体,以便我可以提醒任何其他可能缺少的依赖
  2. 不知怎的,告诉Dojo不要试图将这个模板内化 - 这也没关系,因为这里没有内化。
  3. 不知何故,将依赖关系存根,以便依赖关系解析通过,但内部化不会发生。
  4. 我见过对这个的引用 internStringsSkipList  价值,但以下都没有帮助:

    internStringsSkipList: ['/author/pepper/templates/NavigationManager-content.html']
    internStringsSkipList: ['dojo/text!/author/pepper/templates/NavigationManager-content.html']
    internStringsSkipList: ['/author/pepper/templates/NavigationManager-content.html/x']
    

    有什么建议吗?

2 个答案:

答案 0 :(得分:9)

我遇到了完全相同的问题,在阅读了大量的dojo文档和源代码后,我得出的结论是,如果几乎不可能做到这一点很困难。然而,有一个非常简单和优雅的解决方法。但在告诉您如何首先解决问题之前,为什么首先需要解决方法(因此您可以根据自己的情况调整解决方案):

第一个问题,资源是不可发现的

根据dojo构建系统Reference Guide的概述部分:

  

[构建系统]“发现”一组资源,然后将同步的,有序的资源相关变换集应用于这些资源。 (...)当发现资源时,它会被标记一个或多个标志,以帮助识别该资源的角色。 (...)在发现并标记资源后,系统会分配一组要应用于该资源的转换。

简而言之,构建系统无法动态生成任何动态资源,因为它们不会驻留在文件系统上。如果无法发现它们,则无法对其进行标记,也无法对其进行转换。特别是,resourceTags不会针对此类资源调用,您无法将它们放在配置文件图层定义的exclude列表中(比较Creating Builds中的图层部分)。

BTW,据我所知documentation to depsScan transforminternStringsSkipList只能用于跳过使用遗留表示法指定的资源(dojo.something,例如dojo.moduleUrl)。< / p>

第二个问题,插件解析器需要一个物理文件

表示法dojo/text!/some/url表示使用dojo/text.js组件作为插件。我在this ticket中找到了这个说明:

  

每个AMD插件都应该在util/build/plugins中有一个插件解析器,并在util/build/buildControlDefault中注册。

如果您选中util/build/plugins/text.js(例如on Github),您会看到错误被抛出,因为依赖关系(dojo/text!之后的部分存储在moduleInfo中})不在resources数组中:

textResource = bc.resources[moduleInfo.url];
if (!textResource){
  throw new Error("text resource (" + moduleInfo.url + ") missing");
}

这正是因为在“发现”期间无法发现资源。相。

困难的解决方案

在困难的解决方案中,可能会或可能不会起作用,您需要更改转换depsScan的工作方式。基本上,当depsScan遇到dojo/text!/some/url时,它会调用插件解析器来检查依赖项是否存在。来自depsScan documentation

  

找到所有依赖项后,转换可确保发现的模块中存在所有依赖项。缺少依赖项会导致将错误记录到控制台和构建报告中。

通过重新定义transformJobs以包含depsScan的自定义转换,可以实现这一点。有关更多见解,请参阅util/build/buildControlDefault.json Github)和this forum post

简单的解决方法

只需创建自己的插件即可加载资源。你自己的插件没有注册插件解析器(参见上面的第二个问题),编译时你得到的只是可怕的

warn(224) A plugin dependency was encountered but there was no build-time plugin resolver.

这是我动态加载JSON资源的插件示例:

define(["dojo/text", "dojo/_base/lang", "dojo/json"],
function(text,lang,json){
  return lang.delegate(text, {
    load: function(id, require, load){
      text.load(id, require, function(data){
        load(json.parse(data));
      });
    }
  });
});

它重用dojo/text添加其自定义加载功能。这是对this dojo-toolkit forum post上发布的另一个例子的改编。您可以在JSFiddle上看到他们的代码。

在我的项目中,我使用这样的插件:

define(["./json!/path/to/an/json"],
function(values){
  return values;
});

你的插件可以只返回加载的模板而不将其解析为JSON,只要你没有指定你的自定义插件解析器(它希望文件在磁盘上物理存在),项目就可以正常编译。

答案 1 :(得分:0)

这不是您的问题,但面对error(311)问题的人最常见的解决方案是:

不要使用斜杠启动模板路径。

为:

"dojo/text!/app/template/widget.html"

好:

"dojo/text!app/template/widget.html"

您的模板路径不是正常的,简单的&#39; URL。它仍然是Dojo构建的一部分,因此您使用Dojo构建路径来获取模板。