Require.js优化器应该将所有文件复制到输出目录中吗?

时间:2013-08-08 19:37:48

标签: requirejs r.js

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

/project/build.js

appDir

如果您想知道,根路径({ name: "modules/main", dir: "/target", baseUrl: "/sources" }) 位于服务器的JCR存储库内,而不是文件系统。我也简化了一些例子(希望没有隐瞒这个问题)。

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

/sources/modules/main.js

/

但是,当它现在尝试解析require(["modules/foo"]); 时,它会尝试从modules/foo而不是/target/modules/foo.js读取它,正如我所料,它不存在且整个r.js执行失败并停止。

我尝试使用/sources/modules/foo.js和各种组合,但问题总是一样的。我相当肯定它与我的集成代码无关......来自文档和Google搜索的AFAIU,它应该在构建优化文件之前copy them to the target或者只是自动从源目录中提取它们。

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

2 个答案:

答案 0 :(得分: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. 如果可以的话,
  4. 制作“appDir”和“dir”构建文件的相对路径 - 这些绝对路径可能会破坏什么?因为除此之外,配置看起来与我使用的配置非常相似
  5. 我知道有一种不同的配置方式,你的输出是1个文件,在这种情况下,文件是从源目录中读取的 - 但我自己没有用过那么多。

    希望这有帮助。

答案 1 :(得分:2)

回答自己:我使用out而不是appDirdir来使用单输出文件方法:

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

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

到目前为止,这似乎符合我的需要。