🪛

よく使われるNodejs Module

2024/05/11に公開

Node.jsがよく使われている理由

二つのサーバー(=要請を処理する機械)があります。
Node.jsで作られたもの一つ、一般サーバー一つ、このように二つがあると仮定してみましょう。
このサーバーは、同じタスクを実行するサーバーです。 カフェで注文を処理する状況を例にとってみましょう。

お客さんが飲み物の注文を話し(要請)したら
スタッフがサーバーから要請を受けて飲み物をくれます(応答)。
お客様はスタッフからの飲み物を受け取ります。

一般サーバーの場合

カフェにお客さんが4人います。 それぞれ次のような注文をします

  1. 最初のお客様は、アイスコーヒ1杯を注文します。
  2. 3番目のお客様は、エスプレッソ1杯を注文します。
  3. 3番目のお客様は注文が複雑で、フラペチーノ10杯を注文します。
  4. 4番目のお客様は、カフェラテ1杯を注文します。
    一般サーバーは一度に一度の注文のみ処理できるので、最初のお客様の注文を完了した後になってようやく2番目のお客様の注文を処理することができます。 3番目のお客様の大量注文により、他のすべてのお客様は待たなければなりません。

Node.jsで開発したサーバーの場合

すべてのお客様の注文が同時に受け入れられます。 カフェのスタッフ(サーバー)は、各注文を非同期で処理します。
簡単な注文から先に処理してお客様にお届けします。 つまり、アイスコーヒやエスプレッソのような素早く作れる注文は、フラペチーノ10杯のような複雑な注文が処理されるのを待たずに先に提供されます。

この方法のおかげで、各お客様は自分の注文が独立的に処理され、完了するとすぐにコーヒーを受け取ることができ、特定のお客様の大量注文によって他のお客様が不必要に長い間待つ必要がありません。 Node.jsはこのような非同期的処理能力によって多くの同時要請を効率的に処理することができます。

これがNode.jsのNon-blocking I/Oの概念です。

Node.jsを学ばなければならない理由

  1. JavaScriptで何でもできるので生産性にいい
  2. フロントエンドの開発者には比較的簡単にバックエンドを勉強できる
  3. 半数以上の開発者がnodejsを使用している
  4. 大手企業がnodejsを使用している(NETFLIX、リンクトイン、NASA、aws、PayPal)
  5. npmパッケージを利用できる

Node.jsのインストールと開発環境の準備

https://iterm2.com/
https://code.visualstudio.com/
https://nodejs.org/en/
https://git-scm.com/downloads
https://www.postman.com/

よく使われるNode Module

global

const fs = require('fs')
// vscodeにこれはnode moduleだと教える

console.log(global)
// ->ブラウザのglobalオブジェクトであるwindowに定義されるが、nodejsではglobal自体がオブジェクトとなる

global.text = ()=> {
    console.log('hello')
    global.console.log('hello')
}

global.text()
text()
// globalを省略可能
// https://nodejs.org/docs/latest/api/globals.html

console

console.log("lodding....");
// 現在までのconsoleクリア
console.clear();

// log level
console.log("log"); // 
console.info ("info"); // 重要な情報に対して残したい時
console.warn("warn"); // 警報段階
console.error("error"); // エラー、ユーザーエラー、システムエラー
// ブラウザでは表示されるが, nodeでは文字だけが表示される
// でも後でサーバーに配布した時、本当に重要なエラーやワーニングをログに残せる
// ログの深刻さに応じてレベルごとにコンソールログを書いた場合、後で配布した場合、サーバーの深刻さに素早く気づきやすく、後で修正しやすくなる

// print object
const student = { name: "sunny", age: 20, company: { name: "suncomapny" } };
// オブジェクト出力
console.log(student);
// tableで見やすく出力
console.table(student);
// オプション設定で表示したいオブジェクトを設定できる
// https://nodejs.org/api/console.html#consoledirobj-options
console.dir(student, { showHidden: true, colors: false, depth: 0 });

assert

// assert
let number = 15;
console.assert(number > 10, "The number should be greater than 10.");
number = 8;
console.assert(number > 10, "The number should be greater than 10.");
// 最初に渡した値がtrueでない時だけ出力する、特定の条件の時にログを出力したい時に使用

measuring time

// measuring time
// 時間測定、同じラベルが開始して終わるまでの時間がわかる
// 性能確認時に非常に有用
console.time("for loop");
for (let i = 0; i < 10; i++) {
  i++;
}
console.timeEnd("for loop");

counting

// counting
// 関数が何回呼び出されたかを確認可能
function a() {
  console.count("a function");
}
a();
a();
// count初期化
console.countReset("a function");
a();

trace

// trace
// 関数がどこから呼び出されたかを確認可能
// デバッグするときに有用だ
function f1() {
  f2();
}
function f2() {
  f3();
}
function f3() {
  console.log("f3");
  console.trace();
}
f1();

this

function test() {
  console.log(this);
  console.log(this === global); //   true
}
test();

class testClass {
  constructor(num) {
    this.num = num;
  }
  testFuncion() {
    console.log("--- class ---");
    console.log(this); // testClass { num: 1 }
    console.log(this === global); // false
    // クラスでthisとは自分自身を指している
    // クラス外でのthisはglobalを指している
  }
}

const a = new testClass(1);
a.testFuncion();

console.log("--- global scope ---");
// 関数の内部もクラス内部でもない場合
console.log(this); // {} 何も出力できない
console.log(this === exports); // exports

process

// node processに関する情報を得ることができる
const process = require("process");

console.log(process.execPath);
console.log(process.version);
console.log(process.pid);
console.log(process.ppid);
console.log(process.platform);
console.log(process.env);
console.log(process.uptime());
console.log(process.cwd());
console.log(process.cpuUsage());

そのほか

const path = require("path");

console.log(__dirname);
console.log(__filename);
// /Users/pakusonhi/Desktop/study/node-basic/1-node/9-path
// /Users/pakusonhi/Desktop/study/node-basic/1-node/9-path/app.js

console.log(path.sep);
console.log(path.delimiter);
// /
// :

// basename
console.log(path.basename(__filename));
console.log(path.basename(__filename, ".js"));
// app.js
// app

//dirname
console.log(path.dirname(__filename));
// /Users/pakusonhi/Desktop/study/node-basic/1-node/9-path

// extension
console.log(path.extname(__filename));
// .js

//parse
const parsed = path.parse(__filename);
console.log(parsed);
// {
//     root: '/',
//     dir: '/Users/pakusonhi/Desktop/study/node-basic/1-node/9-path',
//     base: 'app.js',
//     ext: '.js',
//     name: 'app'
//   }

// isAbsolute
// 絶対経路なのか相対経路なのか確認可能
console.log("isAbsolute?", path.isAbsolute(__dirname)); // /Users/
console.log("isAbsolute?", path.isAbsolute("../"));

// normalize
// 経路でエラーがある場合は自分で直してくれる
console.log(path.normalize("./node-basic////////sub"));

// join
//
console.log(__dirname + path.sep + "image");
console.log(path.join(__dirname, "image"));

https://nodejs.org/en/learn/getting-started/introduction-to-nodejs
https://nodejs.org/docs/latest/api/

Discussion