2014-10-29 28 views
11

Bevor ich diese Frage stelle, möchte ich darauf hinweisen, dass es hier severalsimilarquestionsposted auf StackOverflow gibt, aber keiner von ihnen bietet eine genaue Lösung für das Problem.Relative Pfade in CSS und Grunt Minification?


Das Problem

Ich habe einen Workflow Setup wo Grunt für eine Produktionsumgebung und minifies mehrere CSS-Dateien in einer einzigen Datei kombiniert.

Das Problem, mit dem ich konfrontiert bin, ist, dass Schriftart und Bildpfade nach dem Ausführen von Grunt brechen, da sie immer noch auf ihre vorhandenen relativen Dateipfade zeigen.

Als Beispiel:

Innerhalb static/homepage/startup/common-files/css/icon-font.css ich die folgende CSS-Regel haben:

@font-face{font-family:Flat-UI-Icons;src:url(../fonts/Startup-Icons.eot); 

In meinem Gruntfile ich fest, dass ich die Ausgabe meiner minimierte CSS-Datei style.min.css bei static/css/custom/homepage/ gelegen sein wollen . Das Problem dabei ist, dass sich der Dateipfad ändert, wodurch alle Schrift- und Bildabhängigkeiten nicht mehr gefunden werden und im Browser ein 404-Status zurückgegeben wird.

Was ich zu versuchen, diese ich

getan zu lösen haben gedacht, dass es 2 Möglichkeiten, dieses Problem zu beheben:

  1. Kopieren Sie alle abhängigen Dateien so, dass sie in Bezug auf das neue Verzeichnis, in dem sich style.min.css befindet. Der Nachteil ist, dass es schnell unordentlich wird und meine Projektordnerstruktur ruiniert!
  2. Ändern Sie die Pfade manuell von Hand. Aber dann, was ist der Sinn darin? Grunt wurde für die Automatisierung von Aufgaben entwickelt!

Weiß jemand, wie man dieses Problem behebt? Ich habe fast 10 Stunden damit verschwendet und ich gebe langsam auf. Leute haben behauptet, das Problem über das Github issue page behoben zu haben, aber niemand sagt wirklich, wie sie es reparierten.

EDIT:

Ich habe durch die clean-css library Quellcode geschaut und es scheint, dass Sie eine relativeTo Eigenschaft zum minifier Objekt passieren kann. Ich hatte ein Chaos damit, aber ich bin immer noch fest. Ich melde mich zurück, wenn ich weiterkomme.

EDIT:

Okay, ich habe endlich eine Dokumentation, die erklärt, was relativeTo (und andere) Eigenschaften tun. Ich steckte noch auf genau das, was meine Konfiguration obwohl für meine Dateistruktur sein sollte ....

relativeTo - path to resolve relative @import rules and URLs 
root - path to resolve absolute @import rules and rebase relative URLs 
roundingPrecision - rounding precision; defaults to 2; -1 disables rounding 
target - path to a folder or an output file to which rebase all URLs 

Hier ist meine Grunt Konfigurationsdatei als Referenz:

module.exports = function(grunt) { 
     grunt.initConfig({ 
      concat: { 
       homepage: { 
        src: [ 
         'static/homepage/startup/common-files/css/icon-font.css', 
         'static/homepage/startup/flat-ui/bootstrap/css/bootstrap.css', 
         'static/homepage/startup/flat-ui/css/flat-ui.css', 
         'static/homepage/static/css/style.css' 
        ], 
        dest: 'static/css/custom/homepage/compiled.css', 
       } 
      }, 
      cssmin: { 

       homepage: { 
        src: 'static/css/custom/homepage/compiled.css', 
        dest: 'static/css/custom/homepage/style.min.css' 
       } 
      }       
     });    

     grunt.loadNpmTasks('grunt-contrib-concat'); 
     grunt.loadNpmTasks('grunt-contrib-uglify'); 
     grunt.loadNpmTasks('grunt-contrib-cssmin'); 
     grunt.loadNpmTasks("grunt-css-url-rewrite"); 
     grunt.registerTask('build', ['concat', 'cssmin']); 
     grunt.registerTask('default', ["build"]); 
}; 

Dank.

+0

Ich habe das gleiche Problem, stundenlang versucht, mit 'relativeTo', 'Ziel' und 'root' ohne Erfolg zu spielen:/ – jitowix

+0

Ich bin vielleicht nah an einer Lösung! Sehen Sie meinen Kommentar hier (mein Benutzername ist jjmpsp): https://github.com/yeoman/grunt-usemin/issues/225 –

+0

Ok ich werde versuchen, es morgen zu betrachten. (Ich fühle schon den Schmerz ^^) – jitowix

Antwort

-2

Dies ist nicht unbedingt eine direkte Antwort auf Ihre Frage, aber eine mögliche Lösung. IMO, Sie könnten besser dran sein, wenn Sie Ihre Verzeichnisstruktur ein wenig umstrukturieren und Ihre Grunfile tweenen.

Neue Struktur:

project-root 
    /assets 
    /styles 
     (various css files) 
    /scripts 
     (js files) 
    /images 
     (image files) 
    /fonts 
    /vendor (if needed) 
     /plugin files 

Wenn Sie in ein paar Grunzen Aufgaben hinzufügen, wie imagemin und copy, Sie in eine neue Verzeichnisstruktur platziert Dateien haben kann, wenn gespeichert oder verändert:

project-root 
    /assets 
    /dist 
    /styles 
     /styles.css 
     /styles.min.css 
    /scripts 
     /scripts.min.js 
    /images 
     (minified images) 
    /fonts 
     (minified fonts) 

Zur weiteren Verdeutlichung:

  • verketten css-Dateien in dist/styles/style.css, dann minify die Datei in dist/styles/style.min.css
  • concatenate js Dateien in dist/scripts/scripts.js, dann minify die Datei in dist/scripts/scripts.min.js
  • Verwendung Bilder keine Bilder zum assets/images Ordner hinzugefügt minify und die zu dist/images
  • Gebrauch kopieren zu kopieren Sie die Schriften von assets/fonts in dist/fonts

Ihren neuen Workflow nur im assets Verzeichnis arbeiten würde, fügen Sie alle Ihrer Bilder dort, alle Ihre Schriftarten, usw. Sie würden jedoch in Bezug auf die Datei in Bezug auf die Datei referenzieren, wenn sie in den Ordner dist ausgegeben wird.

Alle Ihre Stylesheets, Skripte usw. verweisen auf den Ordner dist.

Plus, alle Ihre Vermögenswerte werden nett und schlank sein, da die meisten von ihnen durch eine Art von Verkleinerung gehen.

Wenn Sie Vendor-Dateien wie Plugins usw. benötigen, können Sie ein Lieferantenverzeichnis hinzufügen (besser noch Bower als manuell hinzufügen) und dann die benötigten Dateien in die entsprechenden Concat-Aufgaben einfügen.