Noch immer führt die Suche nach einem Coding-Style für Node.js ins Leere. Da man sich für ein gleichmäßiges Code-Bild auch ohne offizielle Vorgabe Richtlinien schaffen muss, habe ich hier einen Vergleich zweier wesentlicher Module vorgenommen: Nodes integriertes FS und das unangefochtene Paketwerkzeug NPM.
Ich betrachte für mich derzeit relevante Punkte, wie etwa:
- Einrückung
- if-Statements
- Stringausdrücke
- Variablendeklaration
- Semikolons
Mein Fazit: Den einen Node-Coding-Style gibt es nicht. Selbst die beiden Kernmodule weisen elementare Unterschiede auf. Den eigenen Stil muss man sich nach wie vor selbst zusammensuchen.
Eine Alternative: In Coffeescript ist der Code-Style Teil der Syntax, was konsistenten Code begünstigt.
Gemeinsamkeiten
Code-Einrückung
Zwei Leerzeichen:
Node FS
function read() { if (size === 0) { buffer = new Buffer(8192); fs.read(fd, buffer, 0, 8192, -1, afterRead); } else { fs.read(fd, buffer, pos, size - pos, -1, afterRead); } }
Einzeilige If-Bedingungen
Meist einzeilig, aber nicht konsequent. In Verbindung mit else
immer geklammert und mehrzeilig.
Node FS
if (er) return callback(er); if (bytesRead === 0) { return close(); }
Argumentlisten
Keine Leerzeichen zwischen Klammer und Argument, Argumente durch Komma und Leerzeichen getrennt:
NPM
cb(null, made)
Strict-Mode
Keines der beiden Module verwendet den Strict-Mode von ECMA-Script 5.
Unterschiede
Variablen deklarieren
Node FS
var binding = process.binding('fs'); var constants = process.binding('constants'); var fs = exports;
NPM
var EventEmitter = require("events").EventEmitter , npm = module.exports = new EventEmitter , config = require("./config.js")
Verwendung von Semikolons
Node FS
Übliche, konsequente Verwendung des Semikolons am Ende eines Ausdrucks:
var kMinPoolSpace = 128; return function(err) { if (err) { throw err; } }; fs.Stats.prototype._checkModeProperty = function(property) { return ((this.mode & constants.S_IFMT) === property); };
NPM
Soweit möglich konsequenter Verzicht auf Semikolons:
var cmd = require(__dirname+"/"+a+".js") function defaultCb (er, data) { if (er) console.error(er.stack || er.message) else console.log(data) } npm.deref = function (c) { // ... var a = abbrevs[c] if (aliases[a]) a = aliases[a] return a }
Stringausdrücke
Einfache Anführungszeichen, Leerzeichen zwischen String und Operator:
Node FS
'Unknown file open flag: ' + flag
NPM
Doppelte Anführungszeichen, keine Leerzeichen zwischen String und Operator:
"npm requires node version: "+j.engines.node
Vergleichsoperatoren: ==
gegen ===
Node FS
Kein konsequent beachteter Stil:
typeof data == 'string' typeof arg1 === 'string'
NPM
typeof cli === "function"
Objektliterale
Node FS
Meist einzeilig:
options = { encoding: 'utf8', mode: 438 /*=0666*/, flag: 'a' };
NPM
Wie Variablendeklaration mehrzeilig mit vorgestelltem Komma:
npm.modes = { exec: 0777 & (~umask) , file: 0666 & (~umask) , umask: umask }