2つの質問を総合したような感じで
まだNode.js流儀の開発の流れが身についてないのだと思います。
そこで、勉強が捗るように初手で何をやるべきか、その意味は?
これに集中して解説していきます。
この回答をとっかかりにしながら進めてください。
requireの歴史
JavaScriptはブラウザ上でDOMツリーを書き換えるために作られた言語です。
そのため、外部ライブラリは「別のスクリプトタグでグローバル変数に定義すればええやん」という
他のプログラミング言語、汎用スクリプト言語ではありえない実装になっています。
GoogleMap等が台頭してきて一気に大ブレイクし、
パソコン上で汎用スクリプト言語で動かしたい欲求が生まれてきました。
その結果作られたのがNode.jsです。
Node.jsはJSにはない外部ファイルを読み込む仕組みを作る必要がありました。
そこでCommonJSに目をつけ、これをベースに実装を行いました。
CommonJSは大雑把に説明すると
「JSの外部ライブラリ不便だよね、要望として提出するために仕様だけでも詰めておこうか」
という形で存在している仕様で、メジャーな実装はNode.jsが台頭してくるまでありませんでした。
requireの使い方
Node.jsではrequire
関数を使うことで
外部のJSファイルを呼び出して実行したり、
結果を取り出す事ができます。
require(['sample'],function(num){
require
が要求する引数は文字列です。
const moduleName = require('module-name');
こういう使い方にしてください。
引数の文字列が下記の条件で探しに行く箇所が変わります。
- 先頭文字が
./
で始まる: JSファイルの存在しているディレクトリからJSファイルを探す
- 先頭文字が
../
で始まる: JSファイルからみて親ディレクトリからJSファイルを探す
- それ以外:
node_modules
ディレクトリ内から該当モジュールを検索する
この辺はUnix、Linuxのパスあるあるですね。
自分が同じディレクトリに複数JSファイルを作成して参照したい場合は
const hoge = require('./hoge.js');
みたいにしないとnode_modules
を探しに行って「モジュールが無い!?」とエラーになるので注意してください。
node_modulesとは?
Node.jsは専用パッケージ管理ツールのnpmと密接に関係しています。
npm install [module-name]
上記のように入力することでnpmサイトからモジュールをDLしてきて、
node_modules
ディレクトリを作成してその中で管理します。
しかし、複数開発者がJoinしてきた時にどのモジュールを使っているか確認したいですよね?
なので、package.json
というファイルを生成して管理するのが基本です。
package.jsonはプロジェクトルートにただ一つ存在します。
npmは基本的にこのpackage.json
ファイルを常に確認しながら、
package.json
が存在するディレクトリにnode_modules
ディレクトリを作成し、
DLしたモジュールを賢く管理しています。
package.jsonを作ってみよう
npm init
コマンドを使います。
すると対話シェルが立ち上がり、プロジェクトの概要説明等を入力させた後、
コマンドを入力したディレクトリにpackage.json
ファイルを設置してくれます。
対話シェルが煩わしいなら--yes
オプションをつけると、適当に空欄にしながらpackage.json
ファイルを作ってくれます。
後でエディタで開いて空欄の項目を適宜埋めれば良いでしょう。
Node.jsのプロジェクトを作る時は
必ずこのnpm init
が起点となります。
ここからnode_modules
ディレクトリを作ってプロジェクトを管理していくわけですね。
bash
1$ npm init --yes
2
3$ ls
4package.json
5
6$ npm install [module_name]
7
8$ ls
9package.json node_modules/
requireされる側のJSファイルの書き方
requireされる側のJSの書き方もまだのようなので回答します。
Node.jsではJavaScriptと違い、
外部モジュールを扱うためにrequire
という関数が勝手にグローバル変数に追加されています。
それと同じように、
require
された時に値をrequire
元へ返す為の変数も定義されています。
module.exports
という値です。
これに代入演算子で代入することでrequire
元で使えるようになります。
js
1// 値を加算するadd関数のJSファイル
2// add.js
3module.exports = function (a, b) {
4 return a + b;
5}
6
7// それを利用する
8// index.js
9const add = require('./add.js');
10console.log(add(3, 5));
このように動作するか試してみてください。