2016-05-24 28 views
0

Ich arbeite auf einer Node.js-Website und ich verwende Grunt, um meine CSS- und JS-Dateien zu contrahieren und zu minimieren. Doch nach dem grunt Befehl ausführen Ich erhalte die Fehlermeldung:Grunt concats JS-Datei mehrmals

fullPage: Fullpage.js can only be initialized once and you are doing it multiple times!

Hier ist meine Grunzen-Datei:

/*global module */ 
module.exports = function (grunt) { 
    "use strict"; 
    grunt.initConfig({ 
     // read in the project settings from the package.json file into the pkg property 
     pkg: grunt.file.readJSON("package.json"), 

     // Install only the bower packages that we need 
     bower: { 
      install: { 
       options: { 
        "targetDir": "./public/lib", 
        "copy": true, 
        "cleanup": true, 
        "install": true 
       } 
      } 
     }, 

     concat: { 
      css: { 
       src: ["public/lib/css/**/*.css", "public/css/cts.css"], 
       dest: "public/lib/dist/main.css" 
      }, 
      js: { 
       src: ["public/lib/**/jquery.js", "public/lib/**/*.js", "public/js/cts.js"], 
       dest: "public/lib/dist/main.js" 
      } 
     }, 

     cssmin: { 
      target: { 
       files: { 
        "public/lib/dist/main.min.css": "public/lib/dist/main.css" 
       } 
      } 
     }, 

     uglify : { 
      js: { 
       files: { 
        "public/lib/dist/main.min.js": "public/lib/dist/main.js" 
       } 
      } 
     }, 

     copy: { 
      files: { 
       expand: true, 
       flatten: true, 
       src: ["public/lib/fonts/**/*"], 
       dest: "public/lib/fonts/", 
       filter: "isFile" 
      } 
     } 
    }); 

    // Add all plugins that your project needs here 
    grunt.loadNpmTasks("grunt-bower-task"); 
    grunt.loadNpmTasks("grunt-contrib-concat"); 
    grunt.loadNpmTasks("grunt-contrib-copy"); 
    grunt.loadNpmTasks("grunt-contrib-cssmin"); 
    grunt.loadNpmTasks("grunt-contrib-uglify"); 
    grunt.loadNpmTasks("grunt-contrib-watch"); 

    // this would be run by typing "grunt test" on the command line 
    // the array should contains the names of the tasks to run 
    grunt.registerTask("test", []); 

    // define the default task that can be run just by typing "grunt" on the command line 
    // the array should contains the names of the tasks to run 
    grunt.registerTask("default", [ "bower", "concat", "cssmin", "uglify", "copy"]); 
    grunt.registerInitTask("install", ["bower"]); 
}; 

Wenn alles, was ich hätte gedacht, jQuery derjenige sein würde, der ist verketteten immer mehrere Male, aber es ist nicht. Irgendwelche Vorschläge, was ich falsch machen könnte?

EDIT: Hier ist meine aktualisierte Grunt-Datei mit allen 3rd-Party-Bibliotheken in der concat.src aufgelistet.

/// <binding BeforeBuild='default' /> 
/*global module */ 
module.exports = function (grunt) { 
    "use strict"; 
    grunt.initConfig({ 
     // read in the project settings from the package.json file into the pkg property 
     pkg: grunt.file.readJSON("package.json"), 

     // Install only the bower packages that we need 
     bower: { 
      install: { 
       options: { 
        "targetDir": "./public/lib", 
        "copy": true, 
        "cleanup": true, 
        "install": true 
       } 
      } 
     }, 

     concat: { 
      css: { 
       src: ["public/lib/css/**/*.css", "public/css/cts.css"], 
       dest: "public/lib/dist/main.css" 
      }, 
      js: { 
       src: [ 
        "public/lib/js/jquery/jquery.js", 
        "public/lib/js/bootstrap/bootstrap.js", 
        "public/lib/js/fullpage.js/jquery.fullpage.js", 
        "public/lib/js/jquery-easing-original/jquery.easing.js", 
        "public/lib/js/slimscroll/jquery.slimscroll.js", 
        "public/lib/js/wow/wow.js", 
        "public/js/cts.js" 
        ], 
       dest: "public/lib/dist/main.js" 
      } 
     }, 

     cssmin: { 
      target: { 
       files: { 
        "public/lib/dist/main.min.css": "public/lib/dist/main.css" 
       } 
      } 
     }, 

     uglify : { 
      js: { 
       files: { 
        "public/lib/dist/main.min.js": "public/lib/dist/main.js" 
       } 
      } 
     }, 

     copy: { 
      files: { 
       expand: true, 
       flatten: true, 
       src: ["public/lib/fonts/**/*"], 
       dest: "public/lib/fonts/", 
       filter: "isFile" 
      } 
     } 
    }); 

    // Add all plugins that your project needs here 
    grunt.loadNpmTasks("grunt-bower-task"); 
    grunt.loadNpmTasks("grunt-contrib-concat"); 
    grunt.loadNpmTasks("grunt-contrib-copy"); 
    grunt.loadNpmTasks("grunt-contrib-cssmin"); 
    grunt.loadNpmTasks("grunt-contrib-uglify"); 
    grunt.loadNpmTasks("grunt-contrib-watch"); 

    // this would be run by typing "grunt test" on the command line 
    // the array should contains the names of the tasks to run 
    grunt.registerTask("test", []); 

    // define the default task that can be run just by typing "grunt" on the command line 
    // the array should contains the names of the tasks to run 
    grunt.registerTask("default", [ "bower", "concat", "cssmin", "uglify", "copy"]); 
    grunt.registerTask("combine", [ "concat", "cssmin", "uglify", "copy"]); 
    grunt.registerInitTask("install", ["bower"]); 
}; 
+0

Gibt es einen bestimmten Grund, dass der JQuery-Pfad Wildcards enthält? Scheint unnötig – theaccordance

+0

Es gibt mehrere Personen in diesem Projekt und die verschachtelte Struktur könnte sich ändern. Die Platzhalter sorgen dafür, dass dies funktioniert, solange sich die Dateien irgendwo unter 'public/lib /' befinden. – tylerbhughes

Antwort

1

Ihr Problem scheint dies in concate.js.src

src: ["public/lib/**/jquery.js", "public/lib/**/*.js", "public/js/cts.js"] 

sein müssen Ihre Dateien mehrmals, könnte es einige Dateien verbreitet unter den Pfaden in src erwähnt hinzugefügt.

Sie sollten wahrscheinlich alle Ihre Vendor-Dateien wie jQuery aus dem öffentlichen Verzeichnis verschieben und einen anderen eingeben, sagen Hersteller.

Ihre src sollte dann in etwa so aussehen

src: ["vendor/**/*.js", "public/**/*.js"] 

Wie Sie jetzt sehen, gibt es keine gemeinsamen Dateien zwischen diesen beiden Pfaden.

Es ist auch eine gute Praxis, immer Code von Drittanbietern außerhalb Ihres App-Verzeichnisses als Geschwisterordner und nicht darin zu haben.

EDIT:

Ah! Ich sehe, was dein Problem ist. Sie möchten zuerst jquery unter den anderen Herstellerdateien haben.

public/lib/**/jquery.js und public/lib/**/*.js zusammen verursacht möglicherweise Dateien zweimal hinzugefügt.

Versuchen Sie, diese

src: ["public/lib/jquery/jquery.js", "public/lib/**/*.js", "!public/lib/jquery/jquery.js", public/js/cts.js"] 

Setzen Sie den vollständigen Pfad von jquery ersten public/lib/jquery/jquery.js und dann die !public/lib/jquery/jquery.js sollte von hier http://gruntjs.com/configuring-tasks#globbing-patterns

jquery hinzugefügt wieder als Teil public/lib/**/*.js

Haben Sie die obigen Muster verhindern Wenn dies immer noch nicht funktioniert, besteht eine andere Möglichkeit darin, alle Pfade im src-Array einzeln hinzuzufügen. Wenn Sie eine requirejs-Konfiguration haben, kopieren Sie einfach die Pfade von dort, da jquery nicht das einzige Abhängigkeitsproblem ist, mit dem Sie in Zukunft konfrontiert werden.

+0

Alle Dateien innerhalb von 'public/lib/**' sind nur Herstellerdateien.Deshalb habe ich sie in einem lib-Ordner. Der einzige Grund, warum meine aktuelle src-Konfiguration nicht so einfach ist, ist, dass eine dieser Dateien die Bootstrap JS-Datei ist und jQuery zuerst hinzugefügt werden muss, sonst wird es nicht funktionieren. – tylerbhughes

+0

@RandomlyKnighted: Verstanden. Ich habe die Antwort bearbeitet. Sehen Sie, ob das hilft – shinobi

+0

nachdem es endete, dass es endete, dass jQuery und eine meiner anderen Hersteller-Dateien wurde nicht definiert..so ging ich durch und fügte alle Pfade einzeln hinzu und ich bekomme immer noch einen Fehler, der besagt, dass es einer der ist Herstellerdateien werden mehrfach initialisiert. – tylerbhughes