In mijn package.json
heb ik deze twee scripts:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
Ik moet deze 2 scripts paralleluitvoeren telkens als ik begin met ontwikkelen in Node.js. Het eerste waar ik aan dacht was het toevoegen van een derde script, zoals dit:
"dev": "npm run start-watch && npm run wp-server"
… maar dat zal wachten tot start-watch
klaar is voordat wp-server
wordt uitgevoerd.
Hoe kan ik deze parallel uitvoeren?Houd er rekening mee dat ik de output
van deze commando’s moet zien. Als uw oplossing een build-tool omvat, gebruik ik liever gulp
in plaats van grunt
omdat ik het al in een ander project gebruik.
Antwoord 1, autoriteit 100%
Gebruik een pakket met de naam gelijktijdig.
npm i concurrently --save-dev
Stel vervolgens uw taak npm run dev
als volgt in:
"dev": "concurrently --kill-others \"npm run start-watch\" \"npm run wp-server\""
Antwoord 2, autoriteit 27%
Als je een UNIX-achtige omgeving gebruikt, gebruik dan gewoon &
als scheidingsteken:
"dev": "npm run start-watch & npm run wp-server"
Anders kunt u, als u geïnteresseerd bent in een platformonafhankelijke oplossing, npm-run-allgebruiken module:
"dev": "npm-run-all --parallel start-watch wp-server"
Antwoord 3, autoriteit 13%
Vanuit windows cmd kunt u start
gebruiken:
"dev": "start npm run start-watch && start npm run wp-server"
Elke opdracht die op deze manier wordt gestart, begint in zijn eigen venster.
Antwoord 4, autoriteit 10%
U moet npm-run-allgebruiken (of concurrently
, parallelshell
), omdat het meer controle heeft over het starten en doden van commando’s. De operators &
, |
zijn slechte ideeën omdat je het handmatig moet stoppen nadat alle tests zijn voltooid.
Dit is een voorbeeld voor gradenboogtesten via npm:
scripts: {
"webdriver-start": "./node_modules/protractor/bin/webdriver-manager update && ./node_modules/protractor/bin/webdriver-manager start",
"protractor": "./node_modules/protractor/bin/protractor ./tests/protractor.conf.js",
"http-server": "./node_modules/http-server/bin/http-server -a localhost -p 8000",
"test": "npm-run-all -p -r webdriver-start http-server protractor"
}
-p
= Voer opdrachten parallel uit.
-r
= Stop alle commando’s wanneer een ervan eindigt met een afsluitcode van nul.
Als u npm run test
uitvoert, wordt de Selenium-driver gestart, wordt de http-server gestart (om u bestanden te bezorgen) en worden gradenboogtests uitgevoerd. Zodra alle tests zijn voltooid, worden de http-server en het seleniumstuurprogramma gesloten.
Antwoord 5, autoriteit 5%
U kunt één &
gebruiken voor parallel uitgevoerd script
"dev": "npm run start-watch & npm run wp-server"
Antwoord 6
npm-run-all --parallel task1 task2
bewerken:
Je moet npm-run-allvooraf hebben geïnstalleerd. Kijk ook op deze paginavoor andere gebruiksscenario’s.
Antwoord 7
Snelle oplossing
In dit geval zou ik zeggen de beste gokAls dit script voor een privémodule is die bedoeld is om alleen op *nix-gebaseerde machines te draaien, kunt u de besturingsoperator voor forking-processen, die er als volgt uitziet: &
Een voorbeeld om dit te doen in een gedeeltelijk package.json-bestand:
{
"name": "npm-scripts-forking-example",
"scripts": {
"bundle": "watchify -vd -p browserify-hmr index.js -o bundle.js",
"serve": "http-server -c 1 -a localhost",
"serve-bundle": "npm run bundle & npm run serve &"
}
Je voert ze dan beide parallel uit via npm run serve-bundle
. U kunt de scripts verbeteren om de pids van het gevorkte proces naar een bestand als volgt uit te voeren:
"serve-bundle": "npm run bundle & echo \"$!\" > build/bundle.pid && npm run serve & echo \"$!\" > build/serve.pid && npm run open-browser",
Google iets als bash control operator for forkingvoor meer informatie over hoe het werkt. Ik heb ook wat meer context gegeven met betrekking tot het gebruik van Unix-technieken in Node-projecten hieronder:
Verdere context RE: Unix Tools & Node.js
Als je geen Windows gebruikt, werken Unix-tools/-technieken vaak goed om iets te bereiken met Node-scripts, omdat:
- Veel van Node.js imiteert liefdevol Unix-principes
- Je gebruikt *nix (incl. OS X) en NPM gebruikt toch een shell
Modules voor systeemtaken in Nodeland zijn ook vaak abstracties of benaderingen van Unix-tools, van fs
tot streams
.
Antwoord 8
npm install npm-run-all --save-dev
pakket.json:
"scripts": {
"start-watch": "...",
"wp-server": "...",
"dev": "npm-run-all --parallel start-watch wp-server"
}
Meer info: https: //github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
9
Eenvoudig node-script om u op weg te helpen zonder al te veel gedoe. Readline gebruiken om outputs te combineren zodat de lijnen niet verminkt raken.
const { spawn } = require('child_process');
const readline = require('readline');
[
spawn('npm', ['run', 'start-watch']),
spawn('npm', ['run', 'wp-server'])
].forEach(child => {
readline.createInterface({
input: child.stdout
}).on('line', console.log);
readline.createInterface({
input: child.stderr,
}).on('line', console.log);
});
Antwoord 10
Ik gebruik al een tijdje npm-run-all, maar ik kon er nooit mee overweg, omdat de uitvoer van het commando in de horlogemodus niet goed samenwerkt. Als ik bijvoorbeeld create-react-app
en jest
start in de horlogemodus, kan ik alleen de uitvoer zien van het laatste commando dat ik heb uitgevoerd. Dus meestal voerde ik al mijn opdrachten handmatig uit…
Daarom implementeer ik mijn eigen lib, run-screen. Het is nog een heel jong project (van gisteren :p ) maar het is misschien de moeite waard om ernaar te kijken, in jouw geval zou het zijn:
run-screen "npm run start-watch" "npm run wp-server"
Druk vervolgens op de numerieke toets 1
om de uitvoer van wp-server
te zien en druk op 0
om de uitvoer van start-watch
.
Antwoord 11
Dit werkte voor mij
{
"start-express": "tsc && nodemon dist/server/server.js",
"start-react": "react-scripts start",
"start-both": "npm -p -r run start-react && -p -r npm run start-express"
}
Zowel client als server zijn in typoscript geschreven.
De React-app is gemaakt met create-react-app met het typescript-sjabloon en staat in de standaard src-directory.
Express staat in de servermap en het invoerbestand is server.js
typescript code en omgezet in js en in de dist directory geplaatst .
bekijk mijn project voor meer info: https://github.com/nickjohngray/staticbackeditor
UPDATE:
npm run dev bellen om te beginnen
{"server": "tsc-watch --onSuccess \"node ./dist/server/index.js\"",
"start-server-dev": "npm run build-server-dev && node src/server/index.js",
"client": "webpack-dev-server --mode development --devtool inline-source-map --hot",
"dev": "concurrently \"npm run build-server-dev\" \"npm run server\" \"npm run client\""}
Antwoord 12
Je kunt ook pre
en post
gebruiken als voorvoegsels voor je specifieke script.
"scripts": {
"predev": "nodemon run-babel index.js &",
"dev": "webpack-dev-server"
}
En voer dan uit:
npm run dev
Antwoord 13
Alleen shell-scripting gebruiken, op Linux.
"scripts": {
"cmd": "{ trap 'trap \" \" TERM; kill 0; wait' INT TERM; } && blocking1 & blocking2 & wait"
}
npm run cmd
en toen
^C
zal kinderen doden en wachten op een schone uitgang.
Antwoord 14
Een eenvoudige en native manier voor Windows CMD
"start /b npm run bg-task1 && start /b npm run bg-task2 && npm run main-task"
(start /b
betekent starten op de achtergrond)
Antwoord 15
Omdat je misschien meer en meer aan deze scripts moet toevoegen, wordt het rommelig en moeilijker te gebruiken. Wat als u enkele voorwaarden nodig heeft om te controleren, variabelen om te gebruiken? Dus ik raad je aan om te kijken naar google/zxwaarmee je js kunt gebruiken om scripts te maken.
Eenvoudig gebruik:
- installeer zx:
npm i -g zx
- voeg
package.json
-opdrachten toe (optioneel, je kunt alles naar scripts verplaatsen):
"scripts": {
"dev": "zx ./scripts/dev.mjs", // run script
"build:dev": "tsc -w", // compile in watch mode
"build": "tsc", // compile
"start": "node dist/index.js", // run
"start:dev": "nodemon dist/index.js", // run in watch mode
},
- maak
dev.mjs
scriptbestand:
#!/usr/bin/env zx
await $`yarn build`; // prebuild if dist is empty
await Promise.all([$`yarn start:dev`, $`yarn build:dev`]); // run in parallel
Elke keer dat u een dev-server wilt starten, voert u gewoon yarn dev
of npm run dev
uit.
Het zal eerst ts->js compileren en vervolgens de typecrpt-compiler en server parallel in watch-modus uitvoeren. Wanneer u uw ts-bestand wijzigt, wordt het opnieuw gecompileerd door tsc->nodemon zal de server opnieuw opstarten.
Geavanceerd programmatisch gebruik
Laad env-variabelen, compileer ts in watch-modus en voer de server opnieuw uit van dist bij wijzigingen (dev.mjs):
#!/usr/bin/env zx
import nodemon from "nodemon";
import dotenv from "dotenv";
import path from "path";
import { fileURLToPath } from "url";
// load env variables
loadEnvVariables("../env/.env");
await Promise.all([
// compile in watch mode (will recompile on changes in .ts files)
$`tsc -w`,
// wait for tsc to compile for first time and rerun server on any changes (tsc emited .js files)
sleep(4000).then(() =>
nodemon({
script: "dist/index.js",
})
),
]);
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function getDirname() {
return path.dirname(fileURLToPath(import.meta.url));
}
function loadEnvVariables(relativePath) {
const { error, parsed } = dotenv.config({
path: path.join(getDirname(), relativePath),
});
if (error) {
throw error;
}
return parsed;
}