4

我绝望地试图让我的 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,
    });
});

我试图建立:

  • 收缩安全/关闭优化器
  • 相对/绝对路径
  • 使用旧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
    }
};

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

非常感谢您提前!

更新 :

在 my 中加载 dojo.js 和 run.js 的两行index.html

<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某种原因从未调用过该方法。

谢谢您的帮助 !

4

2 回答 2

0

我已经在 dojo/text.js 的 load() 方法中打印了requireCacheUrl和控制台的值。require.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:不要使用上面描述的hack。这只是试图缩小问题。我项目中的真正问题是包和 baseUrl 设置。最初,我基于https://github.com/csnover/dojo-boilerplate创建了我的项目。然后像在neonstalwart 的样本中一样修复它。

于 2013-09-23T18:57:49.680 回答
0

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

于 2013-09-15T05:00:21.490 回答