我遇到了完全相同的问题,在阅读了大量 dojo 文档和源代码后,我得出的结论是,即使几乎不可能做到,也非常困难。但是,有一个非常简单和优雅的解决方法。但在告诉您如何首先解决问题之前,为什么首先需要一种解决方法(以便您可以根据自己的情况调整解决方案):
第一个问题,资源不可发现
根据 dojo 构建系统参考指南的概述部分:
[构建系统]“发现”一组资源,然后将一组同步的、有序的依赖于资源的转换应用于这些资源。(...) 发现资源时,会使用一个或多个标志来标记该资源,以帮助识别该资源的角色。(…) 发现并标记资源后,系统会分配一组要应用于该资源的转换。
简而言之,构建系统无法发现动态生成的任何资源,因为它们不驻留在文件系统上。如果它们不能被发现,那么它们就不能被标记,也不能对其应用任何转换。特别是,resourceTags
不调用此类资源,并且您不能将它们放在exclude
配置文件层定义的列表中(比较创建构建中的层部分)。
顺便说一句,据我了解depsScan transform 的文档,internStringsSkipList
只能用于跳过使用遗留符号(dojo.something
例如dojo.moduleUrl
)指定的资源。
第二个问题,插件解析器需要一个物理文件
Notationdojo/text!/some/url
表示将dojo/text.js
组件用作插件。我在这张票中找到了这张纸条:
每个 AMD 插件都应该有一个插件解析器,util/build/plugins
并在util/build/buildControlDefault
.
如果您检查util/build/plugins/text.js
(例如在 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 文档:
找到所有依赖项后,转换确保所有依赖项都存在于发现的模块中。缺少依赖项会导致错误被记录到控制台和构建报告中。
这可以通过重新定义transformJobs
包含自定义转换来实现depsScan
。请参阅util/build/buildControlDefault.js
(在 Github 上)和此论坛帖子以获取更多见解。
简单的解决方法
只需创建自己的插件来加载资源。您自己的插件不会注册插件解析器(请参阅上面的第二个问题),编译时您将得到的只是可怕的
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
添加其自定义加载功能。这是对这个 dojo-toolkit 论坛帖子上发布的另一个示例的改编。你可以在JSFiddle上看到他们的代码。
在我的项目中,我使用这样的插件:
define(["./json!/path/to/an/json"],
function(values){
return values;
});
您的插件可以只返回加载的模板而不将其解析为 JSON,只要您不指定自定义插件解析器(它希望文件物理存在于磁盘上),项目就可以正常编译。