Synchronní Exec v Node.js

Všichni milují NodeJS částečně proto, že zahrnuje filozofii neblokování; interakce jsou asynchronní, a tak teoreticky umožňují rychlejší všestranné zpracování. Při vytváření jednoduchého skriptu pro můj nadcházející redesign jsem zjistil, že asynchronicita je ... otravná. Rychle jsem se propadal do pekla zpětného volání s prováděním serverů, které jsem spouštěl přes Node.js. Naštěstí jsem našel skvělý balíček nazvaný exec-sync, který umožňuje synchronní provádění příkazů shellu, takže se necítím příliš hluboko v hloubce zpětných volání.

Instalace exec-sync

Balíček exec-sync je dostupný přes npm:

npm install exec-sync

Nemáte rádi správu balíků?!

Použití execSync

exec-synce funguje jako jakákoli jiná komponenta Node.js; vyžadovat a je připraven k použití:

// Require the dependency
var execSync = require("exec-sync");

// The traditional way
var exec = require('child_process').exec;
exec('ORIGINAL COMMAND', function(err, stdout, stderr) {
	// React to callback

	exec('SOME OTHER COMMAND', function(err2, stdout2, stderr2) {
		// More reacting

		// ... more nesting that isn't desired
	});
});

// The execSync way

var execSync = require("exec-sync");

// Create the JavaScript dir, uglify contents
execSync("cp -R "  + sourceDir + "js " + jsDir);
doCompress && walkAndDo("js", jsDir, function(fileName, stat) {
	execSync("./node_modules/uglify-js/bin/uglifyjs -nc --reserved-names 'require,define,curl,z' --unsafe --lift-vars --overwrite " + fileName);
});

// Copy the "crons" and "cache" directories over
execSync("cp -R " + sourceDir + "crons " + dirPath + "crons");
execSync("cp -R " + sourceDir + "cache " + dirPath + "cache");

// Delete all bullshit ".DS_Store" files
execSync("find . -type f -name .DS_Store -exec rm -rf {} +");

// And when all is done, copy to another place
execSync("mv " + dirPath + " ../../../wp-content/themes/jack"); 

Všimněte si, že místo předávání zpětného volání metodě execSync mohu jednoduše předpokládat, že věci běží shora dolů, což mi umožňuje vyhnout se hromadě vnořených zpětných volání, která by pouze zašpinila můj kód. Samozřejmě některé procesy mohou být asynchronní, ale exec-sync mi umožňuje udržovat myšlenkový proces shora dolů. Node.js má nástroje pro několik z těchto funkcí, ale spuštění shellu udržuje kód kratší.

Výše uvedený kód byl jen malý úryvek mého souboru sestavení. Bez exec-sync bych musel buď vnořovat a vnořovat a vnořovat zpětná volání, nebo získat implementaci Deferred pro zpracování všech zpětných volání. Použití odložené implementace by umožnilo vyšší rychlost procesu sestavování, ale když proces trvá jen několik sekund, kompromis za provedení shora dolů za to stojí.