2013-05-13 9 views
26

Ich habe ein funktionierendes requirjs-Projekt, das grunt für die Erstellung und Bereitstellung verwendet. Wenn überhaupt keine Optimierung verwendet wird, funktioniert der Build ohne Probleme und ich bekomme eine große js-Datei, um sie bei der Produktion zu implementieren.Wie bestimmte requireJS-Dateien von der Vereinheitlichung/Optimierung ausgeschlossen werden können

Das Problem, das ich habe, ist, dass ich einige externe Frameworks (wie angularJS) habe, wo ich bereits eine minimierte/optimierte Version davon habe und nicht noch einmal optimieren möchte.

Momentan ohne Optimierung füge ich die verkleinerte Version dieses Frameworks über eine separate Pfadkonfiguration in meine Gruntdatei ein. Während ich in meinem normalen main.js die nicht-minimierte Version für die Entwicklung habe.

Jetzt möchte ich den Optimierer verwenden, um meinen eigenen Code zu optimieren, aber die externen Frameworks NICHT zu optimieren. Aber die externen Frameworks sollten in der resultierenden großen Javascript-Datei enthalten sein. Grundsätzlich möchte ich dem Optimierer mitteilen, dass er in einigen Fällen die Originaldatei verwenden soll.

Kann ich es so machen?

Ich habe nur eine globale Ausschlussoption gefunden, so dass einige Module in der resultierenden optimierten js überhaupt nicht enthalten sind.

Das ist meine Grunzen Konfiguration:

requirejs: { 
      compile: { 
       options: { 
        baseUrl: "<%= pkg.folders.jsSource %>", 
        name: "../external-libs/almond-0.1.1", 
        include: "main", 
        mainConfigFile: "<%= pkg.folders.jsSource %>/main.js", 
        out: "<%= pkg.folders.build + pkg.name + '-' + pkg.version %>/js/main.js", 
        //logLevel: 0, 
        optimize: "uglify2", 
        //optimize: "none", 
        paths: { 
         'angular':'../external-libs/min/angular-1.0.4', 
         'jquery':'../external-libs/min/jquery-1.7.2', 
         'jquery.mobile':'../external-libs/min/jquery.mobile-1.2.0', 
         'adapter': '../external-libs/min/jquery-mobile-angular-adapter-1.2.0', 
         'moment': '../external-libs/moment-1.6.2.min', 
         'iscroll': '../external-libs/min/iscroll-4.2.5', 
         'iscrollview': '../external-libs/min/jquery.mobile.iscrollview-1.2.6', 
         'add2Home': '../external-libs/min/add2home', 
         'config/config': "config/<%=configDatei%>" 
        } 
       } 
      } 
     }, 

Und das ist der relevante Teil der main.js:

require.config({ 
     paths:{ 
      'angular':'../external-libs/angular-1.0.4', 
      'jquery':'../external-libs/jquery-1.7.2', 
      'jquery.mobile':'../external-libs/jquery.mobile-1.2.0', 
      'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0', 
      'moment': '../external-libs/moment-1.6.2.min', 
      'iscroll': '../external-libs/iscroll-4.2.5', 
      'iscrollview': '../external-libs/jquery.mobile.iscrollview-1.2.6', 
      'add2Home': '../external-libs/add2home' 
     }, 
     shim:{ 
      'angular':{ deps:['jquery'], exports:'angular' }, 
      'iscroll':{ deps:['jquery'], exports:'iscroll' }, 
      'iscrollview':{ deps:['jquery.mobile', 'iscroll'], exports:'iscrollview' } 
     } 
    }); 

Vielen Dank für jede Hilfe.

Antwort

19

Nur einige Vorschläge verwenden leer: NICHT angeben, um das Modul in die Optimierung aufzunehmen.

In require.config wird dann die Verwendung der min-Datei angeben.

requirejs: { 
      compile: { 
       options: { 
        {{ all other settings }} 
        paths: { 
         'angular':'empty:', 
        } 
       } 
      } 
     }, 

    require.config:{ 
       paths:{ 
       'angular':'../external-libs/min/angular-1.0.4', 
     }, 
    } 

Bitte beachten Sie, das ist "leer:" mit einem Doppelpunkt am Ende, nicht "leer". Wenn Sie den Doppelpunkt weglassen, erhalten Sie einen Fehler wie folgt:

Hoffe das hilft.

+2

Diese Lösung funktioniert für mich nicht grunzen 0.4.1 und Grunzen-contrib-requirejs mit 0.4.1 Wenn ich angeben „leer:“ verunstalten wird entweder im uglify Prozess noch enthalten sind (unter Verwendung der Datei/uglify2). Ich bekomme die gleichen Ergebnisse, egal ob ich eine einzelne Datei oder ein ganzes App-Verzeichnis optimiere. –

+1

Funktioniert auch nicht für mich. – kaiser

+0

Grunt 0.4.5, Requirejs 2.1.9. Klappt wunderbar ! –

5

Ich hatte das gleiche Problem der externen Bibliotheken immer wieder als die Kommentare zu der Antwort, und das ist die Methode, die ich verwende um das zu umgehen. Ich habe zwei Aufgaben, eine für meinen Code und eine für die externen Bibliotheken. Es ist wirklich nur das Kopieren von Dateien - also würde nur eine Kopieraufgabe funktionieren. Ich verwende auch die "empty:" - Schlüsselarbeit für die externen Bibliotheken, so dass sie nicht in den Verbesserungen meines Codes enthalten sind.

requirejs: { 
    options: { 
     mainConfigFile: '...', 
     fileExclusionRegExp '...common things to exclude...' 
    }, 
    main: { 
     options: { 
      baseUrl: '.../js', 
      dir: '.../js-built', 
      fileExclusionRegExp: /^external$/, 
      ... etc ... 
     } 
    }, 
    external: { 
     options: { 
      baseUrl: '.../js/external', 
      dir: '.../js-built/external', 
      optimize: 'none' 
     } 
    } 
} 
+0

Ich konnte die 'fileExclusionRegExp' Eigenschaft funktioniert nicht, aber zwei aufeinander folgende requirejs Aufgaben mit unterschiedlichem' baseUrl' laufen und 'dir' war der Schlüssel Mine arbeiten zu lassen! Vielen Dank! – kevnk

Verwandte Themen