templates - Dojo 构建请求已内联的模板

标签 templates build dojo google-closure-compiler

我正在绝望地尝试制作 Dijit template Dojo builds 的内联功能对于我的 AMD 项目工作,还没有运气......

特殊的问题不在于 HTML 模板本身的内联,而是在成功内联后仍使用 Ajax (XHR) 请求它们的事实。

模板内联方式如下:

"url:app/widgets/Example/templates/example.html": '<div>\n\tHello World!</div>'

在构建之后,Dijit 小部件本身定义了这样的模板:
define("dojo/_base/declare,dijit/_Widget,dojo/text!./templates/example.html".split(","), function (f, g, d) {
    return f("MyApp.Example", [g], {
        templateString: d,
    });
});

我尝试构建:
  • 收缩安全/闭合优化器
  • 相对/绝对路径
  • 使用旧的 cache()方法
  • 使用 templatePath属性(property)

  • 但即使在成功构建(0 个错误和一些警告)并内联模板后,Dojo/Dijit 仍然向这些资源发出 Ajax 请求。

    这是我的构建配置文件:
    var profile = {
        basePath: '../src/',
        action: 'release',
        cssOptimize: 'comments',
        mini: true,
        optimize: 'closure',
        layerOptimize: 'closure',
        stripConsole: 'all',
        selectorEngine: 'acme',
        internStrings: true,
        internStringsSkipList: false,
        packages: [
            'dojo',
            'dijit',
            'dojox',
            'app'
        ],
        layers: {
            'dojo/dojo': {
                include: [
                    'app/run'
                ],
                boot: true,
                customBase: true
            },
        },
        staticHasFeatures: {
            'dojo-trace-api': 0,
            'dojo-log-api': 0,
            'dojo-publish-privates': 0,
            'dojo-sync-loader': 0,
            'dojo-xhr-factory': 0,
            'dojo-test-sniff': 0
        }
    };
    

    由于这个问题,我的应用程序完全无法使用,因为要单独下载太多文件(浏览器对并行连接数有限制)。

    非常感谢您提前!

    更新 :

    在我的 index.html 中加载 dojo.js 和 run.js 的两行:
    <script data-dojo-config='async: 1, tlmSiblingOfDojo: 0, isDebug: 1' src='/public/dojo/dojo.js'></script>
    <script src='/public/app-desktop/run.js'></script>
    

    这是新的 build-profile :
    var profile = {
        basePath: '../src/',
        action: 'release',
        cssOptimize: 'comments',
        mini: true,
        internStrings: true,
        optimize: 'closure',
        layerOptimize: 'closure',
        stripConsole: 'all',
        selectorEngine: 'acme',
        packages        : [
            'dojo',
            'dijit',
            'app-desktop'
        ],
        layers: {
            'dojo/dojo': {
                include: [
                    'dojo/request/xhr',
                    'dojo/i18n',
                    'dojo/domReady',
                    'app-desktop/main'
                ],
                boot: true,
                customBase: true
            }
        },
        staticHasFeatures: {
            'dojo-trace-api': 0,
            'dojo-log-api': 0,
            'dojo-publish-privates': 0,
            'dojo-sync-loader': 0,
            'dojo-xhr-factory': 0,
            'dojo-test-sniff': 0
        }
    };
    

    我的新 run.js文件 :
    require({
        async: 1,
        isDebug: 1,
        baseUrl: '/public',
        packages: [
            'dojo',
            'dijit',
            'dojox',
            'saga',
            'historyjs',
            'wysihtml5',
            'app-shared',
            'jquery',
            'jcrop',
            'introjs',
            'app-desktop'
        ],
        deps: [
            'app-desktop/main',
            'dojo/domReady!'
        ],
        callback: function (Main) {
            debugger;
            var main = new Main();
            debugger;
            main.init();
        }
    });
    

    和我的 main.js文件如下所示:
    define([
        'dojo/_base/declare',
        'app-desktop/widgets/Application',
        'app-desktop/config/Config',
        'saga/utils/Prototyping',
        'dojo/window',
        'dojo/domReady!'
    ], function (declare, Application, ConfigClass, Prototyping, win) {
    
        return declare([], {
            init: function() {
    
                // ... other stuff
    
                application = new Application();
                application.placeAt(document.body);
    
                // ... some more stuff
            }
        });
    
    });
    

    build-mode ,我收到以下错误:
    GET http://localhost:4000/app-desktop/run.js 404 (Not Found)
    

    这很奇怪,因为这意味着构建过程使得 dojo 具有外部依赖项而不是已经内联的 dojoConfig构建文件中的变量。

    normal-mode , 文件被请求,但应用程序从未创建。

    在这两种情况下,run.js 文件中设置的两个调试器都没有运行,这意味着 callback由于某种原因,从未调用过方法。

    感谢您的帮助 !

    最佳答案

    我已经打印了 requireCacheUrl 的值和 require.cache在 dojo/text.js 的 load() 方法中进行控制台。至少在我的情况下,缓存中模板的键与一个前导斜杠上的查找键不同。

    例如,我有 "dojo/text!./templates/Address.html"在我的小部件中。它提供 key url:/app/view/templates/Address.html在缓存中,但被搜索为 url:app/view/templates/Address.html ,导致缓存未命中和 xhr 请求。

    在 dojo/text.js(版本 1.9.1 的第 183 行)中添加额外的斜杠,它似乎有效(该行看起来像 requireCacheUrl = "url:/" + url)。

    不确定这个“修复”会引入什么样的错误。因此,可能值得向道场人员报告此问题。

    UPD:嗯,我看到你已经报告了这个问题。这是链接:https://bugs.dojotoolkit.org/ticket/17458 .

    UPD:不要使用上述 hack。这只是试图缩小问题。我项目中的真正问题是包和 baseUrl 设置。最初我基于 https://github.com/csnover/dojo-boilerplate 创建了我的项目.然后将其修复为 neonstalwart's sample .

    关于templates - Dojo 构建请求已内联的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806677/

    相关文章:

    c++ - 将无符号类型强制转换为 C++ 模板类型名

    templates - 在 Smarty 中扩展基本模板

    android - 有时使用 dexdebug 构建失败?

    html - CSS不继承父类属性

    javascript - 向 dojo DataGrid 项添加工具提示

    javascript - 使用 Dojo 构建工具时出现问题,尝试使用已编译脚本时出现 'could not load' 错误

    c++ - 函数模板的这两个定义有什么区别?

    C++ 部分方法特化

    java - 如何自动将所有相关类收集到一个jar中(使用maven)?

    构建中断图像链接