web-dev-qa-db-ja.com

npmpackage.jsonのメインとプロジェクトの構造

Npmとメインフィールドに問題があります。ドキュメントを見て、私の理解では、mainは./index.jsとは異なるエントリポイントであると指摘しています。すべてのdistファイルがルートフォルダー内にあるパッケージをすでにテストしました。 srcを無視し、.npmignoreを使用してパックフェーズでテストしますが、プロジェクトをビルドしてパックし、構造を検証してすべてのファイルをパッケージルートフォルダーにプルするという点が気に入らなかった。そこで、代わりに出力をdistに変更しました。

Npm packを使用してファイルを抽出すると、次の構造になります。

/
dist
  -- index.js
  -- moduleA
    -- index.js
package.json
README.md

だからとても良い。しかし今、私はそれを次のようにインポートすることを余儀なくされています:

import {moduleA} from "myNpmModule/dist/moduleA";

しかし、インポートにdistフォルダーを含めたくありません。だから私はpackage.jsonでmainを設定しました

"main": "dist/index.js"

しかし、それでも機能せず、distでインポートした場合にのみ機能します。 npm3.10.7とノード6.7.0を使用しています。

誰か助けてもらえますか?

よろしく

12
jonas.hartwig

メインのindex.jsmoduleAの内容がわからないことを確認するのは難しいですが、通常は特定のファイルをインポートせず、package.jsonを含むディレクトリをインポートする方法で行われます。

import {moduleA} from "myNpmModule";

これで、index.jsで「main」として参照されるpackage.jsonは、残りのモジュールをインポートし、それらを独自のmodule.exportsプロパティとしてエクスポートする必要があります。

たとえば、dist/index.jsでは:

import {moduleA} from "./moduleA";
module.exports.moduleA = moduleA;

そしてあなたのメインコードで:

import {moduleA} from "myNpmModule";

そのようなもの-あなた自身のモジュールの構造に合うように可能な違いがあります。

実際、私はそのようなことを自動的に行うモジュールを作成し、サブディレクトリにモジュールをインポートして、それらをプロパティとしてエクスポートしました。 npmに公開するときに、私自身が使用するためにnpmに配置していません。この回答を更新します。

更新

これは私が上で説明したことの実際の例です-変換ステップの必要性を避けるためにimportrequire()に変更しました。

モジュール

この回答からの私のアドバイスに従ったモジュール:

プロジェクト構造:

dist
  -- index.js
  -- moduleA
    -- index.js
package.json
moduleA.js

dist/index.jsの内容:

var {moduleA} = require('./moduleA');
module.exports.moduleA = moduleA;

dist/moduleA/index.jsの内容:

module.exports.moduleA = {
  info: 'This is what dist/moduleA/index.js exports as moduleA'
};

package.jsonの内容:

{
  "name": "nested-project-structure-example",
  "version": "0.0.1",
  "description": "An example for a Stack Overflow answer",
  "main": "dist/index.js",
  "scripts": {
    "test": "node test.js"
  },
  // ...
}

moduleA.jsの内容:

module.exports = require('./dist/moduleA');

使用法

このモジュールを使用するプロジェクト:

次のようにインポートできます。

var {moduleA} = require('nested-project-structure-example');
console.error(moduleA.info);

これにより、dist/ModuleA/index.jsで参照されるdist/index.jsファイルを介してpackage.jsonがインポートされます。実用的な例については、 test1.js を参照してください。

var {moduleA} = require('nested-project-structure-example/dist/moduleA');
console.error(moduleA.info);

これにより、distを含む内部パスを直接認識しているdist/ModuleA/index.jsがインポートされます。実用的な例については、 test2.js を参照してください。

var {moduleA} = require('nested-project-structure-example/moduleA');
console.error(moduleA.info);

これにより、メインプロジェクトディレクトリのdist/ModuleA/index.jsファイルを介してmoduleA.jsがインポートされます。そうすれば、内部のプロジェクト組織を知る必要はありません-distパスは必要ありません。実用的な例については、 test3.js を参照してください。

プロジェクトのmoduleA.jsの内容全体は次のとおりです。

module.exports = require('./dist/moduleA');

プロジェクトのルートディレクトリにそのようなファイルがないと、パスにmoduleAを含めるか、メインのdistを介して直接インポートしないと、jsをインポートできません。 package.json(この場合はdist/index.js)に含まれるプロジェクトのファイル。

これらはあなたの質問の目標を達成するための3つの方法であり、そのうちの2つはモジュールをインポートするコードにdistを含みません。それがあなたの質問に答えることを願っています。

これらは、モジュールを完全に個別のモジュールのセットに分割せずに使用できる唯一のオプションであり、それぞれが個別に配布されます。

11
rsp

これが、これがどのように機能するかについて私が理解していることです。それが本当かどうかは100%確信していません。私は、これを実際にドキュメントで見ることからではなく、単純な観察と推論からこの洞察を得ました。仮定1(package.json):

{... "name": "my-package", "main": "dist/index.js", "scripts": { "build": "babel src --out-dir dist", "prepublish": "npm run build" }... }

仮定2(パッケージ構造):

/
  -- dist
    -- moduleA
      -- index.js
        -- moduleAA
          -- index.js
    -- moduleB
      -- index.js

上記を実行すると、次のようになります。

var myPackage = require("my-package");
var moduleAA = myPackage.moduleA.moduleAA;
// or in short
var moduleAA = require("my-package").moduleA.moduleAA;

ただし、次のようになります。

import moduleA from "my-package/moduleA/moduleAA";

上記のrequireを使用したステートメントと同等ではありません。代わりに何ができるかid:

import { moduleA } from "my-pakage";
const moduleAA = moduleA.moduleAA;

上記のプロジェクト構造でmoduleAAから直接インポートしたい場合は、次のようにする必要があります。

import moduleAA from "my-package/dist/moduleA/moduleAA";

これが私の結論であり、これをどのように理解するかです。

...「my-package/dist/moduleA/moduleAA」から; JS/npmの観点(エクスポートされるもの)からプロジェクト構造を調べるのではなく、from句で/を使用するとすぐに、パッケージのファイル構造を調べます。

つまり、使用する場合

import { moduleA } from "my-pakage";

実際にはdist/index.jsからすべてのエクスポートをインポートしますが、「my-package/moduleA」をインポートすると、パス「/ moduleA」が存在する場合は実際にパッケージ内を検索します。上記の場合、それは真実ではありません。 distフォルダーを省略し、構造体をパッケージルートに移動すると、そのステートメントは実際には期待どおりに機能します。

だから、なぜ私がこのようなものをdistフォルダに入れたいのか誰も尋ねることができませんか? gitでは無視するのは簡単です。ノードを使用するベストプラクティスを理解しているので、「事前公開」ステップを使用して実際にパッケージをビルドします。つまり、コードを新たにチェックアウトして「npm install」を実行すると、設計上「npm run prepublish」が実行され、パッケージ化および変換されたファイルでフォルダー構造がスパムされます。

これで数時間遊んだ後、私はあきらめて、「npminstall」が私のフォルダをスパムする可能性があることを受け入れました。別の方法として、package.jsonでprepublishを定義できず、「npmpublish」の前に「npmrunbuild」を実行するだけでした。 ( "scripts":{"build": "babel src --out-dir。"})

1
jonas.hartwig