はじめに
あるファイルに定義した関数等を別のファイルで使いたいときにどうするか。
Node.jsでは二つのやり方がある。
- exportsで公開してrequireで読み込む(CommonJS)
- exportで公開してimportで読み込む(ES2015)
常に使えるのは1の方法。Babelを使うなら2の方法でも可能。
どちらを選んでもメリット・デメリットがあるわけではない(と思う)ので、お好きなほうで。
個人的には、常に使える1の方法がいいような気がしている。
使用例
exportsで公開してrequireで読み込む(CommonJS)
一つの関数だけをエクスポート
module.js
// 関数を定義
const f = () => {
console.log('Hello!')
}
// 関数を公開
module.exports = f
client.js
const f = require('./module')
f() // Hello!
エクスポートするのは関数に限らず、文字列や数値でも良い。
複数の関数をエクスポート
module.js
// 関数を定義
const f1 = () => console.log('Hello!')
const f2 = () => console.log('World!')
// 別名をつけて、二つの関数を公開
module.exports = {
sayHello: f1,
sayWorld: f2
}
client.js
const mod = require('./module')
mod.sayHello() // Hello!
mod.sayWorld() // World!
クラスをエクスポート
module.js
// クラスを定義
class Person {
constructor(name) {
this.name = name
}
greet(params) {
console.log(`Hello, ${this.name}!`)
}
}
// 公開
module.exports = Person
client.js
const Person = require('./module')
p = new Person('aki')
p.greet() // Hello, aki!
おまけ:選択してインポート
module.js
const f1 = () => console.log('Hello!')
const f2 = () => console.log('World!')
module.exports = {
sayHello: f1,
sayWorld: f2
}
client.js
// インポートする対象を選択する
const {sayHello} = require('./module')
sayHello() // Hello!
exportで公開してimportで読み込む(ES2015)
下記の参考資料を参照。いつか書く。
参考資料
1. exports - require(CommonJS)
-
Node.js v13.7.0 Documentation
- 説明が難しめ
- 『Node.jsデザインパターン』(オライリー)
- P.25~