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コマンドを実行します。
npm install src\common
これでプロジェクトルートの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/にコピーしている例です。
const gulp = require('gulp')
//...
function copyCommon() {
return gulp
.src('./src/common/**')
.pipe(gulp.dest('./modules/node_modules/common/'))
}
exports.copyCommon = copyCommon
CodeArtifact
AWS CodeArtifactでリポジトリにpublishすることができるので、共通ライブラリはCodeArtifactを使ってnpm iするのが一般的です。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^



コメント