web-dev-qa-db-ja.com

package.jsonのルートディレクトリ

私の質問は、NPMモジュールとして公開したい既存のライブラリに関するものです。ライブラリは既に使用されており、現在ローカルファイルシステム経由でrequiredです。

モジュールのファイルのルートディレクトリを指定するにはどうすればよいですか?

次のような構造がある場合:

.
├── 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、これは正しい方法ですか?

50
Drahcir

ネイティブソリューションについては、このノードの問題を参照してください https://github.com/nodejs/node/issues/1497

機能リクエストは、mainの横にあるpackage.jsonのmainDirフィールドを提案します。

投票する人が多いほど、より速く/より多く実装される

11

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;
8
Yann Bertrand

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がある同じディレクトリでモジュール階層を開始します

3
Jerome WAGNER

これは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つのディレクトリに一時的にコピーしてそこから公開することもできます。

2
kub1x

もう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モジュールと互換性があるかどうかはわかりません。

0
Morgan

Webpackでは、次のようにresolve.aliasを指定できます。

{
  resolve: {
    alias: {
      'my': 'my/src'
    }
  }
}

または、package.jsonでdirectionsオプションを指定できます

{
  directions: {
    'lib': 'src/lib'
  }
}
0
刘联东