Requirejs 需要.js优化器将所有文件复制到输出目录中吗?

Requirejs 需要.js优化器将所有文件复制到输出目录中吗?,requirejs,r.js,Requirejs,R.js,我试图在服务器端集成r.js优化器()并面临一个问题:在解析模块时,它总是在输出目录下查找它们(dir),而不是从源目录中查找(baseUrl或appDir),找不到它们,因此失败 /project/build.js 如果您想知道,根路径/在服务器的JCR存储库中,而不是文件系统中。此外,我还简化了示例(希望不会隐藏问题) 它将正确解析和读取主文件: /sources/modules/main.js 但是,当它现在尝试解析modules/foo时,它尝试从/target/modules/foo.

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

/project/build.js 如果您想知道,根路径
/
在服务器的JCR存储库中,而不是文件系统中。此外,我还简化了示例(希望不会隐藏问题)

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

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

我尝试使用appDir和各种组合,但问题总是一样的。我相当确定它与我的集成代码无关。。。如果没有文档和谷歌搜索,它应该在构建优化文件之前或者直接从源目录自动获取它们

  • 在运行r.js之前,我是否应该将所有原始源文件复制到自己的
    /target
  • 可能问题在于
    baseUrl=/overlay
    与驻留在
    /project
    中的build.js不同
  • 也许r.js还会查看r.js进程的当前工作目录(在我的例子中,到目前为止还没有定义)
  • 输出目录(
    dir
    )是否可以位于
    appDir
    baseUrl
    之外

我的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
  }]
})
通读-如果您希望在优化之前将文件复制到目标目录,那么似乎确实需要指定appDir

回答你的其他问题

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

  • 使用“appDir”设置
  • 试着像我一样使用“模块”,而不仅仅是“名称”
  • 如果可以的话,将“appDir”和“dir”相对路径设置为构建文件-这些绝对路径可能会中断?因为除此之外,配置与我使用的配置非常相似
  • 我知道在输出为1个文件的情况下,有一种不同的配置方法,这种情况下,文件是从源目录读取的-但我自己没有用过那么多


    希望这能有所帮助。

    回答我自己:我使用
    out
    而不是
    appDir
    dir
    单一输出文件方法实现了这一点:

    ({
        name: "modules/main",
        baseUrl: "/sources"
        out: "/target/out.js",
    })
    
    在本例中,它从源代码读取所有模块,并创建一个
    /target/out temp.js
    ,完成后将其移动到
    /target/out.js


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

    谢谢你详细的回答!我使用了
    appDir
    (绝对或相对),但它从不尝试复制所有文件。通过连接到文件访问函数的调试日志,我看到的是:a)读取
    build.js
    文件b)删除
    dir
    (全新开始)c)将主文件从源文件复制到输出目录d)从输出目录读取并解析主文件,e)尝试从输出目录内部查找
    foo
    依赖项,不是源(当然失败)。我错过了最初的复制递归步骤(如果这是
    appDir
    应该做的)。我还尝试使用
    modules
    而不是
    main
    ,但没有成功:(我会继续挖掘,你的回答至少让我知道了预期的结果。我找到了“在输出为1个文件的情况下配置它的方法”要工作,只需使用
    out
    。查看我自己的答案。嘿,Alexander,你有没有尝试过在模块上实现这一点,我遇到了与上面描述的相同的问题,但在我的情况下,我希望它能与模块一起工作,否则我会为多页站点使用一堆配置脚本否,单个串联输出文件对我的cas来说很好e、 我还是为每个输出定义了一个配置文件。
    ({
      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
      }]
    })
    
    ({
        name: "modules/main",
        baseUrl: "/sources"
        out: "/target/out.js",
    })