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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント