Node.jsでプロジェクト内の共通モジュールの依存関係どうするかハマったのでメモ

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してあげればシンボリックリンクが作成されます。

Node.jsでプロジェクト内の共通モジュールの依存関係どうするかハマったのでメモ

これで共通モジュールを使用する側の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

コメント

タイトルとURLをコピーしました