Dojo 构建请求已内联的模板



我无可救药地试图为我的 AMD 项目提供Dojo buildsDijit template内联功能,但还没有运气......

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

模板按以下方式内联:

"url:app/widgets/Example/templates/example.html": '<div>ntHello 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
    }
};

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

提前非常感谢!

更新:

加载道场的两行.js和运行.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 方法。

感谢您的帮助!

我已经打印了 requireCacheUrl 的值,并在 dojo/text.js 的方法 load() 中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 )。

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

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

UPD:不要使用上面描述的hack。这只是试图缩小问题范围。我的项目中真正的问题是包和baseUrl设置。最初,我基于 https://github.com/csnover/dojo-boilerplate 创建了我的项目。然后像在neonstalwart的样本中一样修复它。

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

最新更新