关于requirejs:文字如何!插件使用baseUrl吗?

How does the text! plugin use the baseUrl?

我在获取文字时遇到问题!插件可以在我的requirejs网站上使用。它始终在请求url中包含lib /,但是已成功找到并加载了所有其他文件(不使用文本!)。这是我的目录结构:

1
2
3
4
5
6
7
8
9
10
WebContent/
  |--backbone/
        |--Bunch of folders and files
  |--config/
        |--config.js
  |--lib/
        |--jquery.js
        |--text.js
        |--require.js
  |--index.html

我的index.html文件是:

1
2
3
4
<body>
   
    <script data-main='config/config' src="lib/require.js">
</body>

配置文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
});

我正在使用文字!像这样的插件:

1
2
3
4
5
6
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中
    目录,但我得到相同的结果。另外有趣的是
    如果我在文字后面加上空格!然后是可行的路径,
    在获取html的请求中不包含lib /目录
    模板。但是,优化程序包含该空间,无法找到
    模板。
  • 没有定义baseUrl-相同的结果。
  • 移动了
    在自己的脚本标签中要求将config.js内容转换为index.html
    在require.js脚本标记之前-相同的结果。
  • 摆脱配置文件中的文本选项
  • 哦,是的,忘记了我也尝试过'text!../ backbone / templates / SomeTemplate.html-相同的结果

所以我被困住了,无法弄清我想念的是什么。我显然不明白该怎么写!插件使用baseUrl或它如何确定用于获取已定义文件的URL。


在对问题进行编辑之后,它现在包含了用于诊断问题的所有信息。正如您在评论中所猜到的那样,问题确实在于以下路径:

1
backbone: 'lib/backbone.js',

放弃了您提供给text插件的模板的分辨率。当文本插件加载您提供的内容时,它将采用!符号后的路径,并将其视为模块名称,然后进行模块解析过程。模块解析的工作方式是检查是否存在与paths中的任何键匹配的前缀,并将使用与该键关联的值更改该前缀,从而获得您获得的结果。解决此问题的一种方法是将其添加到您的paths配置中:

1
"backbone/templates":"backbone/templates"

这样可以使您在backbone/templates下请求的所有内容都不会被backbone路径弄乱。

注意:最好避免在模块名称中添加扩展名,因此您应该将其从jQuery和Backbone的值中删除。