我如何告诉Dojo build忽略一个';缺失';模板

我如何告诉Dojo build忽略一个';缺失';模板,build,dojo,Build,Dojo,我们的应用程序有许多小部件,它们使用通过JSP动态生成的模板 在前端代码中,它们是使用dojo/text插件包含的。这确保了小部件生命周期不会启动,直到模板被解析并且工作正常 不幸的是,当我们尝试执行构建时,会出现311错误: 错误(311)缺少依赖项。模块: 应用程序/导航/导航管理器;附属国: dojo/text/author/app/templates/NavigationManager-content.html;错误: 错误:文本资源 (/author/app/templates/Nav

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

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

不幸的是,当我们尝试执行构建时,会出现311错误:

错误(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']
    

    有什么建议吗?

    我面临着完全相同的问题,在阅读了大量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"