3

我有一个这样布置的项目:

  • 库/
    • bar.js
    • curl.js
  • 源/
    • foo.js
  • 测试/
    • 测试.html

在我的test/test.html文件中,我有以下内容

<script type="text/javascript" src="../lib/curl.js" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">

  curl(['../src/foo'], function (Foo) {
    console.log(Foo);
  });

</script>

这失败了,我看到的唯一解决方法是在加载 curl.js 之前包含以下内容:

<script>

  curl = {
    paths: {
      src: '../src'
    }
  };

</script>

所以我的第一个问题是,如果我只想链接到目录中的单个文件,为什么必须以这种方式设置路径src/

假设第一个问题已解决,我的第二个问题在src/foo.js. 我想对该文件有依赖lib/bar.js,所以我写了以下内容:

define(['../lib/bar'], function (Bar) {
  return Bar;
});

唉,这不起作用,因为 curl.js 正在尝试加载test/lib/bar.js,而不是lib/bar.js像我希望的那样。如果唯一的选择是paths为 curl 指定一个对象,是否可以在src/foo.js模块中执行此操作,还是必须全部在test/test.html文件中完成?

4

1 回答 1

3

所以我的第一个问题是,如果我只想链接到 src/ 目录中的单个文件,为什么必须以这种方式设置路径。

好问题。这看起来可以称为错误。我们可能应该解决这个问题,但恕我直言,这不是主要问题。让我解释....

curl.js 面向复杂项目,其中模块被捆绑到“包”中——在概念上与 CommonJS/NodeJS 包非常相似。在包中,使用“../”导航出一个包并进入另一个包是没有意义的。事实上,我们中的许多人认为这应该会产生错误。不幸的是,curl.js 在这种情况下只是默默地失败了(这绝对是一个错误恕我直言)。

您看到的错误可能是 curl.js 在您不使用包时应用了包导航逻辑。(嗯,对我来说听起来更像是一个错误。:))

所以,一般来说,curl.js 需要一个配置。此配置中最重要的部分是 baseUrl。baseUrl 告诉 curl 应用程序的根所在的位置。在您的情况下,它是“..”(您也可以将其写为“../”,但 curl 无论如何都会在内部切断尾随的“/”。

您不必使用全局预配置 curl。您还可以在第一次像这样调用 curl() 时包含配置。

curl({ baseUrl: '..' }, ['src/foo'], function (Foo) {
    console.log(Foo);
});

我想这也回答了你的第二个问题。您可以使用 baseUrl 而不是配置路径。但是,一旦您开始组织模块,路径最终会派上用场。例如,路径可以将像“lib/jquery-1.8.0/jquery.min.js”这样的凌乱路径翻译成“jquery”。

curl({ baseUrl: '..', paths: { "lib/jquery-1.8.0/jquery.min.js": "jquery" });

我实际上推荐包而不是路径。随着越来越多的人开始编写可以在节点和浏览器中运行的 CommonJS 包,这可能变得不可避免。此外,我们计划围绕包构建 curl.js 的 compile-to-javascript 功能。

希望我有所帮助。:)

于 2012-08-10T17:24:32.443 回答