私の質問は、NPMモジュールとして公開したい既存のライブラリに関するものです。ライブラリは既に使用されており、現在ローカルファイルシステム経由でrequire
dです。
モジュールのファイルのルートディレクトリを指定するにはどうすればよいですか?
次のような構造がある場合:
.
├── package.json
├── src
| ├── js
| └────── lib
| └───────── my
| └───────────── thing.js
| └───────────── that.js
モジュールとアクセス可能なファイルのルートがsrc/js/lib/my/
?
外部プロジェクトから次のように使用したいと思います:
var thing = require('my/thing'),
that = require('my/that');
私が見ました "files"
プロパティpackage.json、これは正しい方法ですか?
ネイティブソリューションについては、このノードの問題を参照してください https://github.com/nodejs/node/issues/1497
機能リクエストは、mainの横にあるpackage.jsonのmainDir
フィールドを提案します。
投票する人が多いほど、より速く/より多く実装される
doc のように:
メインフィールドは、プログラムへの主要なエントリポイントであるモジュールIDです。
したがって、package.jsonファイルには"main": "src/js/lib/my/app.js"
のようなものが含まれます。
app.js
ファイルとmodule.exports
別の子を作成することをお勧めします。例えば:
module.exports.thing = require('./thing');
module.exports.that = require('./that');
そして、これらを次のように使用します。
var mylib = require('mylib')
, thing = mylib.thing
, that = mylib.that;
package.json
は主に、npm
が依存関係をインストールおよび管理するために使用するファイルです。
require
コンストラクトはpackage.json
をあまり気にしないので、require
が機能する方法を覆すためにそれを使用することはできず、パッケージがrequire
読み込みスキームはそれらを期待しています。
https://nodejs.org/api/modules.html のドキュメントと読み込みスキームを参照してください: https://nodejs.org/api/modules.html#modules_all_together
ドキュメントが「グローバルフォルダーからの読み込み」を呼び出す手法を使用して、NODE_PATH
環境変数を定義することもできます。
しかし、より標準的な方法に固執することをお勧めします。-モジュールをnode_modulesディレクトリに配置するか、app.jsまたはindex.jsがある同じディレクトリでモジュール階層を開始します
これはthisい回避策であり、パッケージのルートを汚染します。しかし Jordanの答え が機能するまで、これはあなたが求めていることを達成する方法のように感じます。
require with slash表記を使用して、エクスポートする各モジュールのパッケージのルートにファイルを追加するだけです。そのようなファイルには、エクスポートされるモジュールと同じ名前が付けられ、単純に再エクスポートされます。
.
├── package.json
├── thing.js <--
├── that.js <--
├── src
| ├── js
| └────── lib
| └───────── my
| └───────────── thing.js
| └───────────── that.js
たとえば、ファイル./thing.js
には以下が含まれます。
module.exports = require('./src/js/lib/my/thing');
したがって、次のように要求できます。
const thing = require('mypackage/thing');
mainDir
プロパティをpackage.json
に追加することに関するバグ で述べたように、ソースとpackage.jsonファイルを1つのディレクトリに一時的にコピーしてそこから公開することもできます。
もう1つの可能性は、ECMAScriptモジュール(ESモジュール)、特にpackage.jsonファイルの package exports フィールドを使用することです。
この構成のpackage.jsonファイルを指定すると:
{
"name": "my",
"exports": {
"./": "./src/js/lib/my/"
}
}
次のようなモジュールをライブラリからインポートできるはずです。
import thing from 'my/thing'
import that from 'my/that'
ESモジュールの仕様は 安定性:1-実験的 段階であり、変更される可能性があることに注意してください。このソリューションは、ESモジュールをサポートするブラウザーとnode.jsの最新バージョン用であり、CommonJSモジュールと互換性があるかどうかはわかりません。
Webpackでは、次のようにresolve.alias
を指定できます。
{
resolve: {
alias: {
'my': 'my/src'
}
}
}
または、package.jsonでdirections
オプションを指定できます
{
directions: {
'lib': 'src/lib'
}
}