Die Fähigkeit, bei jeder Dateänderung neu modifiziertes CSS einzuschleusen (ohne die Seite neu zu laden), ist die Art von Workflow-Verbesserung, die man erst dann wirklich zu schätzen weiß, wenn man sie verliert.
Genau das ist mir neulich passiert.
Seit mindestens 12 Monaten benutze ich Grunt und die LiveReload Browser-Erweiterung, um CSS zu injizieren, wenn meine Dateien geändert wurden. Es fühlte sich wie ein wirklich schöner Workflow an, bis ich an einem Projekt arbeiten musste, das IE7 & 8-Unterstützung erforderte. Das LiveReload-Plugin, das ich verwendete, unterstützte einfach keine älteren IE-Versionen. Zum ersten Mal seit über einem Jahr musste ich jedes Mal manuell die Seite neu laden, wenn ich an meinem CSS etwas änderte. Es war schmerzhaft. Deshalb habe ich Browser-Sync entwickelt.
Einführung in Browser-Sync
Browser-sync ist ein Tool, das Ihnen browserübergreifende CSS-Injektion ermöglicht. Es überwacht Ihre Dateien und sobald Sie eine Änderung vornehmen, informiert es alle verbundenen Browser, das neue CSS neu zu laden (zu injizieren). Dies geschieht alles, ohne die Seite neu zu laden. Am wichtigsten ist, dass es in jedem Browser funktioniert, auf dem ich es testen konnte.

Wie Browser-Sync entstanden ist
Ich wusste von Anfang an, dass es an sich einfach genug ist, neues CSS in Browser zu einfügen. Das Problem, das ich lösen musste, war, wie eine Änderung im Dateisystem zurück an die Browser kommuniziert werden kann. Die Grunt + LiveReload-Kombination, die ich zuvor verwendete, basierte auf Web Sockets. Deshalb gab es keine Unterstützung für ältere IE-Versionen.
Begrüßen Sie Socket.io
Ich hatte meinen Geistesblitz, als ich Karma zum Ausführen von Unit-Tests verwendete. Karma erlaubt es Ihnen, Tests in mehreren Browsern auszuführen. Als ich eines Tages unter IE8 testete, erkannte ich, dass Karma die Tests nach jedem Speichern der Datei automatisch erneut ausführte.
Bingo. Ich hatte etwas gefunden, das das Dateisystem auf Änderungen überwachen und die Browser darüber informieren konnte. Ich begann, den Quellcode von Karma zu durchforsten. Schließlich entdeckte ich, dass sie dafür Socket.io verwendeten.
Beginnt, sich zusammenzufügen
Alles war bereit. Mit dem durch manuelle Seitenaktualisierungen erfahrenen Schmerz als treibende Kraft und der Entdeckung von Socket.io als Inspiration war ich bestens aufgestellt, um ein Tool zu entwickeln, das ich selbst täglich nutzen würde.
Einrichtung
Diese Anleitung geht davon aus, dass Sie Grunt bereits in einem Projekt installiert haben und wissen, wie Sie es verwenden. Wenn nicht, können Sie sich auf der Grunt-Website darüber informieren.
Browser-sync kann als eigenständiges Kommandozeilen-Tool oder als Grunt-Plugin installiert werden. Aufgrund der aktuellen Popularität von Grunt konzentriere ich mich hier darauf, wie Sie es als Grunt-Task einrichten. Wenn Sie den reinen Kommandozeilen-Ansatz bevorzugen, schauen Sie sich bitte diese Anweisungen an.
Vom selben Dateiverzeichnis wie Ihre Gruntfile.js
npm install grunt-browser-sync
Dadurch wird Browser-sync lokal in Ihr Projekt installiert. Nun können Sie sicherstellen, dass es von Grunt geladen wird, indem Sie dies gegen Ende Ihrer Gruntfile.js platzieren.
grunt.loadNpmTasks('grunt-browser-sync');
Schließlich müssen Sie, wie bei allen Grunt-Plugins, eine Konfiguration bereitstellen. Mindestens benötigen Sie Folgendes.
// Inside the Gruntfile.js config object
browser_sync: {
files: {
src : 'assets/css/style.css'
}
}
Ich war etwas verwirrt, als ich versuchte, den Schritten in dem Artikel zu folgen. Es funktionierte einfach nicht – also ging ich auf die offizielle Website und las. Anscheinend haben sich die Schritte etwas geändert, und anstatt den Task „browser_sync“ zu nennen, sollte es „browserSync“ heißen, sonst läuft Grunt den Task nicht.
Mit Ihrer konfigurierten Einstellung können Sie das Plugin mit diesem Befehl ausführen.
grunt browser_sync
Nun sollten Sie einen HTML-Snippet erhalten, den Sie in den Footer Ihrer Website einfügen können. Platzieren Sie ihn dort. Nun wird jedes Mal, wenn Sie diese CSS-Datei ändern (oder sie durch einen anderen Build-Prozess geändert wird), das CSS automatisch in alle Browser injiziert.
Hinweis: Es gibt Möglichkeiten, mehrere Dateien anzugeben, und Sie können auch Wildcards (*) verwenden. Weitere Informationen finden Sie im Readme auf Github.
Ein stärker automatisierter Ansatz
Das obige Beispiel ist großartig für Situationen, in denen Sie bereits einen Server haben. Zum Beispiel beim Erstellen einer Website mit WordPress oder Rails. Der Nachteil ist jedoch, dass Sie diesen manuellen Schritt des Kopierens und Einfügens eines Snippets in eine Datei haben. Wenn Sie mit statischen Dateien (HTML, CSS und JS) arbeiten, können Sie stattdessen den integrierten Server verwenden. Der integrierte Server fügt automatisch alle benötigten HTML-Snippets ein, sodass Sie dies nicht tun müssen.
Um den integrierten Server zu verwenden, konfigurieren Sie Ihre Einstellungen einfach wie folgt.
// Inside the Gruntfile.js config object
browser_sync: {
files: {
src : 'app/css/style.css'
},
options: {
server: {
baseDir: "app"
}
}
}
Dateien werden nun aus dem Verzeichnis app bereitgestellt und die gesamte Magie, die zum Injizieren von CSS benötigt wird, wird für Sie erledigt.
Noch weiter gehen
Wenn Sie die obige Server-Option verwenden, haben Sie die IP-Adresse und den Port bemerkt, die verwendet werden? Normalerweise etwas wie 192.168.0.8:3001? Browser-sync versucht, eine gute externe IP-Adresse für den Server zu ermitteln. Das bedeutet, dass Sie von jedem Gerät/Computer im selben WLAN-Netzwerk darauf zugreifen können sollten. Das Coole daran ist, dass die CSS-Injektion auch auf allen mobilen Geräten und Tablets funktioniert. Wenn Sie diese Art von Automatisierung in Aktion sehen, werden Sie feststellen, dass es schwer ist, darauf zu verzichten.
Wenn es für Sie nicht funktioniert
Bei meinen Tests habe ich festgestellt, dass Browser-sync in typischen WLAN-Netzwerken hervorragende Arbeit leistet, um die richtige IP-Adresse zu ermitteln. In einer großen Büroumgebung kann es jedoch vorkommen, dass es eine IP-Adresse wählt, die für andere Geräte/Computer nicht zugänglich ist. Wenn dies der Fall ist und Sie die richtige IP-Adresse kennen, geben Sie sie einfach als Option an, wie folgt.
// Inside the Gruntfile.js config object
browser_sync: {
files: {
src : 'app/css/style.css'
},
options: {
server: {
host: "192.168.1.1",
baseDir: "app"
}
}
}
Jenseits von CSS-Injektion
Da es sich um einen Gastbeitrag auf CSS-Tricks handelt, habe ich mich hauptsächlich auf die Einrichtung des CSS-Injektionsteils meines Tools konzentriert. Aber Browser-sync kann noch viel mehr! Es hat etwas Großartiges namens Ghost-Mode.
Ghost Mode verfolgt alle verbundenen Browser und hält die folgenden synchron:
- Scroll-Position – äußerst hilfreich bei der Entwicklung mit mehreren Monitoren
- Formularfelder – füllen Sie ein Formular in einem Browser aus und alle anderen werden mit diesen Daten gefüllt.
- Links – Überprüfen Sie ein paar Seiten einer neu erstellten Website? Öffnen Sie sie auf all Ihren Geräten und wenn Sie von Seite zu Seite navigieren, folgen Ihnen alle Browser!
Fazit
Ich hoffe, das klingt alles ziemlich cool für Sie. Ich habe es geliebt, Browser-sync zu bauen. Ich freue mich über Feedback und Fehlerberichte, damit wir es als Gemeinschaft verbessern können.
Denken Sie daran, dass Browser-sync auf zwei Arten verwendet werden kann:
- Standalone – global installiert, überall verwendbar
- Grunt Plugin – lokal installiert, als Grunt-Task konfiguriert
Tolle Arbeit, Shane!
Danke! Das ist unglaublich hilfreich!
Wow!! Das ist ein sehr cooles Werkzeug!! Ich werde es definitiv benutzen!!!
Dies ist eine Funktion der neuesten Version von Visual Studio, in die ich mich definitiv verliebt habe! Dass die Seite meine Styles jedes Mal neu lädt, wenn ich speichere, ist eine Kleinigkeit, die meinen Tag so viel besser macht :)
Das ist unglaublich, danke.
Als Frontend-Entwickler kannte ich Grunt.js bereits und nach dem Lesen dieses Artikels bin ich jetzt auf deren Website und lese, wie man es zum Laufen bringt.
Ehrlich gesagt, so sehr ich es auch zum Laufen bringen und ausprobieren möchte, ich kann nicht umhin, den Schmerz dabei zu spüren, so wie ich es spürte, als ich versuchte, Sass einzurichten, und FYI, ich lasse mich vom CMD überhaupt nicht einschüchtern. Manche Dinge sind einfach nicht benutzerfreundlich für Frontend-Entwickler.
Mit diesem gesagt, hier ist eine völlig dumme und n00b-Frage im Namen von PC-Frontend-Entwicklern: Sind diese Anweisungen nur für Mac? Oder gelten sie auch für PC? Oder sind diese Fragen zu dumm? (Antworten Sie nicht auf die letzte :p, Ihre Kommentare werden das klären :]). Tnx!
Ich verstehe Ihren Schmerz bezüglich der Einrichtung von Grunt.
Es ist eine dieser Dinge, die anfangs frustrierend sind, aber wenn Sie dranbleiben und diese Werkzeuge zum Laufen bringen, werden Sie nicht zurückblicken, das verspreche ich.
Ich arbeite bei WeAreJH in meinem Hauptjob und wir haben kürzlich Zeit für ein Grunt-Workshop eingeplant, das unseren Frontend-Entwicklern/Designern geholfen hat, einige der häufigsten Fehler/Probleme zu verstehen. Jetzt sind sie absolut davon überzeugt.
Schauen Sie sich diese Konfiguration hier an und sehen Sie, ob Sie sie zum Laufen bringen können.
Beispiel Gruntfile.js
Um Ihre Frage zu PC/Mac zu beantworten: Die Verwendung von Browser-sync ist auf Windows und Mac identisch. Ich habe getestet (und sogar Code geändert), um sicherzustellen, dass Sie dasselbe Werkzeug auf beiden Plattformen erhalten. (Ich gestehe jedoch, dass ich es nicht auf Linux-basierten Rechnern getestet habe).
Hallo Ricardo,
Richten Sie sich mit einem Boilerplate ein... das wird Ihnen bei der Einrichtung mit Grunt.js / Node helfen und Ihnen vielleicht ein paar „Aha!“-Momente verschaffen.
Schauen Sie sich zum Beispiel ngBoilerplate an. Es hat ein Projekt „in a box“, das Ihnen wahrscheinlich mit Node und Grunt helfen wird. (Es ist jedoch in AngularJS, daher müssen Sie möglicherweise einen Ersatz finden, wenn Sie sich mit AngularJS nicht wohlfühlen).
Nein, es ist nicht nur für Mac. SASS hat Compass, das auf Mac läuft, deshalb hört man das oft.
Mir war nicht ganz klar, dass Browser Sync auch ohne Grunt ausgeführt werden kann, bis ich Ihren Kommentar unten gelesen habe: „…(und auch ohne grunt)“. Ich habe es über die Eingabeaufforderung ausgeführt und es funktionierte*.
Ich bin mir nicht sicher, ob andere Frontend-Entwickler, die keine Ahnung von Grunt haben, entmutigt werden, weil sie denken, dass dies nur mit Grunt verwendet werden kann, denn obwohl Sie erwähnen, dass es als „... eigenständiges Kommandozeilen-Tool“ ausgeführt werden kann, scheint dieser Teil nicht klar genug zu sein.
Egal, *Ich konnte es dazu bringen, einen Testordner /css und eine Testdatei index.html zu überwachen, aber ich kann meinen Browser die HTML-Datei nicht „sehen“ lassen. Daher habe ich einige Fragen.
Wo kann ich Fragen zu meinem Fall einreichen, im Issues-Tracker des Repos auf Github? Hier? Wo sonst?
Vielen Dank im Voraus.
Unglaublich, ich habe es zum Laufen gebracht!
Der Punkt ist, dass das, was ich getan habe, weder hier noch in den README.md-Anweisungen im Repository beschrieben wird.
Ich werde versuchen, mir etwas auszudenken, um diese Informationen für andere verfügbar zu machen.
—
Nachdem ich so viele andere „Live-Injektion“-Tools erfolglos ausprobiert habe, habe ich endlich eine Möglichkeit, meine Änderungen live zu sehen, ohne neu laden zu müssen und ohne ein komplexes Framework oder eine Bibliothek verwenden zu müssen.
Eine Million Dank, Herr Shane.
Vielen Dank :)
Dieses Tool ist wirklich erstaunlich. Ich habe es mehrmals benutzt und kann sagen, dass ich es liebe.
Gibt es Pläne, dieses Tool in etwas Ähnliches wie GhostLab zu verwandeln, wo es eine Benutzeroberfläche gibt, die all dies ohne die Grunt-Konfiguration einbindet? Nicht, dass ich mich beschwere – ich finde Grunt einfach zu benutzen und habe nichts gegen die Einrichtung, aber ich denke an diejenigen, die sich nicht so wohl fühlen.
Wie auch immer – machen Sie weiter mit der epischen Arbeit hier, Shane. Ich liebe das Werkzeug und kann es kaum erwarten zu sehen, wohin es sich entwickelt :)
Ja, ich habe Pläne für kleine Interface-Elemente (wie Benachrichtigungen, die Möglichkeit, einzelne Browser zu trennen oder Ghost-Mode zu aktivieren/deaktivieren, ohne auf die Kommandozeile zurückgreifen zu müssen usw.).
Ich möchte auch Debugging-Tools wie weinre integrieren, die ein Remote-Debugging von mobilen Geräten über Ihren Hauptbrowser ermöglichen. (Stellen Sie sich also vor, Sie verwenden browser-sync mit all den bereits vorhandenen Funktionen + Sie erhalten eine Webseite, die alle verbundenen Browser auflistet – Sie könnten einen auswählen und ihn mit Chrome DevTools debuggen!).
Die Infrastruktur ist vorhanden, um so tolle Funktionen zu entwickeln.
Schön, dass es Ihnen gefällt, und danke, dass Sie bei der Entwicklung in den frühen Tagen bei @wearejh geholfen haben :p
Tolles Werkzeug, ohne Zweifel. Aber nachdem ich mich in livejs.com verliebt habe, ist es schwer, einem so einfachen Setup zu widerstehen. Es ist nur eine einzige JS-Datei, die Sie in Ihre Seiten einfügen, und es injiziert automatisch aktualisierte CSS-Dateien, JS-Dateien und lädt die Seite nach HTML-Änderungen neu (konfigurierbar). Es ist so einfach zu bedienen. Aber es hat nicht alle großartigen Funktionen dieses Setups. Aber solange ich ein codierender Designer bin, reicht es aus.
Dies ist nur eine weitere Waffe in unserem Arsenal. Sie müssen sich nicht entschuldigen, weil Sie bereits etwas anderes mögen! :)
Ich liebe alle Werkzeuge, die helfen, unseren Workflow zu automatisieren.
Wahrscheinlich erwähnenswert, wenn Sie mit HTML, CSS und JS arbeiten, kann browser-sync mit einem einzigen Befehl (und auch ohne Grunt) verwendet werden. Schauen Sie sich die Dokumentation an.
Wow, großartige Sache.
Können Sie erklären, wie man das mit Mamp einrichtet?
Vielen Dank,
Flo
Dieses Tool kann problemlos mit Mamp verwendet werden. Führen Sie es einfach wie in den Dokumenten beschrieben aus, und Sie erhalten einen HTML-Snippet, den Sie in den Footer Ihrer Website einfügen können.
Um den vollen Nutzen zu erzielen, müssen Sie sich über eine IP-Adresse mit Ihrem Mamp-Server verbinden (dies können Sie über die Servereinstellungen von Mamp konfigurieren).
Wenn Sie weitere Hilfe bei der Ermittlung der richtigen IP-Adresse benötigen, habe ich zufällig ein kleines Tool entwickelt, das Ihnen dabei hilft :p
dev-ip – Finden Sie eine geeignete IP-Host, um lokale Websites anzuzeigen.
Vielen Dank! Ich habe so lange auf eine großartige LiveReload-Alternative gewartet, oh, oh, oh, so lange... Ich bin so glücklich, ich singe!
Sieht gut aus, aber ich denke, Livereload kümmert sich auch um HTML- und JavaScript-Änderungen.
Browser-sync kann so viele Dateien verarbeiten, wie Sie möchten, und lädt/injiziert, wo möglich.
Beispiel Grunt-Konfiguration
Oder wenn Sie es eigenständig verwenden, können Sie eine Konfigurationsdatei übergeben, wie in den Dokumenten erklärt.
Ähm, warum haben Sie nicht einfach einen PR für Livereload eingereicht, um einen Fallback zu haben, wenn er keine WebSockets unterstützt?
Browser-sync hat schließlich genügend zusätzliche Funktionen, um es zu einem eigenen Projekt zu machen.
Ich hatte nie wirklich einen guten Grund, Grunt zu benutzen, aber das ist erstaunlich, ganz zu schweigen von äußerst nützlich. Ich habe auch die Nase voll von der immer gleichen Aktualisierung über mehrere Browser hinweg. Definitiv eine Installation für mich. Gute Arbeit.
Vergessen Sie nicht, dass es bei Bedarf auch ohne Grunt verwendet werden kann.
Stand-alone Browser-sync
Danke für das großartige Werkzeug!
Gibt es eine Lösung für das Gegenteil? Speichern von Änderungen in den Entwicklertools in Entwicklungsdateien?
Das wäre eine coole Funktion!
Ich glaube, Emmet hat diese Funktion jedoch bereits.
http://emmet.io/
Die Einrichtung mit der Kommandozeile war einfach. Es heißt, es wird 1 Datei (meine style.css) überwacht... Aber. Im Browser bekomme ich immer
Cannot GET /add-member.php
Können Sie Aufschluss darüber geben, warum das passiert? Meine Adressleiste hat: http://192.168.1.65:3001/add-member.php
Meine Konfigurationsdatei ist
module.exports = {
files: “*.css”,
debugInfo: true,
host: “192.168.1.65”,
ghostMode: {
links: true,
forms: true,
scroll: true
},
server: {
baseDir: “/mvyc/”
},
open: true
};
danke
@Vahagn
Es gibt Livestyle, das neu ist http://livestyle.emmet.io/ und es gab DevTools Autosave, ich bin mir nicht sicher, wie aktiv das ist und es funktionierte nur in Chrome https://github.com/NV/chrome-devtools-autosave
Das ist großartig, ich liebe es! Eine Sache, die mir aufgefallen ist, ist, dass es nicht funktioniert, wenn man diesen „Trick“ verwendet, um Einschränkungen von IE bei der Anzahl der Stylesheets während der Entwicklung zu umgehen.
Interessant!
Können Sie dies als Issue/Feature Request auf GitHub mit ein paar weiteren Details einreichen?
Danke
Hallo Shane,
Ich. Liebe. Browser-Sync!
Vielen Dank für die Entwicklung und nur zu Ihrer Information
Es funktioniert perfekt auf beiden meinen Linux-Setups (Linux Mint 15 & Ubuntu 13.04)
Das ist gut zu wissen, da ich noch keine Gelegenheit hatte, es auf Linux-Distributionen zu testen (außer in CI-Server-Builds).
Danke, ich freue mich, dass es Ihnen gefällt :)
Hallo Shane,
Können wir es in benutzerdefinierten JavaEE-Projekten (Nicht-Node.js-Projekte) verwenden? Wenn ja, sind zusätzliche Konfigurationen erforderlich?
Danke
Shane, vielen Dank! Das ist verdammt genial und wird mir viel Zeit sparen. Es aktualisiert den Browser sofort, nachdem ich meine Editor-Datei speichere.
Segen
Norman
Hallo!
Ich bin neu bei Grunt, also habe ich ein einfaches Grunt in einem neuen Ordner eingerichtet. Ich installiere Browser-sync wie hier beschrieben, mit minimalen Einstellungen.
browser_sync: {
files: {
src : ‘css/style.css’
}
}.
Kein Server oder sonst etwas ist installiert, nur Grunt und Browser-sync.
Wenn ich Grunt browser_sync eingebe, bekomme ich nur „Browser Sync konnte keine Dateien zum Überwachen finden.“
Habe ich etwas übersehen, gibt es ein Windows-spezifisches Problem?
ps: Die Kommandozeilenversion findet 4 .css-Dateien in meinem Pfad, Plugins wollen einfach keine meiner CSS-Dateien finden :).
Wie kann ich dieses Plugin gleichzeitig mit dem Watch-Plugin verwenden? Da ich LESS verwende und das Watch-Plugin zum Verarbeiten, ist dieses Plugin irgendwie nutzlos, wenn ich nicht beides verwenden kann. Wenn ich
grunt browser_syncausführe, wird das Plugin ausgeführt, aber wenn ich nurgruntausführe, wird nur Watch ausgeführt.Grunt-Noob hier, sorry!
Ich bin mir nicht sicher, ob dies der beste Weg ist, aber ich benutze jetzt grunt-shell und
grunt watch & grunt browser-sync, um beide gleichzeitig auszuführen.Danke für das tolle Plugin, das ist großartig!
Habe es zum Laufen gebracht mit Chrome DevTools. Ich habe Chrome Workspace [was in DevTools verfügbar ist] verwendet, um meine CSS-Datei mit der tatsächlichen Quelldatei abzugleichen, und eine Einrichtung für Browser-Sync vorgenommen, um die CSS-Datei zu überwachen, und dies injiziert automatisch das CSS in alle verbundenen Geräte und spiegelt alle Änderungen wider, die ich in DevTools an allen verbundenen Geräten vornehme. Super!!
Ich musste jedoch eine Änderung in der Datei „browser-sync-client.js“ vornehmen, damit es funktioniert, da browser-sync die neu injizierte CSS-Datei mit einem Zeitstempel versieht, wenn es die CSS-Datei injiziert. Daher habe ich die folgende Zeile **elem[attr] = currentValue + “?rel=” + timeStamp;** in „browser-sync-client.js“ in **elem[attr] = currentValue;** geändert. Ohne die Änderung funktioniert die CSS-Injektion nur beim ersten Mal mit den Chrome-Entwicklertools.
Hallo Chris,
Danke, toller Artikel über Grunt… das hat meinen Arbeitstag verbessert.
Jetzt erhalte ich eine Fehlermeldung bei browser_sync.
Warnung: Modul ‚optimist‘ nicht gefunden. Verwenden Sie –force, um fortzufahren.
Mit freundlichen Grüßen,
Jesudas