我如何告诉Dojo build忽略一个';缺失';模板
我们的应用程序有许多小部件,它们使用通过JSP动态生成的模板 在前端代码中,它们是使用dojo/text插件包含的。这确保了小部件生命周期不会启动,直到模板被解析并且工作正常 不幸的是,当我们尝试执行构建时,会出现311错误: 错误(311)缺少依赖项。模块: 应用程序/导航/导航管理器;附属国: dojo/text/author/app/templates/NavigationManager-content.html;错误: 错误:文本资源 (/author/app/templates/NavigationManager content.html/x)缺少 我知道这里发生了什么,构建过程试图将字符串内部化,但是当它查找字符串时,它找不到它,因此将其标记为缺少的依赖项 我在这里看到了许多选择:我如何告诉Dojo build忽略一个';缺失';模板,build,dojo,Build,Dojo,我们的应用程序有许多小部件,它们使用通过JSP动态生成的模板 在前端代码中,它们是使用dojo/text插件包含的。这确保了小部件生命周期不会启动,直到模板被解析并且工作正常 不幸的是,当我们尝试执行构建时,会出现311错误: 错误(311)缺少依赖项。模块: 应用程序/导航/导航管理器;附属国: dojo/text/author/app/templates/NavigationManager-content.html;错误: 错误:文本资源 (/author/app/templates/Nav
internStringsSkipList: ['/author/pepper/templates/NavigationManager-content.html']
internStringsSkipList: ['dojo/text!/author/pepper/templates/NavigationManager-content.html']
internStringsSkipList: ['/author/pepper/templates/NavigationManager-content.html/x']
有什么建议吗?我面临着完全相同的问题,在阅读了大量dojo文档和源代码后,我得出结论,这是非常困难的,甚至几乎不可能做到。然而,有一个非常简单和优雅的解决方法。但在告诉您如何首先解决问题之前,首先需要解决方法(以便您可以根据自己的情况调整解决方案): 第一个问题,资源是不可发现的 根据dojo构建系统的概述部分: [构建系统]“发现”一组资源,然后对这些资源应用一组同步的、有序的、依赖于资源的转换。(…)发现资源时,将使用一个或多个标志对其进行标记,以帮助识别该资源的角色。(…)发现并标记资源后,系统将分配一组将应用于该资源的转换 因此,简而言之,任何动态生成的资源都无法被构建系统发现,因为它们不驻留在文件系统中。如果它们不能被发现,那么它们就不能被标记,也不能对其应用任何转换。特别是,此类资源不会调用
resourceTags
,您不能将它们放在纵断面图层定义的exclude
列表中(比较中的剖面图层)
顺便说一句,据我所知,interestringsskiplist
只能用于跳过使用传统符号(dojo.something
,例如,dojo.moduleUrl
)指定的资源
第二个问题,插件解析器需要一个物理文件
符号dojo/text/有些/url
说使用dojo/text.js
组件作为插件。我发现这张便条在:
每个AMD插件都应该在util/build/plugins
中有一个插件解析器,并在util/build/buildControlDefault
中注册
如果选中util/build/plugins/text.js
(例如),您将看到抛出错误,因为依赖项(位于dojo/text!
之后的部分存储在moduleInfo
中)不在资源
数组中:
textResource = bc.resources[moduleInfo.url];
if (!textResource){
throw new Error("text resource (" + moduleInfo.url + ") missing");
}
这正是因为在“发现”阶段无法发现资源
难题
在困难的解决方案中,这可能有效,也可能无效,您需要更改转换depscan
的工作方式。基本上,当depscan
遇到dojo/text/some/url
它调用插件解析器来检查依赖关系是否存在。从:
一旦找到所有依赖项,转换将确保发现的模块中存在所有依赖项。缺少依赖项会导致将错误记录到控制台和生成报告中
通过重新定义transformJobs
以包含depscan
的自定义转换,这可能是可能的。请参阅util/build/buildControlDefault.js
(),了解更多信息
简单的解决方法
只需创建自己的插件来加载资源。您自己的插件不会注册插件解析程序(请参阅上面的第二个问题),编译时得到的只是可怕的问题
warn(224)遇到插件依赖项,但没有生成时插件解析程序。
这是我的插件示例,动态加载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
添加其自定义加载函数。这是对上发布的另一个示例的改编。你可以在屏幕上看到他们的代码
在我的项目中,我使用的插件如下:
define(["./json!/path/to/an/json"],
function(values){
return values;
});
你的插件只需返回加载的模板,而无需将其解析为JSON,并且只要你不指定自定义插件解析器(该解析器希望文件物理上存在于磁盘上),项目就可以正常编译。这不是你的问题,但对于那些面临
错误(311)的人来说,这是最常见的解决方案
问题在于:
不要以斜杠开始模板路径
坏的:
好:
你的模板路径不是一个普通的URL。它仍然是Dojo构建的一部分,因此您可以使用Dojo构建路径来访问模板。Amiramix,我也遇到了同样的问题,我很难找到您的答案。你介意我直接联系你吗?当然,在我的个人资料中,你可以找到我的个人网站,在那里你可以看到我的电子邮件(除非你想用其他方式联系我?)。
"dojo/text!/app/template/widget.html"
"dojo/text!app/template/widget.html"