Kann ich Webpack verwenden, um CSS und JS separat zu generieren?
Lesezeit: 9 Minuten
Brent Traut
Ich habe:
JS-Dateien, die ich bündeln möchte.
WENIGER Dateien, die ich in CSS kompilieren möchte (auflösen von @imports in ein einzelnes Bundle).
Ich hatte gehofft, diese als zwei separate Eingaben anzugeben und zwei separate Ausgaben zu haben (wahrscheinlich über Extract-Text-Webpack-Plugin). Webpack hat alle richtigen Plugins/Loader, um die Kompilierung durchzuführen, aber es scheint die Trennung nicht zu mögen.
Ich habe Beispiele von Leuten gesehen, die ihre LESS-Dateien direkt von JS benötigen, wie z require('./app.less');, aus keinem anderen Grund, als webpack anzuweisen, diese Dateien in das Bundle aufzunehmen. Dadurch haben Sie nur einen einzigen Einstiegspunkt, aber das scheint mir wirklich falsch zu sein – warum sollte ich LESS in meinem JS benötigen, wenn es nichts mit meinem JS-Code zu tun hat?
Ich habe versucht, mehrere Einstiegspunkte zu verwenden und sowohl den Eintrag JS als auch die LESS-Hauptdatei einzureichen, aber wenn mehrere Einstiegspunkte verwendet werden, generiert Webpack ein Bündel, das das JS beim Laden nicht ausführt – es bündelt alles, weiß es aber nicht was beim Start ausgeführt werden soll.
Verwende ich das Webpack einfach falsch? Sollte ich separate Instanzen von Webpack für diese separaten Module ausführen? Sollte ich Webpack sogar für Nicht-JS-Assets verwenden, wenn ich sie nicht in mein JS mischen werde?
Sollte ich Webpack sogar für Nicht-JS-Assets verwenden, wenn ich sie nicht in mein JS mischen werde?
Vielleicht nicht. Webpack ist definitiv js-zentriert, mit der impliziten Annahme, dass Sie eine js-Anwendung erstellen. Seine Umsetzung von require() ermöglicht es Ihnen, alles als Modul zu behandeln (einschließlich Sass/LESS-Partials, JSON, so ziemlich alles) und führt automatisch Ihr Abhängigkeitsmanagement für Sie durch (alles, was Sie require gebündelt ist, und sonst nichts).
Warum sollte ich LESS in meinem JS benötigen, wenn es nichts mit meinem JS-Code zu tun hat?
Leute tun dies, weil sie einen Teil ihrer Anwendung (z. B. eine React-Komponente, eine Backbone-Ansicht) mit js definieren. Zu diesem Teil der Anwendung gehört CSS. Die Abhängigkeit von einigen externen CSS-Ressourcen, die separat erstellt und nicht direkt vom js-Modul referenziert werden, ist anfällig, schwieriger zu bearbeiten und kann dazu führen, dass Stile veraltet sind usw. Webpack ermutigt Sie, alles modular zu halten, damit Sie ein CSS haben (Sass, was auch immer) Teilweise, die zu dieser js-Komponente und der js-Komponente gehört require()Es soll die Abhängigkeit deutlich machen (für Sie und das Build-Tool, das niemals Stile erstellt, die Sie nicht benötigen).
Ich weiß nicht, ob Sie Webpack verwenden könnten, um CSS selbst zu bündeln (wenn die CSS-Dateien nicht von js referenziert werden). Ich bin mir sicher, dass Sie etwas mit Plugins usw. verkabeln könnten, aber ich bin mir nicht sicher, ob dies sofort möglich ist. Wenn Sie die CSS-Dateien von Ihrem js aus referenzieren, können Sie das CSS mit dem Extract Text-Plugin, wie Sie sagen, einfach in einer separaten Datei bündeln.
Mir ist klar, dass dieser Ansatz nicht sehr modular ist, aber er sollte Ihnen eine Grundlage bieten, auf der Sie aufbauen können, und ist eine hervorragende Strategie für die Einführung von Webpack in Projekten, in denen Sie Javascript und CSS nicht miteinander mischen möchten.
Der Nachteil dieses Ansatzes ist, dass der CSS-Loader immer noch eine zusätzliche Javascript-Datei generiert (unabhängig davon, ob Sie sie verwenden möchten oder nicht). Dies wird angeblich in Webpack 5 behoben.
Sollte ich Webpack sogar für Nicht-JS-Assets verwenden, wenn ich sie nicht in mein JS mischen werde?
Ich sehe nichts Falsches daran, aber letztendlich hängt es von Ihrer Toleranz für die Verwaltung mehrerer Build-Systeme ab. Für mich fühlt sich das wie ein Overkill an, also bevorzuge ich es, im Webpack-Ökosystem zu bleiben.
Das Dummy-Js-Dateiproblem wurde anscheinend nicht in Webpack 5 behoben. Weiß jemand auch, wie man den gleichen Namen “Index” für die Js- und CSS-Ausgabedateien hat, z index.js und index.css? Gefragt unter: stackoverflow.com/questions/70698775/…
– Ciro Santilli Путлер Капут 六四事
13. Januar um 15:43 Uhr
Diese Antwort muss wahrscheinlich aktualisiert werden. Aus dem Mcep-Repo: It builds on top of a new webpack v5 feature and requires webpack 5 to work.
– aderchox
14. Mai um 19:33 Uhr
Ein separates CSS-Bundle kann ohne Verwendung generiert werden require('main/less) in einem Ihrer JS, aber wie Brendan im ersten Teil seiner Antwort betonte, ist Webpack nicht für ein globales CSS-Bundle konzipiert, das neben modularem JS verwendet werden kann. Es gibt jedoch einige Optionen.
Die erste besteht darin, einen zusätzlichen Einstiegspunkt für main.less hinzuzufügen und dann das Plugin Extract Text zu verwenden, um das CSS-Bundle zu erstellen:
Das Problem bei dieser Methode ist, dass Sie in diesem Beispiel neben dem Bundle auch eine unerwünschte JS-Datei generieren: style.js das ist nur ein leeres Webpack-Modul.
Eine andere Möglichkeit besteht darin, die main less-Datei zu einem vorhandenen Webpack-Einstiegspunkt hinzuzufügen:
Dies ist ideal, wenn Sie nur 1 Einstiegspunkt haben, aber wenn Sie mehr haben, sieht Ihre Webpack-Konfiguration etwas seltsam aus, da Sie willkürlich auswählen müssen, zu welchem Einstiegspunkt die main less-Datei hinzugefügt werden soll.
ExtractTextPlugin ist seit 10/2017 abgekündigt (vgl npmjs.com/package/extract-text-webpack-plugin), der Nachfolger ist das Mini-CSS-Extract-Plugin (in der separaten Antwort auf diese Frage behandelt: stackoverflow.com/a/59237067/1746685)
– Beobachter
7. Januar um 21:32 Uhr
Um die frühere Antwort von bdmason weiter zu verdeutlichen: Es scheint, dass die wünschenswerte Konfiguration darin besteht, für jede Seite ein JS- und CSS-Bundle zu erstellen:
Ja, das ist möglich, aber wie andere bereits sagten, benötigen Sie dafür zusätzliche Pakete (siehe devDependencies unter package.json). Hier ist der Beispielcode, den ich zum Kompilieren meines Bootstrap SCSS –> CSS und Bootstrap JS –> JS verwendet habe.
Folgende Anleitung kann ich empfehlen medium.freecodecamp.org/…
– wilo087
6. März 2019 um 22:32 Uhr