現役エンジニアがNode.jsを解説! 〜Node.jsのモジュール〜
この講座はYouTubeで動画形式でも用意しています。合わせてご覧ください。
目的
Node.jsのモジュールを理解する。
モジュールとは
ソフトウェア工学におけるモジュールは、ソフトウェアシステムを構成する部分的プログラムです。この抽象的な説明だと理解が難しいので、実際にモジュールを扱いながら説明をしていきます。
標準モジュールを使用する
Node.jsには基本的な操作のできる標準モジュールが提供されていて、Node.jsをインストールすると利用できます。
例1)Webサーバーを構築したい場合
「http」モジュールを使用します。
https://nodejs.org/dist/latest-v16.x/docs/api/http.html
1行目で読み込まれているhttp
がモジュール名になります。
実際のWeb開発では、より高度な機能が使えるExpressなどのWebフレームワークを使われることが多いですが、httpモジュールがそのベースになっています。
// httpがモジュール名
const http = require("http");
const hostname = "127.0.0.1";
const port = 3000;
// createServerのメソッドに処理の内容を書いていく
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello World");
});
// サーバーが起動したら、listenされたら実行される処理を記述
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
例2)ファイルを操作したい場合
「fs」モジュールを使用します。fsとはファイルシステムの略称です。
https://nodejs.org/dist/latest-v16.x/docs/api/fs.html
fsモジュールのreadFile
というメソッドで下記にあるdata1.txtのテキストファイルを読んでいます。
const fs = require("fs");
fs.readFile("data1.txt", "utf-8", (err, data) => {
if (err) throw err;
console.log(data);
});
同期・非同期のモジュール
fsに限らず同期・非同期のモジュールがそれぞれ用意されていることが多いです。
Node.jsは基本的に非同期で処理が実行されていくプログラミング言語になっていますが、readFile
の同期版であるreadFileSync
を使用し同期処理としての実装も可能です。
const fs = require("fs");
try {
// 同期
const buff = fs.readFileSync("data1.txt", "utf8");
console.log(buff);
} catch (e) {
console.log(e.message);
}
同期・非同期のどちらを使うのかですが、基本的にはパフォーマンスを考慮すると非同期のモジュールを使用すべきです。しかし、パフォーマンスの考慮が不要な場合は同期のモジュールを使用したほうが実装しやすいです。
また最近のNode.jsのバージョンではPromiseに対応したモジュールも提供されています。Promise版のreadFileを使った場合はasync/await
で記載しています。
// 非同期(Promise)
const fs = require("fs").promises;
const readFile = async (file) => {
try {
const buff = await fs.readFile(file, "utf-8");
console.log(buff);
} catch (e) {
console.log(e.message);
}
};
readFile("data1.txt");
Promiseに対応しているメソッドが使えるのであれば一番おすすめの書き方です。非同期処理やPromiseについては、動画で解説していますので参考にしてみてください。
モジュールを自作する
Node.jsのモジュール化の仕組みをCommonJS modulesと言います。CommonJS modulesのルールに従った書き方でモジュールを記載することで自作のモジュールも扱うことができます。
https://nodejs.org/docs/latest/api/modules.html#modules-commonjs-modules
モジュールのエクスポートはmodule.exports
やexports
、モジュールのインポートはrequire
を使って、コード内で自作モジュールを使用できます。
モジュールのエクスポート
const sayHelloWorld = () => {
console.log("hello world!");
};
exports.sayHelloWorld1 = sayHelloWorld1;
exports.モジュール名=モジュールの内容
でモジュール化できました。
これを呼ぶ場合、{}
の中に呼び出すモジュール、requireの後ろにファイル指定します。
const { sayHelloWorld1 } = require("./hello_world");
sayHelloWorld();
module.exportsを使用した場合
以下ではpersonというオブジェクトをexportしています。
const person = {
firstName: "Ken",
lastName: "Takahashi",
age: 29,
gender: "male",
interests: [
{
name: "programming",
emoji: "💻",
},
{
name: "motorcycle",
emoji: "🏍",
},
],
greeting: function () {
console.log("Hi! I'm " + this.firstName + " " + this.lastName);
},
};
module.exports = person;
これを呼ぶ場合には次の書き方になります。
const person = require("./person");
person.greeting();
先程までとの違いとして {}
が不要になります。また、module.exportsを使った方法は1つしかexportできません。
(補足)JavaScriptにおけるモジュール
フロントエンドJavaScriptのモジュールの扱い方は少し異なり、フロントエンドの場合は、import
とexport
文を使用してモジュールを扱います。そのため、場合によって使い分けが必要です。詳しくはコチラの記事も参考にしてみて下さい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules
まとめ
今回はNode.jsのモジュールについて学習しました。次回はNode.jsのパッケージ管理について学んでいきます。