我无可救药地试图为我的 AMD 项目提供Dojo builds
的Dijit 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。