Javascript 如何将RequireJS配置放在单独的文件中并使r.js优化器工作?

Javascript 如何将RequireJS配置放在单独的文件中并使r.js优化器工作?,javascript,requirejs,amd,r.js,Javascript,Requirejs,Amd,R.js,对于RequireJS设置的大多数示例,将配置对象放在main.js入口点中,如下所示: //main.js require.config({ "paths": { //libs "lib1": "assets/js/lib/lib1", "lib2": "assets/js/lib/lib2", "lib3": "assets/js/lib/lib3", "lib4": "assets/js/lib/lib4" } }); //start the

对于RequireJS设置的大多数示例,将配置对象放在main.js入口点中,如下所示:

//main.js
require.config({
"paths": {
    //libs
    "lib1": "assets/js/lib/lib1",
    "lib2": "assets/js/lib/lib2",
    "lib3": "assets/js/lib/lib3",
    "lib4": "assets/js/lib/lib4"
    }
});
//start the app
define(["lib1"], function(lib1){/*start the app*/});
我更喜欢将配置对象放在一个单独的文件中,因为随着它的增长,很难在同一个文件中进行维护

当我在浏览器中运行时,以下设置可以工作,但由于某些原因,我在运行r.js优化器时出错:

//config.js
define({/*all configuration here*/});

//main.js
define(["config", "require"], function(config, require){
    requirejs.config(config); //set configuration
    require(["app"]); //launch app, where "app" path is defined in config.js
});
当我运行r.js时,会出现以下错误:

*跟踪:main的依赖项

错误:enoint,没有这样的文件或目录'C:\Work\project\target\app.js*

因此,r.js似乎没有获得配置设置,因为它将app.js视为一个相对脚本,而不是一个具有定义路径的模块

这是我的build.js文件(appDir、dir和mainConfigFile与build.js文件相对):


我就是这样做的。我喜欢将配置文件分开,因为我在测试中重用了它

文件夹结构:

PROJECT
|
+- build (build output directory)
|
+- build-scripts (contains r.js, build.js)
|
+- WebContent
   |
   +- index.html (application main file)
   |
   +- scripts
      |
      +- require-cfg.js
      |
      +- main.js
      |
      +- ...
配置文件(
require cfg.js
-仅显示相关内容):

生成文件(
build.js
):

引导代码(
index.html
):



我使用
build scripts
文件夹中的
build.js
配置执行
r.js
。优化和组合的输出将进入
build
文件夹。您可以根据需要调整路径。

谢谢,看起来不错。这与我现在做的基本相同,但我试图在index.html中保留一个脚本标记,即require.js。我看到您没有使用data main,而是单独加载所有脚本。有没有办法使用require从main.js加载require配置?这样,您仍然可以在测试中保持它的独立性。我认为使用require来加载require cfg是一个鸡和蛋的问题。我喜欢在单独的步骤中加载require cfg,因为它允许我在适当的位置对其进行自定义(例如i18n)。是的,3个脚本比1个脚本更难看,但对我来说,这是我可以忍受的。奇怪的是,当我在浏览器中本地运行时,它对我有效。但当我运行r.js时,它不会。我似乎不明白为什么。在没有定义路径的情况下,我仍然可以加载带有require的模块,这就是我希望它能够工作的原因。
PROJECT
|
+- build (build output directory)
|
+- build-scripts (contains r.js, build.js)
|
+- WebContent
   |
   +- index.html (application main file)
   |
   +- scripts
      |
      +- require-cfg.js
      |
      +- main.js
      |
      +- ...
var require = {
    baseUrl: "scripts",
    paths: ...
    ...
};
({
    appDir: "../WebContent/",
    baseUrl: "scripts/",
    mainConfigFile: "../WebContent/scripts/require-cfg.js",
    paths: {
        /* repeated from require-cfg.js */
    },
    dir: "../build",
    optimize: "uglify2",
    inlineText: true,
    removeCombined: true,

    name: "main"
})
<script src="scripts/require-cfg.js"></script>
<script src="scripts/lib/require-2.0.2-jquery-1.10.2.js"></script>
<script src="scripts/main.js"></script>