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を使用しています。
誰か助けてもらえますか?
よろしく
メインのindex.js
とmoduleA
の内容がわからないことを確認するのは難しいですが、通常は特定のファイルをインポートせず、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
に配置していません。この回答を更新します。
これは私が上で説明したことの実際の例です-変換ステップの必要性を避けるためにimport
をrequire()
に変更しました。
この回答からの私のアドバイスに従ったモジュール:
プロジェクト構造:
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
を含みません。それがあなたの質問に答えることを願っています。
これらは、モジュールを完全に個別のモジュールのセットに分割せずに使用できる唯一のオプションであり、それぞれが個別に配布されます。
これが、これがどのように機能するかについて私が理解していることです。それが本当かどうかは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。"})