Node.js を Mac にインストール(nodebrew の使い方)

以下は Homebrew と nodebrew を使って Mac に Node.js をインストールする方法と nodebrew の基本的な使い方、Node.js のごく基本的な使い方(REPL、-e オプション、ファイルの実行方法など)についての覚書です。

作成日:2020年5月11日

概要

nodebrewNode.js のバージョン管理ツールです。nodebrew を使うと複数のバージョンの Node.js を切り替えて利用することができます。

nodebrew 以外にも nodenvnvm などの Node.js のバージョン管理ツールがあります。nodenv はディレクトリごとに利用するバージョンを切り替えることができるので、そのような環境が必要な場合は nodenv などの使用を検討した方が良いかも知れません。

もしすでに Node.js がインストールされている場合は削除しておきます。

以下のコマンドで Node.js がインストールされているか確認することができます。

$ node -v  return 
-bash: node: command not found  #インストールされていない

バージョン情報が表示される場合は Node.js がインストールされているので削除します。削除方法はどのようにインストールしたかにより異なります(省略)。

以下が nodebrew を使った Node.js のインストールの大まかな流れです。

  1. Homebrew をインストール
  2. nodebrew をインストール
  3. Node.js をインストール

以下はすでに Homebrew がインストールされていることを前提にしています。

Homebrew のインストール方法と基本的な使い方は「ターミナル/Homebrew」を御覧ください。

nodebrew のインストール

nodebrew を Homebrew を使ってインストールします。以下が流れです。

  1. Homebrew を使ってインストール
  2. nodebrew をセットアップ
  3. ~/.bash_profile にパスの設定(環境変数を追加)
  4. source コマンドでシェルの設定(変更)を反映

Homebrew を使ってインストール

ターミナルで brew install nodebrew を実行してインストールします。

$ brew install nodebrew  return 
Updating Homebrew...
・・・中略・・・
==> Downloading https://github.com/hokaccha/nodebrew/archive/v1.0.1.tar.gz
==> Downloading from https://codeload.github.com/hokaccha/nodebrew/tar.gz/v1.0.1
######################################################################## 100.0%
==> Caveats(警告や注意事項という意味)
You need to manually run setup_dirs to create directories required by nodebrew:
  /usr/local/opt/nodebrew/bin/nodebrew setup_dirs(この後 nodebrew をセットアップ)

Add path:(後でパスを追加)
  export PATH=$HOME/.nodebrew/current/bin:$PATH

To use Homebrew directories rather than ~/.nodebrew add to your profile:
  export NODEBREW_ROOT=/usr/local/var/nodebrew

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/nodebrew/1.0.1: 8 files, 38.6KB, built in 4 seconds

nodebrew をセットアップ

nodebrew setup を実行して nodebrew をセットアップします。

$ nodebrew setup  return 
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:(以下を .bash_profile に追加します)

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

パスを追加

~/.bash_profile に環境変数 PATH にパスを追加します。

以下はリダイレクト(>>)を使って .bash_profile に上記(8行目)のパスを追加しています。

vi などで直接 .bash_profile を開いて追加することもできます。

$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile   return 

シェルの設定を反映

source コマンドで .bash_profile を更新して設定を反映させます。

$ source ~/.bash_profile  return 

動作確認

nodebrew -help を実行して以下のようにバージョンとヘルプが表示されればインストール完了です。

$ nodebrew -help  return
        
nodebrew 1.0.1
Usage:
  nodebrew help  Show this message
  ・・・以下省略・・・

nodebrew のアンインストール

何らかの理由で nodebrew を削除する場合は brew uninstall コマンドを使います。

$ brew uninstall nodebrew  return #nodebrew を削除

そして vi などで ~/.bash_profile に追加で記述したパスを削除します。

$ cat ~/.bash_profile 
・・・中略・・・
export PATH=$HOME/.nodebrew/current/bin:$PATH #追記した nodebrew のパスを削除

nodebrew で Node.js をインストール

以下が nodebrew を使って Node.js をインストールして使用できるようにする流れです。

  • インストール可能なバージョンを確認(省略可能)
  • Node.js をインストール
  • インストールした Node.js を有効化

バージョンを確認

ls-remote コマンドでインストール可能な Node.js のバージョンを確認することができます。

$ nodebrew ls-remote  return 
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6  

・・・中略・・・ 

v13.0.0   v13.0.1   v13.1.0   v13.2.0   v13.3.0   v13.4.0   v13.5.0   v13.6.0
v13.7.0   v13.8.0   v13.9.0   v13.10.0  v13.10.1  v13.11.0  v13.12.0  v13.13.0
v13.14.0  

v14.0.0   v14.1.0   v14.2.0   

・・・中略・・・ 

io@v3.0.0 io@v3.1.0 io@v3.2.0 io@v3.3.0 io@v3.3.1 

nodebrew には以下のような一覧表示(リスト)コマンドがあります。

リストコマンド
コマンド 意味
nodebrew ls または nodebrew list インストール済みのバージョンを全て表示(current: に使用中のバージョンが表示されます)
nodebrew ls-remote リモートの(インストール可能な)バージョンを表示
nodebrew ls-all インストール済みとリモートのバージョンを全て表示(Local: にインストール済みのバージョン、current: に使用中のバージョンが表示されます)

Node.js のインストール

Node.js をインストールするには install コマンドにバージョンを指定して実行します。

nodebrew install バージョン

latest や stable というキーワードを使って最新版や安定版をインストールすることもできます

install コマンドのバージョンの指定例
コマンド 意味
nodebrew install v12.16.2 v12.16.2 をインストール
nodebrew install latest 最新版をインストール
nodebrew install stable 安定版をインストール
nodebrew install v12.16 v12.16 の最新版をインストール
nodebrew install 12.16.2 v は省略可能

以下は Node.js の現在の安定版をインストールする例です。

この時点の最新の安定版(以下の場合は v14.2.0)がインストールされます。

$ nodebrew install stable  return 
Fetching: https://nodejs.org/dist/v14.2.0/node-v14.2.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

ls(または list)コマンドでインストールされているバージョンを確認することができます。

$ nodebrew ls  return 
v14.2.0  # 14.2.0 がインストールされている

current: none  #現在使用中のバージョン(まだ有効化していないので none)

Node.js の有効化

use コマンドでバージョンを指定して使用する Node.js を有効化します。

1つのバージョンしかインストールしていない場合でもバージョンを指定する必要があります(必須)。

nodebrew use バージョン

以下は v14.2.0 を有効化する例です。

$ nodebrew use v14.2.0  return 
use v14.2.0

install コマンド同様、latest や stable を指定することもできます。

use コマンドのバージョンの指定例
コマンド 意味
nodebrew use v12.16.2 v12.16.2 を使用(有効化)
nodebrew use latest 最新版を使用
nodebrew use stable 安定版を使用
nodebrew use v12.16 v12.16 の最新版を使用
nodebrew use 12.16.2 v は省略可能

node -v コマンドで有効化したバージョンの Node.js が確認できればOKです。

$ node -v  return 
v14.2.0

ls コマンドで現在インストールされている Node.js をリスト表示すると current に有効化したバージョンが表示されます。

nodebrew ls  return 
v14.2.0  #インストールされているバージョン(この例では1つだけ)

current: v14.2.0  #現在使用中のバージョン

Node.js をインストールするとパッケージ管理ツールの npm(Node Package Manager)も一緒にインストールされます。

以下は npm のバージョンを確認する例です。

$ npm -v  return 
6.14.4

バージョンの切り替え

nodebrew は複数の Node.js をインストールして切り替えて使用することができます。

以下はバージョン 13.14.0 を追加インストールして use コマンドを使って切り替える例です。

$ nodebrew install v13.14.0  return  #13.14.0 をインストール
Fetching: https://nodejs.org/dist/v13.14.0/node-v13.14.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

$ nodebrew ls  return #インストール及び使用されているバージョンの確認
v13.14.0
v14.2.0

current: v14.2.0  #v14.2.0 が使用中

$ nodebrew use 13.14  return  #v13.14.0 を有効化(切り替え)
use v13.14.0

$ nodebrew ls  return  #使用されているバージョンの確認
v13.14.0
v14.2.0

current: v13.14.0  #13.14.0 が使用中に変わる

$ nodebrew use latest  return  #最新版に切り替え(戻す)
use v14.2.0

$ nodebrew ls  return  
v13.14.0
v14.2.0

current: v14.2.0  #14.2.0 が使用中に変わる

不要なバージョンの削除

Node.js の不要なバージョンは uninstall コマンドで削除することができます。

アンインストールするバージョンを指定します。

nodebrew uninstall バージョン

以下は v13.14.0 の Node.js を削除する例です。

$ nodebrew uninstall 13.14.0  return  #v13.14.0 を削除
v13.14.0 uninstalled

$ nodebrew ls  return #インストール及び使用されているバージョンの確認
v14.2.0

current: v14.2.0

nodebrew のその他のコマンド

nodebrew のその他のコマンドは help コマンドで表示することができます。

または nodebrew のサイト https://github.com/hokaccha/nodebrew で確認できます。

$ nodebrew help return
nodebrew 1.0.1

Usage:
  nodebrew help                         Show this message
  nodebrew install <version>            Download and install <version>
  nodebrew compile <version>            Download and install <version>
  nodebrew install-binary <version>     Alias of `install` 
  nodebrew uninstall <version>          Uninstall <version>
  nodebrew use <version>                Use <version>
  nodebrew list                         List installed versions
  nodebrew ls                           Alias for `list`
  nodebrew ls-remote                    List remote versions
  nodebrew ls-all                       List remote and installed versions
  nodebrew alias <key> <value>          Set alias
  nodebrew unalias <key>                Remove alias
  nodebrew clean <version> | all        Remove source file
  nodebrew selfupdate                   Update nodebrew
  nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
  nodebrew exec <version> -- <command>  Execute <command> using specified <version>

Example:
  # install
  nodebrew install v8.9.4

  # use a specific version number
  nodebrew use v8.9.4

以下は nodebrew 自身をアップデートする例です。

$ nodebrew selfupdate return
Fetching nodebrew...
Updated successfully

Node.js を使ってみる

Node.js をインストールすると、node コマンドが使えます。 REPL を使った対話的なコードのテストや、コマンドライン引数の「-e」オプションでスクリプトを実行したり、ファイルを指定してファイルに記述したプログラムを実行することができます。

REPL

コンソールに node とだけ入力して return を押すと REPL が起動して以下のようにコンソールが入力を待ち受けしている状態になります。

$ node   return
Welcome to Node.js v14.2.0.
Type ".help" for more information.
>     //プロンプト > が表示され入力を待ち受けしている

REPL とは、Read-Eval-Print-Loop の略で、Node.js の対話的実行環境(対話型シェル)です。

REPL はユーザーの入力を読み取り(Read)、入力されたコードを評価し(Eval)、結果を出力し(Print)、ユーザーが終了するまでループ(Loop)します。

REPL を使うと、ファイルを作成せずに JavaScript コードをテストすることができます。

3*5 と入力すると、3x5 が計算されてその下に結果(15)が表示されます。続けて /6 と入力すると 3x5÷6 が計算されてその下に結果(2.5)が表示されます。

return を押すと REPL は式を評価して返します。

> 3*5/6   return
2.5

REPLを終了するには、.exit と入力して return を押すか、control + d を1回押すか、control + c を2回押すとシェルプロンプトに戻ります。

> 3*5/6   return
2.5
> .exit   return  //終了
$ 

REPL は文字列に対する操作も処理できます。

> "Hello" + " World"   return
'Hello World'  //文字列が連結された

以下は console.log コマンドの実行例です。Node.js の console.log メソッドの出力先は標準出力になります。console.log は文字列を出力するためメッセージは引用符なしで表示されます。

> console.log("hello")   return
hello  //console.log からの出力
undefined  //関数の戻り値(console.log は何も返さないので、評価結果は undefined)

変数

変数を設定して使用することもできます。

定義した変数はセッションを終了するまで利用可能です。

> let foo = 7   return  //変数 foo を定義
undefined  //上記の実行の戻り値が undefined (変数は定義されている)
> foo *3   return  //変数 foo を使って計算
21
> let bar = 5;  bar * 5  return  //変数の定義と計算を同じ行で入力
25

補完機能

REPL には、関数や変数、キーワードの自動補完機能(オートコンプリート)もあります。

関数などを入力していると、候補が表示されるので tab を押すと確定することができます。

また、例えば以下のように途中で tab を2回押すと候補を表示することができます。

> Math.s  //tab を2回押す
Math.sign  Math.sin   Math.sinh  Math.sqrt  //候補が表示される
> Math.sqrt(5)  return  //引数を指定して実行
2.23606797749979

複数行の入力

複数行のコードブロックの入力もサポートされています。例えば、以下のように関数を定義する際に開いた中括弧で return を押すと REPL は複数行のコードを記述していると想定して3つのドットを表示します。

> const addSeven = (num) => {  return  //改行
... return num + 7;  return  //改行
... }  return 
undefined
> addSeven(3)  return  //定義した関数を実行
10

.editor(編集モード)

.editor と入力して return を押すと編集モードになります。終了するには control + d を、キャンセルするには control + c を押します。

> .editor  return  //編集モード
// Entering editor mode (^D to finish, ^C to cancel)
function hello(name) {
  return `Hello ${name}!`;
}
control + d  
undefined
> hello('foo')  return  //定義した関数を実行
'Hello foo!'
> _  return  //アンダーバーで最後に評価した値を取得
'Hello foo!'

その他、最後に評価した値を取得するには _(アンダーバー) が使える等、REPL のドキュメントで確認することができます。

.help(ヘルプの表示)

.help と入力して return を押すと REPL で使用できるコマンドのリストが表示されます。

> .help    return 
.break    Sometimes you get stuck, this gets you out
.clear    Alias for .break
.editor   Enter editor mode
.exit     Exit the repl
.help     Print this help message
.load     Load JS from a file into the REPL session
.save     Save all evaluated commands in this REPL session to a file

Press ^C to abort current expression, ^D to exit the repl

-e(--eval)

コマンドラインで -e(または --eval)オプションを付けて実行すると、引数を JavaScript として評価することができます。

Command Line Options:-e, --eval "script"

以下は Node.js の環境変数(process.env)を表示する例です。コンソール(ターミナル)に結果を表示するには console.log を使用します。

$ node -e "console.log(process.env)"    return 
{
  TERM_PROGRAM: 'Apple_Terminal',
  SHELL: '/bin/bash',
  TERM: 'xterm-256color',
  TMPDIR: '/var/folders/c2/kytqb8ls7p941834kqccm05h0000gn/T/',
  Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.wmtH7tp5PO/Render',
  TERM_PROGRAM_VERSION: '421.2',
  ・・・以下省略・・・
}

以下は変数を定義して、その値を使った計算結果を表示する例です。

$ node -e "let foo=3, bar=5; console.log( Math.sqrt(foo)*bar)" return 
8.660254037844386

以下は Node.js のビルトインモジュール path のメソッド path.resolve と Node.js で予め用意されている変数 __dirname を使って現在のパスを表示する例です。

$ node -e "console.log(path.resolve(__dirname))"
/Users/foo

以下は Node.js のビルトインモジュールを表示する例です。

$ node -e "console.log(require('module').builtinModules);"    return 
[
  '_http_agent',       '_http_client',        '_http_common',
  '_http_incoming',    '_http_outgoing',      '_http_server',
  '_stream_duplex',    '_stream_passthrough', '_stream_readable',
  '_stream_transform', '_stream_wrap',        '_stream_writable',
  '_tls_common',       '_tls_wrap',           'assert',
  'async_hooks',       'buffer',              'child_process',
  'cluster',           'console',             'constants',
  'crypto',            'dgram',               'dns',
  'domain',            'events',              'fs',
  'fs/promises',       'http',                'http2',
  'https',             'inspector',           'module',
  'net',               'os',                  'path',
  'perf_hooks',        'process',             'punycode',
  'querystring',       'readline',            'repl',
  'stream',            'string_decoder',      'sys',
  'timers',            'tls',                 'trace_events',
  'tty',               'url',                 'util',
  'v8',                'vm',                  'worker_threads',
  'zlib'
]

ファイルの実行

node コマンドにファイル名(パス)を指定すると、そのファイルに記述された JavaScript(※)プログラムを実行することができます。

※ Node.js はブラウザ Google Chrome 用に開発された V8 という JavaScript エンジン(サーバ上でプログラムを実行できるように機能を追加したもの)を利用しています。ブラウザ環境で使う JavaScript と基本的な構文は同じように使えますが、ブラウザ環境と Node.js 環境では利用できるグローバルオブジェクトが異なったり、同名のプロパティや関数があったりと異なる部分があります。

例えば、カレントディレクトリに nodex というディレクトリを作成し、その中に以下のような hello.js というファイルを作成します(Node.js の console.log メソッドの出力先は標準出力になります)。

nodex/hello.js
console.log("Hello Node!");

以下のように node コマンドにファイルを指定して実行すると、そのファイルに記述されているプログラムが実行されます。

$ node ./nodex/hello.js    return
Hello Node! 
コマンドライン引数

node コマンドでは実行するファイル名の他に引数(arguments)を受け取ることができます。

Command Line Options

node [script.js] [arguments]

コマンドライン引数は process オブジェクトの argv プロパティ(process.argv)に文字列の配列として格納されています。

前述の hello.js を以下のように process.argv の内容を出力するように変更します。

nodex/hello.js
console.log(process.argv);

node コマンドでファイル名の他に引数 myArg1 と myArg2 を指定して実行し、process.argv の内容を確認します。

$ node ./nodex/hello.js myArg1 myArg2    return
[
  '/Users/user/.nodebrew/node/v14.2.0/bin/node',   //process.argv[0]
  '/Users/user/nodex/hello.js',   //process.argv[1]
  'myArg1',   //process.argv[2]
  'myArg2'   //process.argv[3]
]

3番目(process.argv[2])以降の要素が、コマンドライン引数に指定したものであることがわかります。

1番目と2番めは常に以下のようなパスが入っています。

  • 1番目(process.argv[0]):実行している Node.js のパス
  • 2番目(process.argv[1]):実行しているプログラムのファイルのパス

以下は を変更して引数に指定した文字列を出力するようにした例です。引数に何も指定されていない場合は Hello World! と出力されます。

nodex/hello.js
//process.argv[2]が指定されていればその値を name に、そうでなければ World を設定
const name = process.argv[2] || 'World';
console.log(`Hello ${name}!`);
$ node ./nodex/hello.js 'Universe'   return
Hello Universe!

$ node ./nodex/hello.js    return  //引数なしで実行
Hello World!
モジュールを使う

Node.js にはモジュールという単位でプログラムの各機能を分割することができる仕組みがあり、Node.js ではモジュール化の仕組みに CommonJS Moduleを使用しています。

ブラウザ環境の JavaScript では ES6/ECMAScript 2015 でプログラムをモジュールに分割して管理する仕組みが導入されていて、その仕組を ES Modules と呼びます。

1つの JavaScript ファイルが1つのモジュールになります。それぞれのグローバルスコープはそれぞれの JavaScript ファイル内で閉じていて、Node.js(CommonJS Module)では exports や module.exports を使って他のファイルに渡すことができます。モジュールの読み込みは require() を使います。

以下のような module.js という名前のファイル(モジュール)を作成し、Node.js の exports を使って hello という関数を他のファイルで使用できるようにエクスポートします。

module.js
exports.hello = function() {
  return 'Hello World!';
}

//アロー関数を使って以下のように記述しても同じ
//exports.hello = () => 'Hello World!';

exports の代わりに module.exports を使って以下のように記述することもできます。

module.js
//module.exports を使ってオブジェクトをエクスポート
module.exports = {
    hello: () => 'Hello World!'
};

モジュールをインポートするには、Node.js の require() を使います。

以下のような main.js という名前のファイル(エントリポイント)を作成し、require() を使ってモジュール module.js の関数を読み込みます。require() では読み込むファイルの拡張子を省略することができます。

main.js
//module.js を読み込む(インポート)
var my_module = require('./module');
//module.js の hello 実行結果を出力
console.log(my_module.hello());

nodex  //作業ディレクトリ
├── main.js
└── module.js

ファイルのあるディレクトリに移動してファイル main.js を指定して node コマンドを実行すると main.js に記述してある内容が実行されます。

//ファイルのあるディレクトリに移動
$ cd nodex   return

//node コマンドを実行
$ node main.js   return
Hello World!

ES6 の export や import を使う

Node.js では JavaScript のモジュール化の仕組みに CommonJS モジュールを使用しています。

そのため ES6(ECMAScript 2015)のモジュール方式(ES Modules)の export や import を使う場合は、ファイルの拡張子を .mjs にする必要がありまあす(または package.json を使用して "type": "module" を設定します)。

例えば前述の module.js と main.js を ES6 の export や import で書き換えると以下のようになります。

module.js
//ES6 モジュールの export 
export default function() {
  return 'Hello World!';
}
main.js
//ES6 モジュールの import
import hello from './module.mjs';
console.log(hello());

この状態で node コマンドを実行すると「ES モジュールをロードするには、package.json で "type": "module" を設定するか、.mjs 拡張子を使用します」と警告が表示されエラーになります。

$ node main.js   return
(node:42835) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/user/nodex/main.js:2
import hello from './module.js';
^^^^^^
SyntaxError: Cannot use import statement outside a module

拡張子を .mjs に変更します。

module.mjs(拡張子を変更しただけ)
export default function() {
  return 'Hello World!';
}

//アロー関数を使って以下のように記述しても同じ
//export default () => 'Hello World!';
main.mjs(拡張子を変更しただけ)
import hello from './module.mjs';
console.log(hello());

上記のように拡張子を .mjs に変更して node コマンドに main.mjs を指定して実行すると問題なく実行することができます。

 $ node main.mjs   return
Hello World!

または、package.json を使用して "type": "module" を設定すれば、拡張子を .js のまま変更せずに ES Modules を使えます。

但し、"type": "module" を設定した package.json のディレクトリ及びその配下にこの設定は影響します(Node.js の CommonJS モジュールが使えなくなります)。

webpack などを利用すると、ES6 モジュールの export や import を使う場合でも 拡張子が .js で動作させることができるようになります。

HTTPサーバ

以下は Node.js の公式サイトの Getting Started Guide に掲載されているシンプルな HTTPサーバ(Web サーバ)の例です。

app.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

上記をコピーして app.js という名前で保存してターミナルで以下を実行すると Web サーバが起動します。

ブラウザで http://localhost:3000 にアクセスすると Hello World と表示されています。

終了するには control + c を押します。

$ node app.js   return
Server running at http://127.0.0.1:3000/

ファイルの冒頭で Node.js のビルトインモジュールの http モジュールを require() で読み込み、変数 http に http オブジェクト(HTTP の各種機能を持つオブジェクト)を代入しています。

また、サーバーのホスト名やポート番号に使用するための変数を定義しています。

app.js
const http = require('http');  //http モジュールをロード(読み込み)

const hostname = '127.0.0.1';  //変数 hostname にループバックアドレスを設定
const port = 3000;  //変数 port に 3000(ポート番号) を設定
・・・

続いて、http モジュールの createServer メソッドを使って http.Server オブジェクト(Node.js のサーバ)を生成して変数 server に代入しています。

http.createServer メソッドには、サーバーで受け取る HTTP リクエストを処理してレスポンスを返す処理を定義する関数(requestListener)を記述します。

この例の場合、レスポンスヘッダのステータスコード(response.statusCode) に OK を表す 200 を設定し、response.setHeader() で Content-Type に text/plain を返すように設定し、response.end() でレスポンスボディとして Hello World を設定しています。

app.js
・・・
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});
・・・

最後に http.Server オブジェクトが代入されている変数 server の listen メソッドを使ってサーバを開始して待ち受け状態にします。

server.listen() には第1引数にポート番号、第2引数にホスト名を指定し、第3引数にコールバック関数を指定して「Server running at ...」というメッセージを表示しています。

app.js
・・・
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});