Node.js package.jsonのメインパラメータ


147

すでにかなりの検索を行っています。ただし、Node.jsのpackage.jsonの主なパラメーターについてはまだ疑問があります。

  1. このフィールドに入力するとどのように役立ちますか?別の言い方をすると、このフィールドが存在する場合、モジュールを別のスタイルで開始できますか?
  2. メインパラメータに複数のスクリプトを入力できますか?はいの場合、2つのスレッドとして開始されますか?いいえの場合、モジュールで2つのスクリプトを開始し、それらを並行して実行するにはどうすればよいですか?

2つ目の質問はかなり奇妙なことです。これは、OpenShiftでNode.jsアプリケーションをホストしているためですが、アプリケーションは2つの主要コンポーネントで構成されています。1つはREST APIで、も​​う1つは通知配信サービスです。

通知配信プロセスがREST APIをシングルスレッドとして実装した場合、REST APIがブロックされると思います。ただし、同じMongoDBカートリッジに接続する必要があります。さらに、可能であれば、両方のコンポーネントを同じギアで使用できる場合は、1つのギアを節約したいと思います。

どんな提案も大歓迎です。

回答:


149

npmのドキュメントから:

メインフィールドは、プログラムへの主要なエントリポイントであるモジュールIDです。つまり、パッケージの名前がfooで、ユーザーがパッケージをインストールしてからrequire( "foo")を実行すると、メインモジュールのエクスポートオブジェクトが返されます。

これは、パッケージフォルダーのルートに関連するモジュールIDである必要があります。

ほとんどのモジュールでは、メインスクリプトを用意するのが最も理にかなっており、それ以外の場合はそれほど多くありません。

短く言えば:

  1. パッケージへのエントリポイントがルートフォルダと異なる場合にのみ、mainパラメータが必要になります。例えば、人々は多くの場合にエントリポイントを置くか、対応したスクリプトは次のように記述する必要があり、この場合には、の中で。package.jsonindex.jslib/index.jslib/<packagename>.jsmainpackage.json
  2. mainエントリポイントをrequire('yourpackagename')明確に定義する必要があるという理由だけで、2つのスクリプトをとして使用することはできません。

おかげで、コンポーネントを子プロセスとして実装することを検討します。
Gavin

1
サイドノート1はelectron、メインパラメータを尊重します。electron .たとえば、"main": "dist/app/index.js",in がある場合、サブフォルダから正しいことを開始しますpackage.json(他のプラットフォーム/フレームワークについても同様です)。
フランクノッケ2018年

1
副注2:You can't have two scripts as main...–正しい。ただし、パッケージがたとえば複数のCLIコマンドを提供している場合(開発中ににアクセスできる場合./node_modules/.bin/<symlink>、「bin」パラメーターを確認してください
Frank Nocke

私はbuild / index.jsを持っていますが、それをsrc / index.jsに変更すると、何でも実行します。それはまだbuld / indexを指しています。私はnpmリンクを使用しています
Carlos

誰もが使用している.jsここでの拡張機能を、しかし「モジュール識別子」の拡張子を持っていない..私は、我々が使用することになっているかについて曖昧嫌い
ChaseMoskal

47

最初の質問に答えるために、モジュールをロードする方法は、モジュールのエントリポイントとpackage.jsonのメインパラメータによって異なります。

次のファイル構造があるとします。

my-npm-module
|-- lib
|   |-- module.js
|-- package.json

package.jsonにメインパラメータがない場合、モジュールのエントリポイントを指定してモジュールをロードする必要があります:require('my-npm-module/lib/module.js')

あなたが設定した場合package.json次のように主なパラメータは"main": "lib/module.js"、あなたがモジュールをこの方法で読み込むことができるようになります:require('my-npm-module')


20

たとえばpackage.jsonファイルにある場合:

{
"name": "zig-zag",
"main": "lib/entry.js",
...
}

lib/entry.js パッケージへのメインのエントリポイントになります。

電話するとき

require('zig-zag');

ノードでlib/entry.jsは、必要な実際のファイルになります。


1
コードをインポートするつもりがない場合は、「main」パラメーターを省略できますか?
ココドコ2018年

@Kokodokoはい、これがこのケースで提案されていることです
cquezel '11 / 07/19

7

mainキーの重要な機能の1つは、エントリポイントへのパスを提供することです。これは、で作業するときに非常に役立ちますnodemon。あなたがで作業する場合nodemon、あなたが定義しmain、あなたの中の鍵package.jsonとして聞かせて発言権を"main": "./src/server/app.js"、あなたは単に入力してサーバーをクランクアップすることができnodemonpwdのように、rootでCLIに代わりに nodemon ./src/server/app.js


3

私の知る限り、これはnpmのノードパッケージ(ライブラリ)への主要なエントリポイントです。npmプロジェクトが、他の人がnpmを介してインストールできるノードパッケージ(ライブラリ)になる場合にのみ必要です。


build /、dist /、またはlib /フォルダーを持つライブラリーがあるとします。このフォルダーには、ライブラリ用に次のコンパイル済みファイルが含まれています。

-lib/
--bundle.js

次に、package.jsonで、npmにライブラリ(ノードパッケージ)にアクセスする方法を伝えます。

{
  "name": "my-library-name",
  "main": "lib/bundle.js",
  ...
}

npmを含むノードパッケージをJSプロジェクトにインストールした後、バンドルされているbundle.jsファイルから機能をインポートできます。

import { add, subtract } from 'my-library-name';

これは、ライブラリにコード分​​割(Webpackなど)を使用する場合にも当てはまります。たとえば、このwebpack.config.jsは、プロジェクトを1つではなく複数のバンドルに分割するコードを利用します。

module.exports = {
  entry: {
    main: './src/index.js',
    add: './src/add.js',
    subtract: './src/subtract.js',
  },
  output: {
    path: `${__dirname}/lib`,
    filename: '[name].js',
    library: 'my-library-name',
    libraryTarget: 'umd',
  },
  ...
}

それでも、package.jsonでライブラリへのメインエントリポイントを1つ定義します。

{
  "name": "my-library-name",
  "main": "lib/main.js",
  ...
}

その後、ライブラリを使用するときに、メインエントリポイントからファイルをインポートできます。

import { add, subtract } from 'my-library-name';

ただし、package.jsonからのメインエントリポイントをバイパスして、コード分割バンドルをインポートすることもできます。

import add from 'my-library-name/lib/add';
import subtract from 'my-library-name/lib/subtract';

結局のところ、package.jsonの mainプロパティは、ライブラリのメインエントリポイントファイルのみを指します。


0

OpenShiftの場合、(アプリケーションごとに)バインドするPORTとIPのペアを1つだけ取得します。各サービスエンドポイントに内部ルートを追加することで、単一のnodejsインスタンスから両方のサービスを提供できるように思えます。

私はここにあなたのアプリケーションを起動するOpenShiftは、プロジェクトのpackage.jsonを使用する方法についていくつかの情報を持っている:https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-two-simple-steps #package_json


-5

それを「出発点」と考えてください。

オブジェクト指向プログラミングの意味で、たとえばC#は、オブジェクトクラスのinit()またはコンストラクターです。これが「エントリポイント」の意味です。

例えば

public class IamMain  // when export and require this guy
{
    public IamMain()  // this is "main"
    {...}

    ...   // many others such as function, properties, etc.
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.