Dojo构建请求已内联的模板

时间:2013-09-14 21:41:34

标签: templates build dojo google-closure-compiler

我毫无希望地尝试为我的AMD项目工作Dijit template Dojo builds内联功能而没有运气......

特定的问题不是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,
    });
});

我试图建立:

  • shrinksafe / closure optimiser
  • 相对/绝对路径
  • 使用旧的cache()方法
  • 使用templatePath属性

但即使在运行成功构建(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
    }
};

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

非常感谢你!

更新:

两行加载了dojo.js和我index.html中的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方法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这听起来像https://bugs.dojotoolkit.org/ticket/17141。如果是,则只需要更新到Dojo 1.9.1。

答案 1 :(得分:0)

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

例如,我的小部件中有"dojo/text!./templates/Address.html"。它在缓存中显示密钥url:/app/view/templates/Address.html,但搜索类似url:app/view/templates/Address.html,导致缓存未命中和xhr请求。

在dojo / text.js中使用额外的斜杠(版本1.9.1的第183行),它看起来很有用(行看起来像requireCacheUrl = "url:/" + url)。

不确定此“修复”可能引入的错误类型。所以,将这个问题报告给dojo人可能是值得的。

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

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