Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion darüber, wie Sie mit Node die Arbeitseffizienz verbessern können

Eine kurze Diskussion darüber, wie Sie mit Node die Arbeitseffizienz verbessern können

青灯夜游
青灯夜游nach vorne
2021-11-10 09:55:461488Durchsuche

Dieser Artikel zeigt Ihnen, wie Sie Node bei der Arbeit verwenden und wie Sie damit die Arbeitseffizienz verbessern können.

Eine kurze Diskussion darüber, wie Sie mit Node die Arbeitseffizienz verbessern können

Im Arbeitsprojekt müssen Sie sich auf externe Dateien verlassen. Diese Datei wird von anderen Teams verwaltet, mit Jenkins erstellt und das Build-Produkt wird an [Amazon S3] (aws.amazon.com/pm) übertragen /serv-s3/…) müssen wir die Datei manuell von S3 herunterladen und dann in das Projekt kopieren. Der gesamte Prozess kann automatisiert werden.

Darüber hinaus sind wir auch auf ein ernstes Problem gestoßen: Der Pfad des Build-Produkts, das wir in S3 benötigen, ähnelt „a/b//c/“, das zusätzliche / ist tatsächlich ein Ordner mit dem Namen „/“, dieser Ordner Unter Mac kann das Verzeichnis normalerweise nicht erkannt werden, da „/“ als Dateitrennzeichen angesehen wird Um es in der virtuellen Maschine zu verwenden, ist dieser Vorgang äußerst verschwenderisch und sinnlos. [Empfohlenes Lernen: „nodejs Tutorial“]

Da Amazon API-Zugriff bietet, dachte ich darüber nach, ein Skript zu implementieren, um die Arbeit des Herunterladens von Updates abzuschließen.

Prozesssortierung

Unbenutztes Skript:

Eine kurze Diskussion darüber, wie Sie mit Node die Arbeitseffizienz verbessern können

Verwendetes Skript:

jenkins → Produktname → Skript ausführen

Auf diese Weise kann es direkt abgeschlossen werden, Sie können den manuellen Vorgang speichern und es wird kein „/“ angezeigt Fehlerproblem.

Entwicklung

Mit AWS verbinden

Hier verwenden wir das von Amazon bereitgestellte aws-sdk, verwenden den S3-Client, übergeben die accessKeyId und den SecretAccessKey zum Herstellen einer Verbindung:

import S3 from "aws-sdk/clients/s3";
const s3 = new S3({ credentials: { accessKeyId, secretAccessKey } });

Laden Sie die Datei herunter

Das aws-sdk stellt Bucket und Datei bereit Ergänzungen Löschen und ändern Sie die Schnittstelle. Hier können wir den von Jenkins erstellten Produktdateinamen entsprechend dem Dateinamen und dem Speicherort abrufen:

const rs = s3
  .getObject({ Bucket: "your bucket name", Key: "file dir + path" })
  .createReadStream();

Bucket ist der Bucket-Speicherort, an dem die Datei gespeichert ist. Der Schlüssel ist die Pfadinformation der Datei in S3, der gesamte Pfad entspricht Verzeichnisname + Dateiname.

Hier können wir einen ReadStream abrufen und dann node.js verwenden, um direkt in die lokale Datei zu schreiben:

const ws = fs.createWriteStream(path.join(__dirname, outputfilename));
rs.pipe(ws);

Extract

Verwenden Sie das Node-Tar-Tool, um es zu dekomprimieren und direkt zu installieren:

npm install tar

extract Der Alias ​​ist x, Verwenden Sie hier direkt die tar.x-Methode. Diese Methode kann ReadStream direkt verarbeiten, die Originaldaten dekomprimieren und in die Datei schreiben, sodass wir ReadStream direkt an tar.x übergeben können, ohne die ursprüngliche .tar-Datei zu speichern:

- const ws = fs.createWriteStream(path.join(__dirname, outputfilename));
- rs.pipe(ws);
+ rs.pipe(tar.x({ C: path.join(__dirname, outputfilename) }));

Hier Die Pipe-Operation gibt das Stream-Objekt zurück, und wir können die Finish-Methode anhören, um den nachfolgenden Prozess abzuwickeln:

const s = rs.pipe(tar.x({ C: path.join(__dirname, outputfilename) }));
s.on('finish', () => {
	// do something ...
})

Flatten Directory

Die Originaldatei hat Unterordner, und wir müssen sie in die äußerste Ebene verschieben, also brauchen wir um einen Flat-Folder-Vorgang durchzuführen.

Die fs-bezogene API wird hier zum Lesen verwendet. Die fs-API ist in zwei Typen unterteilt: Der Name der synchronen API endet mit Sync. Die asynchrone Funktion verwendet standardmäßig den entsprechenden Promise-Stil wird unter der fs/promises-API bereitgestellt und kann bei Bedarf verwendet werden.

Da unser Verzeichnis nur eine Ebene hat, führen wir nur eine Ebene zum Reduzieren durch. Wenn es mehrere Ebenen gibt, können wir dies durch Rekursion erreichen:

async function flatten(dir) {
  const fileAndDirs = await fsp.readdir(dir);
  const dirs = fileAndDirs.filter((i) =>
    fs.lstatSync(path.join(dir, i)).isDirectory()
  );
  for (const innerDir of dirs) {
    const innerFile = await fsp.readdir(path.join(dir, innerDir));
    await Promise.all([
      innerFile
        .filter((item) => fs.lstatSync(path.join(dir, innerDir, item)).isFile())
        .map((item) =>
          fsp.rename(path.join(dir, innerDir, item), path.join(dir, item))
        ),
    ]);
    remove(path.join(dir, innerDir));
  }
}

Kopieren Sie es an den Zielort

und kopieren Sie es dann in unser Projektverzeichnis . Zum Kopieren rufen Sie einfach die copyFile-API auf. Für unnötige Dateien verwenden Sie reguläre Ausdrücke, um die Ausschluss-Blacklist zu konfigurieren:

async function copy(from, to) {
  const files = await fsp.readdir(from);
  await Promise.all(
    files
      .filter((item) => !exclude.test(item))
      .map((item) => fsp.copyFile(path.join(from, item), path.join(to, item)))
  );
}

Konfigurationsdatei

Bei der tatsächlichen Verwendung sollten die Konfigurationsdatei vom Code getrennt sein. Die accessKeyId und der SecretAccessKey sollten hier sein Von jedem Benutzer konfiguriert, daher wird diese Datei lokal vom Benutzer erstellt und der relevante Konfigurationsinhalt wird im Hauptprogramm gelesen:

// config.js
module.exports = {
  s3: {
    accessKeyId: 'accessKeyId',
    secretAccessKey: 'secretAccessKey',
  }
};
// main.js
if (!fs.existsSync('config.js')) {
  console.error('please create a config file');
  return;
}
const config = require(path.resolve(__dirname, 'config.js'));

Übergabe von Parametern

Der Dateiname für jeden Download Muss beim Aufrufen übergeben und in die Datei geschrieben werden, wird sie häufig geändert, daher wird sie hier direkt als Parameter übergeben.

Sie können es über „process.argv“ in „node.js“ lesen. Das erste Element dieses Arrays ist der Pfad des aktuell ausgeführten Skripts Der Anfang ist ein benutzerdefinierter Parameter und muss daher bei „process.argv[2]“ beginnen. Wenn Sie komplexe Befehlszeilenparameteranforderungen haben, können Sie eine Befehlszeilenparameter-Parsing-Bibliothek wie Commander verwenden. Da für dieses Beispiel nur ein Parameter erforderlich ist, können Sie ihn hier direkt lesen:

const filename = process.argv[2];
if (!filename) {
	console.error('please run script with params');
	return;
}

至此,一个可用的命令行工具就完成了。

总结

node.js 可以开发后端,但是 node.js 意义最大的地方绝不是使用 JS 开发后端。对前端开发者而言,node.js 真正的价值在于它是一个非常实用的工具,前端工具 Webpack、rollup、dev-server 等都是 node 创造的价值,由于 NPM 丰富的生态,使用 node 可以快速完成脚本的开发,处理开发中遇到的一些工具链与效率的问题很有效,在工作中遇到问题时可以考虑尝试。

更多编程相关知识,请访问:编程入门!!

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion darüber, wie Sie mit Node die Arbeitseffizienz verbessern können. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen