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

Posted

技术标签:

【中文标题】如何告诉 Dojo 构建忽略“缺失”模板【英文标题】:How do I tell Dojo build to ignore a 'missing' template 【发布时间】:2013-04-29 16:17:59 【问题描述】:

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

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

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

error(311) 缺少依赖项。模块: 应用程序/导航/导航管理器;依赖: dojo/text!/author/app/templates/NavigationManager-content.html;错误: 错误:文本资源 (/author/app/templates/NavigationManager-content.html/x) 丢失

我了解这里发生了什么,构建过程正在尝试将字符串内部化,但是当它去寻找它时,它找不到它,因此将其标记为缺失的依赖项。

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

    不知何故,告诉 Dojo 忽略这个丢失的依赖项 - 这很好,但我需要能够具体,这样我就会收到任何其他可能丢失的依赖项的警报 不知何故,告诉 Dojo 不要尝试内化此模板 - 这也可以,因为这里没有什么可内化的。 不知何故,将依赖关系存根,以便依赖关系解析通过,但内部化不会发生。

我看到了对 实习生字符串跳过列表 值,但以下都没有帮助:

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

有什么建议吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

顺便说一句,据我了解,documentation to depsScan transform、internStringsSkipList 只能用于跳过使用传统表示法指定的资源(dojo.something,例如dojo.moduleUrl)。

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

符号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.js (on 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,只要您不指定自定义插件解析器(它会期望文件物理存在于磁盘上),项目就可以正常编译。

【讨论】:

Amiramix,我遇到了同样的问题,我正在努力遵循您的回答。你介意我直接联系你吗? 当然,在我的个人资料中,您可以找到我的个人网站,在那里您可以看到我的电子邮件(除非您想通过其他方式与我联系?)。【参考方案2】:

这不是你的问题,但对于那些面临error(311) 问题的人来说,最常见的解决方案是:

不要以斜杠开始模板路径

不好:

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

好:

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

您的模板路径不是普通的普通 URL。它仍然是 Dojo 构建的一部分,因此您使用 Dojo 构建路径来访问模板。

【讨论】:

以上是关于如何告诉 Dojo 构建忽略“缺失”模板的主要内容,如果未能解决你的问题,请参考以下文章

映射列值时忽略缺失值

oracle创建实例时出现ORA- 00922缺失或无效,忽略后出现ORA-28000账号已被锁定。

在 Azure DevOps 中,与相同的 YAML 管道模板相比,经典编辑器模板中的任务缺失

忽略测试数据上缺失单词特征的方法

使用 statsmodels 忽略多个 OLS 回归中的缺失值

shell创建长目录,目录存在则忽略,缺失则创建