Node.js

Node基礎

kurumin

ファイルの作成

const fs = require('fs');

fs.writeFileSync(__dirname + '/test.txt', 'Hello, node.js');

実行すると、test.txtが生成される。

__dirname・・・現在いる場所から実行するファイルまでの、相対パスが格納されている変数

__dirfile・・・実行するファイルの絶対パスが格納されている変数

パスのresolve

const fs = require('fs');
const path = require('path');

const distPath = path.resolve(__dirname, '../dist/test.txt');

fs.writeFileSync(distPath, 'Hello, node.js');

..で一つ上の階層に上がる場合に、補完してくれる。
パスを指定する場合は、使用したほうが安全。
OSによっては\\でディレクトリを表現する場合もあり、実行する環境に合わせてパスを出力してくれるのでそういった意味でも使用する。

path.resolve(__dirname, '..', 'dist', 'test.txt');

上記の書き方もあるので覚えておくといい。

モジュール管理システムについて

Common.jsとESmoduleの2種類があるが、基本的にESmoduleを使用すればよい。

Common.jsの書き方

1つの関数を読み込む

function plus(a, b) {
  return a + b;
}

module.exports = plus;
const plus = require('./plus');

const result = plus(1, 2);
console.log(result);

requireで指定するファイルの拡張子は省略できる。

2つ以上の関数を読み込む

2つ以上の関数を読み込む場合は下記のように定義する。

function plus(a, b) {
  return a + b;
}

function minus(a, b) {
  return a - b;
}

module.exports = {
  plus,
  minus
};

// ↓この書き方もできる
// module.exports = {
//   plus: plus,
//   minus: minus
// };
const calc = require('./calc);

const result = calc.plus(1, 2);
console.log(result);

特定の関数を分割代入で読み込む

const { plus } = require('./calc);

const result = plus(1, 2);
console.log(result);

渡ってきた関数のplusというプロパティに定義された関数のみを取得するという意味になる。

分割代入とは?

配列やオブジェクトの特定の要素を変数として抽出する方法。

下記の記述では、aに配列1、bに配列2、cに配列3が格納されることになる。

const [ a, , c ] = ['配列1', '配列2', '配列3'];
console.log(a);
console.log(c);

オブジェクトの場合は下記になる。

const { x, z } = { x: 'オブジェクト1', y: 'オブジェクト2', z: 'オブジェクト3' };
console.log(x);
console.log(z);

プロパティの名前が分割代入で宣言する名前に一致している必要がある。

ESmoduleの書き方

機能の有効化

package.jsonのtypeにモジュールを指定するか、拡張子をmjsにする必要がある。

{
  "type": "module"
}

関数を読み込む

function plus(a, b) {
  return a + b;
}

function minus(a, b) {
  return a - b;
}

export {
  plus,
  minus
};
import { plus } from './calc.js';

const result = plus(1, 2);
console.log(result);

下記の書き方もできる。

export function plus(a, b) {
  return a + b;
}

export function minus(a, b) {
  return a - b;
}

デフォルトエクスポート(名前付きエクスポート)

export function plus(a, b) {
  return a + b;
}

default export function minus(a, b) {
  return a - b;
}
import minusFn, { plus } from './calc.js';

const result = minusFn(1, 2);
console.log(result);

デフォルトエクスポートにした関数は、{ }を使用せず呼び出すことができる。

全ての関数を読み込む

export function plus(a, b) {
  return a + b;
}

default export function minus(a, b) {
  return a - b;
}
import minusFn, * as calc from './calc.js';
console.log(calc)
const result = minusFn(1, 2);
console.log(result);
* as

全ての関数を呼び出すオブジェクトが作成される。

上記の場合、defaultプロパティにminus関数、plusプロパティにplus関数が格納されることになる。

__filenameと__dirname

ESmoduleでは__filenameや__dirnameは使えない。

使う際は以下の記述をする。

import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const __dirname2 = fileURLToPath(new URL('.', import.meta.url));

console.log(__filename);
console.log(__dirname);
console.log(__dirname2);

// ▼結果
// C:\Users\user\Desktop\tmp\a\main2.js
// C:\Users\user\Desktop\tmp\a
// C:\Users\user\Desktop\tmp\a\

JSONファイルの読み込み

ESmoduleではrequireが使用できないのでrequireによるJSONファイルの読み込みができない。

(Common.jsの場合、requireでJSONファイルまでのパスを記載するとそのJSONがパース(変換)されオブジェクト形式で取り出すことができる)

方法1・createRequireを使用する
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const jsonObj = require('./sample.json');
console.log(jsonObj);
方法2・Node 19 Experimental

バージョン19から実験段階で使用できるが、基本的にはcreateRequireを使用する。

import jsonObj from './sample.json' assert { type: 'json' };glo
console.log(jsonObj);

globalThis

ブラウザではwindowsオブジェクトが使用できるが、Node.jsの場合はglobalThisというオブジェクトが使える。

ABOUT ME
記事URLをコピーしました