2012-12-04 8 views
6

Mam prosty projekt requirejs, który próbuję zoptymalizować do jednego pliku za pomocą węzła. Struktura projektu jest taka.RequireJs Optimizer zminimalizuje się do jednego pliku, ale nie uruchamia głównego zbudowanego

 

|___index.html 
| 
├───css 
│  style.css 
│ 
└───scripts 
    │ main.js 
    │ 
    ├───lib 
    │  require.js 
    │  underscore.js 
    │ 
    └───modules 
      module1.js 
      module2.js 
      module3.js 

tutaj jest mój plik build

//build.js 
({ 
    baseUrl: "./SimpleRequireJsProject/scripts", 
    name:"main", 
    out:"main-built.js" 
}) 

Z r.js i build.js spoza pliku projektu. Uruchomiłem optymalizator za pomocą konsoli węzła.

node r.js -o build.js 

Wszystko działa dobrze. wyjście main-built.js zostanie utworzone. Ale kiedy wymienić

<script data-main="scripts/main" src="scripts/lib/require.js"></script> 

z

<script data-main="scripts/main-built" src="scripts/lib/require.js"></script> 

kiedy uruchomić plik indeksu. Nie ma błędu, ale nie ma wyjścia. Oczekuję komunikatów konsoli tak jak to. który współpracuje z oryginalnymi danymi-main jako głównego

 
//output 
main started 
m1 started 
m2 started..starting m3 from m2 
m3 started 

proszę mi pomóc dowiedzieć się, dlaczego projekt nie działa i nie ma błędu, jak również. :(

//main.js 
    define([ 
     'lib/underscore', 
     'modules/module1', 
     'modules/module2' 
    ], 
     function (_, Module1, Module2) { 
      console.log('main started'); 
      var module1 = new Module1(); 
      var module2 = new Module2(); 
      module1.start(); 
      module2.start(); 
     }); 


    //module1.js 
    define(['lib/underscore'], 
     function (_) { 
      function Module1() { 
       this.start = function() { 
        console.log('m1 started'); 

       }; 
      } 

      return Module1; 
     }); 

    //module2.js 
    define(['lib/underscore', 'modules/module3'], 
     function (_, Module3) { 
      function Module2() { 
       this.start = function() { 
        console.log('m2 started..starting m3 from m2'); 

        var module3 = new Module3(); 
        module3.start(); 

       }; 
      } 

      return Module2; 
     }); 

    //module3 
    define([ 
     'underscore'], 
     function (_) { 
      function Module3() { 
       this.start = function() { 
        console.log('m3 started'); 
       }; 
      } 

      return Module3; 
     }); 


    //index.html 

    <!DOCTYPE html> 
    <html> 
    <head> 
     <link href="css/style.css" rel="stylesheet" type="text/css"> 
     <title></title> 
    </head> 

    <body> 
    <div id="main"></div> 
    <script data-main="scripts/main-built" src="scripts/lib/require.js"></script> 
    </body> 
    </html> 

Odpowiedz

4

znalazłem mój problem. Określenie „główny-built.js” musi być „main.js” lub w głównym wbudowany moduł nazwa musi być zmieniona z „głównym” na " main-built. "

+0

Zgadza się, ja po prostu stwierdził, mają ten sam problem. Ale to jest problem, bo jeśli dodasz odciski palców (pomijanie pamięci podręcznej) do pliku, który nie załaduje się! –

4

Oto dwie inne pomysły, jeśli nie możesz nadać nazwy modułu (w naszym przypadku jest to portal/główna) tak samo jak nazwa pliku (który jest portalem/main.js)

  • Całkowicie usuń nazwę modułu z wywołania funkcji define define(), co oznacza, że ​​jest to domyślny punkt wejścia f lub dokument. Problem polega na tym, że optymalizator nie jest konsekwentny, jeśli chodzi o użycie "i" w zależności od użytych argumentów wiersza poleceń:

  • Dodaj coś takiego jak require (["nazwa modułu startowego"]) jako ostatnią linię zbudowany plik. będzie to wykonać natychmiast, gdy skrypt zostanie załadowany i zadzwonić do pierwszego modułu własnych upodobań. okazało To się naprawdę łatwo zautomatyzować do skryptu build i naprawili problem dla nas.

+0

Pójdziemy z drugą opcją. Ponieważ moduł przestał działać, dodaliśmy SHA do nazwy wygenerowanego pliku (jako pomijanie pamięci podręcznej). Moduły AMD są niesamowite, ale Require.JS to żywe piekło! –

0

Od Rozwiązaniem Thupten'a, sposobem zautomatyzowania tego zamiennika w main-built.js jest uruchomienie tego z linii poleceń:

Po

node r.js -o build.js 

run

sed -i -- 's/define("main/define("main-built/g' main/js/Main.min.js 
Powiązane problemy