2013-10-03 13 views
8

Większość przykładów konfiguracji RequireJS, umieść obiekt konfiguracji w punkcie wejścia main.js, coś jak to:W jaki sposób mogę umieścić RequireJS Config w osobnym pliku i uruchomić Optymalizator r.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*/}); 

Wolę umieścić obiekt konfiguracji w oddzielnym pliku, bo jak rośnie, trudno zachować w tym samym pliku.

Poniższa konfiguracja działa, gdy uruchomię go w przeglądarce, ale z jakiegoś powodu otrzymuję komunikat o błędzie podczas uruchamiania optymalizator 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 
}); 

Kiedy biegnę r.js, pojawia się następujący błąd:

*Tracing dependencies for: main

Error: ENOENT, no such file or directory 'C:\Work\project\target\app.js*

Więc wydaje się, że nie dostanie r.js ustawień konfiguracyjnych, ponieważ szuka app.js jako względny scenariusza, nie jako moduł z określoną ścieżką.

Oto mój plik build.js (Appdir, reż a mainConfigFile są w stosunku do pliku build.js):

({ 
    appDir: "../src", 
    baseUrl: ".", 
    dir: "../target", 
    mainConfigFile: "../src/main.js", 
    findNestedDependencies: true, 
    modules: [ 
     { 
      name: "main" 
     } 
    ] 
}) 

Odpowiedz

7

Oto jak ja to robię. Lubię oddzielanie pliku konfiguracyjnego, ponieważ używam go ponownie w testach.

struktura folderów:

PROJECT 
| 
+- build (build output directory) 
| 
+- build-scripts (contains r.js, build.js) 
| 
+- WebContent 
    | 
    +- index.html (application main file) 
    | 
    +- scripts 
     | 
     +- require-cfg.js 
     | 
     +- main.js 
     | 
     +- ... 

Plik konfiguracyjny (require-cfg.js - pokazano tylko istotne rzeczy):

var require = { 
    baseUrl: "scripts", 
    paths: ... 
    ... 
}; 

plik build (build.js): Kod

({ 
    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" 
}) 

Bootstraping (index.html):

<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> 

wykonam r.js z konfiguracją w folderze build-scriptsbuild.js. Zoptymalizowane i połączone wyjście trafia do folderu build. Możesz dostosować ścieżki do swoich potrzeb.

+0

Dzięki, wygląda dobrze. Jest w zasadzie taki sam jak robię, ale staram się zachować 1 znacznik skryptu w moim pliku index.html - mianowicie require.js. Widzę, że nie używasz danych-main, a raczej ładujesz wszystkie skrypty osobno. Czy istnieje sposób na załadowanie require-config z main.js przy użyciu require? W ten sposób nadal można zachować oddzielne dla testów – elanh

+0

Myślę, że przy użyciu wymagać załadować require-cfg jest problem z kurczakiem i jaj. Lubię ładować require-cfg w oddzielnym kroku, ponieważ pozwala mi to na cusomize (np. I18n) na miejscu. I tak, 3 skrypty są brzydsze niż 1 skrypt, ale dla mnie jest to coś, z czym mogę żyć. –

+0

To, co jest dziwne, działa na mnie, gdy jestem uruchomiony lokalnie w przeglądarce. Ale kiedy uruchomię r.js, nie działa. Nie mogę zrozumieć, dlaczego. Mogę nadal ładować moduły z wymaganiem, bez zdefiniowanych ścieżek, dlatego spodziewam się, że zadziała. – elanh

Powiązane problemy