我毫无希望地尝试为我的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
}
};
由于这个问题,我的应用程序完全无法使用,因为有太多文件可以单独下载(浏览器对并行连接数有限制)。
非常感谢你!
更新:
两行加载了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
方法。
感谢您的帮助!
答案 0 :(得分:0)
这听起来像https://bugs.dojotoolkit.org/ticket/17141。如果是,则只需要更新到Dojo 1.9.1。
答案 1 :(得分: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:不要使用上述的黑客攻击。这只是试图缩小问题。我的项目中的真正问题是package和baseUrl设置。最初我基于https://github.com/csnover/dojo-boilerplate创建了我的项目。然后将其修改为neonstalwart's sample。