Dank einer excellent answer von @McMath habe ich jetzt ein Webpack, das sowohl meinen Client als auch meinen Server kompiliert. Ich versuche jetzt, webpack --watch
nützlich zu machen. Im Idealfall möchte ich, dass es etwas wie nodemon für meinen Server-Prozess gibt, wenn sich das Bundle ändert, und eine Art Browser-Synchronisierung, wenn sich mein Client ändert.
Ich weiß, dass es ein Bundler/Loader ist und nicht wirklich ein Aufgabenläufer, aber gibt es eine Möglichkeit, dies zu erreichen? Ein Mangel an Google-Ergebnissen scheint zu zeigen, dass ich etwas Neues ausprobiere, aber dies muss bereits geschehen sein.
Ich kann webpack immer in ein anderes Verzeichnis packen und es mit gulp ansehen/kopieren/browsersync-ify it, aber das scheint ein Hack zu sein. Gibt es einen besseren Weg?
Konfrontierte das gleiche Problem und fand die nächste Lösung - "webpack-Shell-plugin" ..__
ermöglicht das Ausführen von Shell-Befehlen vor oder nach dem Erstellen von Webpacks
Das sind also meine Skripte in package.json:
"scripts": {
"clean": "rimraf build",
"prestart": "npm run clean",
"start": "webpack --config webpack.client.config.js",
"poststart": "webpack --watch --config webpack.server.config.js",
}
Wenn ich 'start' Skript starte, wird die nächste Skriptsequenz gestartet: clean -> start -> poststart . Und es gibt einen Teil von 'webpack.server.config.js':
var WebpackShellPlugin = require('webpack-Shell-plugin');
...
if (process.env.NODE_ENV !== 'production') {
config.plugins.Push(new WebpackShellPlugin({onBuildEnd: ['nodemon build/server.js --watch build']}));
}
...
Das "onBuildEnd" -Ereignis wird nur einmal nach dem ersten Build ausgelöst, bei Neuerstellungen wird "onBuildEnd" nicht ausgelöst, daher funktioniert nodemon wie beabsichtigt
npm install npm-run-all webpack nodemon
package.json
-Datei wie unten gezeigt:package.json
{
...
"scripts": {
"start" : "npm-run-all --parallel watch:server watch:build",
"watch:build" : "webpack --watch",
"watch:server" : "nodemon \"./dist/index.js\" --watch \"./dist\""
},
...
}
Danach können Sie Ihr Projekt einfach mit npm start
ausführen.
Vergessen Sie nicht, das WatchIgnorePlugin für das Webpack zu konfigurieren, um den ./dist
-Ordner zu ignorieren.
npm-run-all
- Ein CLI-Tool zum Ausführen mehrerer npm-Skripts parallel oder sequentiell.webpack
- webpack ist ein Modulbündler. Sein Hauptzweck besteht darin, JavaScript-Dateien für die Verwendung in einem Browser zu bündeln, aber es ist auch in der Lage, nahezu jede Ressource oder Ressource zu transformieren, zu bündeln oder zu verpacken. nodemon
- Einfaches Monitorskript zur Verwendung bei der Entwicklung einer node.js-App.Ich mag die Einfachheit von nodemon-webpack-plugin
webpack.config.js
const NodemonPlugin = require('nodemon-webpack-plugin')
module.exports = {
plugins: [new NodemonPlugin()]
}
dann einfach Webpack mit dem Flag watch
ausführen
webpack --watch
Hier müssen keine Plugins verwendet werden. Sie können versuchen, mehrere nodemon
-Instanzen wie unten auszuführen. Ändern Sie das folgende Skript für Ihren Anwendungsfall und prüfen Sie, ob es für Sie geeignet ist:
"scripts": {
"start": "nodemon --ignore './public/' ./bin/www & nodemon --ignore './public/' --exec 'yarn webpack'",
"webpack": "webpack --config frontend/webpack.config.js"
}
Zusätzlich zu der guten Antwort von @ Ling:
Wenn Sie Ihr Projekt einmal erstellen möchten, bevor Sie es mit nodemon
anzeigen, können Sie ein Webpack Compiler-Hook verwenden. Der Code des Plugins löst nodemon
im done
-Hook einmal aus, nachdem das Webpack seine Kompilierung abgeschlossen hat (siehe auch dieses hilfreiche post ).
const { spawn } = require("child_process")
function OnFirstBuildDonePlugin() {
let isInitialBuild = true
return {
apply: compiler => {
compiler.hooks.done.tap("OnFirstBuildDonePlugin", compilation => {
if (isInitialBuild) {
isInitialBuild = false
spawn("nodemon dist/index.js --watch dist", {
stdio: "inherit",
Shell: true
})
}
})
}
}
}
webpack.config.js:
module.exports = {
...
plugins: [
...
OnFirstBuildDonePlugin()
]
})
package.json:
"scripts": {
"dev" : "webpack --watch"
},
Ich hoffe es hilft.
Sie benötigen keine Plugins, um Webpack und Nodemon zu verwenden. Verwenden Sie einfach diese Skripte in Ihrer package.json
"scripts": {
"start": "nodemon --ignore './client/dist' -e js,ejs,html,css --exec 'npm run watch'",
"watch": "npm run build && node ./server/index.js",
"build": "rimraf ./client/dist && webpack --bail --progress --profile"
},
@Ling hat eine Antwort sehr nahe an der Richtigkeit. Aber es ist fehlerhaft, wenn jemand zum ersten Mal Wache läuft. Sie müssen die Lösung ändern, um Fehler zu vermeiden.
npm install npm-run-all webpack nodemon
ausführen
Erstellen Sie eine Datei mit dem Namen watch-shim.js
in Ihrem Stammverzeichnis. Fügen Sie den folgenden Inhalt hinzu, der eine Dummy-Datei und ein Verzeichnis erstellt, wenn diese fehlen.
var fs = require('fs');
if (!fs.existsSync('./dist')) {
fs.mkdir('./dist');
fs.writeFileSync('./dist/bundle.js', '');
}
Richten Sie Ihre Skripte wie in package.json
ein. Dies wird nur dann überwacht, wenn die watch-shim.js
-Datei erfolgreich ausgeführt wird. Dadurch wird verhindert, dass Nodemon beim ersten Durchlauf aufgrund fehlender Dateien abstürzt.
{
...
"scripts": {
"start": "npm run watch",
"watch": "node watch-shim.js && npm-run-all --parallel watch:server watch:build",
"watch:build": "webpack --progress --colors --watch",
"watch:server": "nodemon \"./dist/bundle.js\" --watch \"./dist/*\""
}
...
},