我正在绝望地尝试制作 Dijit template
Dojo builds
的内联功能对于我的 AMD 项目工作,还没有运气......
特殊的问题不在于 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
属性(property)但即使在成功构建(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
}
};
由于这个问题,我的应用程序完全无法使用,因为要单独下载太多文件(浏览器对并行连接数有限制)。
非常感谢您提前!
更新 :
在我的
index.html
中加载 dojo.js 和 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
由于某种原因,从未调用过方法。感谢您的帮助 !
最佳答案
我已经打印了 requireCacheUrl
的值和 require.cache
在 dojo/text.js 的 load() 方法中进行控制台。至少在我的情况下,缓存中模板的键与一个前导斜杠上的查找键不同。
例如,我有 "dojo/text!./templates/Address.html"
在我的小部件中。它提供 key 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's sample .
关于templates - Dojo 构建请求已内联的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806677/