Node.jsでプロジェクト内の共通モジュールの依存関係どうするかハマったのでメモ
AWS Lambdaで複数APIを作るプロジェクト内で共通モジュールの依存関係どうやったら良いかで悩んだのでメモです。
共通モジュールはcommonフォルダ配下に配置するとします。
project | |
├─src | |
├─common | |
├─index.js // エントリポイント | |
├─package.json | |
├─dateutil.js // 共通モジュール | |
└─pstringutil.js // 共通モジュール | |
├─main | |
├─xxx.js | |
└─yyy.js | |
├─test | |
├─main | |
├─xxx.test.js | |
└─yyy.test.js | |
各共通モジュールは以下のようなイメージです。class定義してmodule.exportsしています。
// stringutil.js | |
class stringutil() { | |
// 定義 | |
} | |
module.exports = stringutil; |
index.jsで各ファイルをmodule.exportsします。
module.exports = { | |
StringUtil : require('./stringutil'), | |
DateUtil : require('./dateutil') | |
} |
共通モジュールが増えたらindex.jsに記述を追加してあげます。
package.json
commonフォルダ配下にpackage.jsonを用意してあげます。
{ | |
"name": "common", | |
"version": "1.0.0", | |
"description": "", | |
"main": "index.js", | |
"private":true, | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"author": "" | |
} |
index.jsを指定、private:true
としておきます。
プロジェクトのルートでnpmコマンドを実行します。
これでプロジェクトルートのpackage.jsonのdependenciesにcommonが追加されます。
"dependencies": { | |
"common": "file:common" | |
} |
node_modules配下にシンボリックリンクが作成されるのでcommonフォルダ配下を修正すれば即反映されるので便利です。
逆に考えると、プロジェクトルートのpackage.jsonに最初から上記依存関係を記述してあげて、npm i
してあげればシンボリックリンクが作成されます。
これで共通モジュールを使用する側のjsファイルから使用することができます。
以下、使用例です。
const {StringUtil, DateUtil} = require('common') |
gulpでcopy
gulpでデプロイするときにシンボリックリンクはエラーとなります。
その為、src/commonをnode_modules/commonにコピーするタスクを作成しておきます。
modulesフォルダ配下のnode_modules/common/にコピーしている例です。
1 2 3 4 5 6 7 8 9 10 |
const gulp = require('gulp') //... function copyCommon() { return gulp .src('./src/common/**') .pipe(gulp.dest('./modules/node_modules/common/')) } exports.copyCommon = copyCommon |
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^