5

我正在尝试在服务器端(Apache Sling )集成 r.js 优化器并面临一个问题:解析模块时,它总是在输出目录dir)下查找它们,而不是从源目录baseUrlappDir)中查找它们,不t 找到它们,因此失败。

/project/build.js

({
    name: "modules/main",
    dir: "/target",
    baseUrl: "/sources"
})

如果您想知道,根路径/位于服务器的 JCR 存储库中,而不是文件系统。我还稍微简化了这个例子(希望没有隐瞒问题)。

它将正确解析并读取主文件:

/sources/modules/main.js

require(["modules/foo"]);

但是,当它现在尝试解析时modules/foo,它会尝试从中读取它,/target/modules/foo.js而不是/sources/modules/foo.js像我期望的那样,它不存在并且整个 r.js 执行失败并停止。

我尝试使用appDir和各种组合,但问题总是一样的。我相当确定它与我的集成代码无关......来自文档和谷歌搜索的AFAIU,它应该在构建优化文件之前将它们复制到目标,或者只是自动从源目录中获取它们。

  • 我应该/target在运行 r.js 之前将所有原始源文件复制给自己吗?
  • 也许问题在于它baseUrl=/overlay与内部的 build.js 不同/project
  • 也许 r.js 还会查看 r.js 进程的当前工作目录(在我的情况下到目前为止尚未定义)?
  • 输出目录 ( dir) 可以在外面吗appDirbaseUrl
4

2 回答 2

3

我的 require.js 配置如下所示:

({
  appDir: "../app",
  baseUrl: "js/lib", // means the base URL is ../app/js/lib
  dir: "../app-built", //target

  // offtopic, but a very handy option
  mainConfigFile: "../app/config.js",

  // I'm not 100% sure if it's equivalent to your version
  // where you're not using "modules" and just "name"
  modules: [{
    name: "../some/main" // this is ../app/js/some/main.js
  }]
})

阅读https://github.com/jrburke/r.js/blob/master/build/example.build.js#L15 - 如果您希望将文件复制到目标目录,您似乎确实需要指定 appDir优化前。

回答您的其他问题

  • 您无需手动复制文件
  • baseUrl 应该指向与您的应用程序配置中使用的 baseUrl 相同的位置 - 但是您必须根据您选择使用的 appDir 进行调整(例如 appDir="../app" 和 baseUrl="js/lib",或 appDir ="../app/js" 然后 baseUrl="lib" 等)
  • appDir 和 dir 应该相对于构建配置文件 - 我不知道当你使用绝对路径时会发生什么
  • 是的 - 输出目录确实(必须?)存在于 appDir 之外。BaseURL 在 appDir/dir 中(所有这些名称都非常令人困惑..)

我会说

  1. 使用“appDir”设置
  2. 尝试像我一样使用“模块”,而不仅仅是“名称”
  3. 如果可以的话,为构建文件创建“appDir”和“dir”相对路径 - 这些绝对路径可能是什么问题?因为除此之外,配置看起来与我使用的配置非常相似

我知道有一种不同的方式来配置它,你的输出是 1 个文件,在这种情况下,文件是从源目录中读取的——但我自己并没有使用那么多。

希望这可以帮助。

于 2013-08-10T00:25:13.857 回答
2

回答自己:我让它与使用单个输出文件的方法一起使用out,而不是appDiror dir

({
    name: "modules/main",
    baseUrl: "/sources"
    out: "/target/out.js",
})

在这种情况下,它会从源中读取所有模块并创建一个/target/out-temp.js,然后/target/out.js在完成后移动到该模块。

到目前为止,这似乎适合我的需求。

于 2013-08-17T02:47:33.100 回答