文案怎么办!插件使用 baseUrl?
How does the text! plugin use the baseUrl?
我在获取文本时遇到问题!在我的 requirejs 网站上工作的插件。它总是在请求 url 中包含 lib/,但是所有其他文件(不使用文本!)都已成功找到并加载。这是我的目录结构:
WebContent/
|--backbone/
|--Bunch of folders and files
|--config/
|--config.js
|--lib/
|--jquery.js
|--text.js
|--require.js
|--index.html
我的 index.html 文件是:
<body>
<div id="siteLayoutContainer"></div>
<script data-main='config/config' src="lib/require.js"></script>
</body>
配置文件是:
requirejs.config({
baseUrl: './',
paths: {
jquery: 'lib/jquery.js',
backbone: 'lib/backbone.js',
text: 'lib/text',
application: 'backbone/application'
},
text: {
env: 'xhr'
}
});
require(['application'], function(App) {
App.start();
});
我用的是文字!像这样的插件:
define([
'jquery',
'text!backbone/templates/SomeTemplate.html'
], function(jQuery, NotFoundHtml) {
//Some code here
}
因此,在上面的脚本中,用于模板的 url 是:
http://localhost/lib/backbone/templates/SomeTemplate.html
我希望它是:
http://localhost/backbone/templates/SomeTemplate.html
我试过以下方法:
- 将 text.js 和 require.js 文件移出到 WebContent
目录,但我得到相同的结果。还有一点有趣的是
如果我在文本后面放一个 space !然后是工作正常的路径
在获取 html 的请求中不包含 lib/ 目录
模板。但是优化器包含 space 并且找不到
模板。
- 未定义 baseUrl - 结果相同。
- 移动了
在它自己运行的脚本标签中要求 config.js 内容进入 index.html
在 require.js 脚本标记之前 - 结果相同。
- 去掉配置文件中的文本选项
- 哦,是的,忘了我也试过 'text!../backbone/templates/SomeTemplate.html - 结果相同
所以我卡住了,不知道我错过了什么。我显然不理解文本!插件使用 baseUrl 或它如何确定 url 它将用于获取定义的文件。
编辑问题后,它现在包含诊断问题的所有信息。正如您在其中一条评论中所猜测的那样,问题确实在于这条路径:
backbone: 'lib/backbone.js',
正在放弃您提供给 text
插件的模板的分辨率。当文本插件加载您提供给它的内容时,它会采用 !
符号后的路径并将其视为模块名称,并通过模块解析过程。模块解析的工作方式是检查是否有一个前缀与 paths
中的任何键匹配,并将用与该键关联的值更改前缀,从而给出您获得的结果。解决此问题的一种方法是将其添加到您的 paths
配置中:
"backbone/templates": "backbone/templates"
这将使您在 backbone/templates
下请求的任何内容都不会被 backbone
路径搞乱。
注意:最好避免在模块名称中添加扩展名,因此您应该将其从 jQuery 和 Backbone.
的值中删除
我在获取文本时遇到问题!在我的 requirejs 网站上工作的插件。它总是在请求 url 中包含 lib/,但是所有其他文件(不使用文本!)都已成功找到并加载。这是我的目录结构:
WebContent/
|--backbone/
|--Bunch of folders and files
|--config/
|--config.js
|--lib/
|--jquery.js
|--text.js
|--require.js
|--index.html
我的 index.html 文件是:
<body>
<div id="siteLayoutContainer"></div>
<script data-main='config/config' src="lib/require.js"></script>
</body>
配置文件是:
requirejs.config({
baseUrl: './',
paths: {
jquery: 'lib/jquery.js',
backbone: 'lib/backbone.js',
text: 'lib/text',
application: 'backbone/application'
},
text: {
env: 'xhr'
}
});
require(['application'], function(App) {
App.start();
});
我用的是文字!像这样的插件:
define([
'jquery',
'text!backbone/templates/SomeTemplate.html'
], function(jQuery, NotFoundHtml) {
//Some code here
}
因此,在上面的脚本中,用于模板的 url 是: http://localhost/lib/backbone/templates/SomeTemplate.html
我希望它是: http://localhost/backbone/templates/SomeTemplate.html
我试过以下方法:
- 将 text.js 和 require.js 文件移出到 WebContent 目录,但我得到相同的结果。还有一点有趣的是 如果我在文本后面放一个 space !然后是工作正常的路径 在获取 html 的请求中不包含 lib/ 目录 模板。但是优化器包含 space 并且找不到 模板。
- 未定义 baseUrl - 结果相同。
- 移动了 在它自己运行的脚本标签中要求 config.js 内容进入 index.html 在 require.js 脚本标记之前 - 结果相同。
- 去掉配置文件中的文本选项
- 哦,是的,忘了我也试过 'text!../backbone/templates/SomeTemplate.html - 结果相同
所以我卡住了,不知道我错过了什么。我显然不理解文本!插件使用 baseUrl 或它如何确定 url 它将用于获取定义的文件。
编辑问题后,它现在包含诊断问题的所有信息。正如您在其中一条评论中所猜测的那样,问题确实在于这条路径:
backbone: 'lib/backbone.js',
正在放弃您提供给 text
插件的模板的分辨率。当文本插件加载您提供给它的内容时,它会采用 !
符号后的路径并将其视为模块名称,并通过模块解析过程。模块解析的工作方式是检查是否有一个前缀与 paths
中的任何键匹配,并将用与该键关联的值更改前缀,从而给出您获得的结果。解决此问题的一种方法是将其添加到您的 paths
配置中:
"backbone/templates": "backbone/templates"
这将使您在 backbone/templates
下请求的任何内容都不会被 backbone
路径搞乱。
注意:最好避免在模块名称中添加扩展名,因此您应该将其从 jQuery 和 Backbone.
的值中删除