Node.js package.json 기본 매개 변수


147

나는 이미 꽤 많은 검색을 수행했습니다. 그러나 여전히 Node.js의 package.json에있는 주요 매개 변수에 대해서는 의문이 있습니다.

  1. 이 분야를 채우는 것이 어떻게 도움이됩니까? 다른 방법으로 물어 보면이 필드가 나타나면 다른 스타일로 모듈을 시작할 수 있습니까?
  2. 기본 매개 변수에 둘 이상의 스크립트를 채울 수 있습니까? 그렇다면 두 개의 스레드로 시작됩니까? 그렇지 않은 경우 모듈에서 두 개의 스크립트를 시작하고 병렬로 실행할 수있는 방법은 무엇입니까?

나는 두 번째 질문이 매우 이상하다는 것을 알고 있습니다. OpenShift에서 Node.js 응용 프로그램을 호스팅했지만 응용 프로그램이 두 가지 주요 구성 요소로 구성되어 있기 때문입니다. 하나는 REST API이고 다른 하나는 알림 전달 서비스입니다.

알림 전달 프로세스가 REST API가 단일 스레드로 구현 된 경우 REST API를 차단할 것을 두려워합니다. 그러나 동일한 MongoDB 카트리지에 연결해야합니다. 또한 가능한 경우 두 구성 요소가 모두 동일한 기어에 제공 될 수 있다면 하나의 기어를 절약하고 싶습니다.

어떤 제안이라도 환영합니다.

답변:


149

에서 고궁 박물원 문서 :

기본 필드는 프로그램의 기본 진입 점 인 모듈 ID입니다. 즉, 패키지 이름이 foo이고 사용자가 패키지를 설치 한 다음 require ( "foo")를 수행하면 기본 모듈의 반출 오브젝트가 리턴됩니다.

패키지 폴더의 루트에 상대적인 모듈 ID 여야합니다.

대부분의 모듈에서 메인 스크립트를 사용하는 것이 가장 합리적이며 종종 그렇지 않습니다.

간단히 말해서 :

  1. 패키지의 진입 점이 루트 폴더 와 다른 경우 에만 main매개 변수 가 필요 합니다. 예를 들어, 사람들은 종종 엔트리 포인트를 넣어 또는 해당 스크립트를 설명해야한다,이 경우 에서 .package.jsonindex.jslib/index.jslib/<packagename>.jsmainpackage.json
  2. main진입 점을 require('yourpackagename')명확하게 정의해야 하기 때문에 로 두 개의 스크립트를 가질 수 없습니다 .

고마워요. 그러면 컴포넌트를 자식 프로세스로 구현하는 것을 고려할 것입니다.
Gavin

1
사이드 노트 1 electron은 주요 매개 변수를 존중합니다 electron .. 예를 들어 "main": "dist/app/index.js",in 이있는 경우 하위 폴더에서 올바른 것을 시작합니다 package.json(다른 플랫폼 / 프레임 워크에서도 마찬가지입니다).
Frank Nocke

1
참고 2 : 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'매개 변수를 생략 할 수 있습니까?
Kokodoko

@Kokodoko 네, 이것이이 경우에 제안되는 것입니다
cquezel

7

main키 의 중요한 기능 중 하나 는 진입 점에 대한 경로를 제공한다는 것입니다. 이 작업은 매우 유용 nodemon합니다. 당신이 말한대로 키 nodemon를 정의하고 작업 하면 CLI 대신 root 대신 pwd로 CLI를 입력하여 서버를 크랭크 할 수 있습니다 .mainpackage.json"main": "./src/server/app.js"nodemon 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 프로젝트에 설치 한 후 bundled bundle.js 파일 에서 기능을 가져올 수 있습니다 .

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

라이브러리에 코드 분할 (예 : 웹팩)을 사용할 때도 마찬가지 입니다. 예를 들어이 webpack.config.js 는 프로젝트를 하나의 묶음 대신 여러 묶음으로 나누는 코드를 사용합니다.

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 에서 라이브러리의 하나의 기본 진입 점을 정의 합니다 .

{
  "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 의 기본 속성은 라이브러리의 기본 진입 점 파일 만 가리 킵니다.


0

OpenShift의 경우 하나의 PORT 및 IP 쌍만 (응용 프로그램 당) 바인딩 할 수 있습니다. 각 서비스 엔드 포인트에 내부 경로를 추가하여 단일 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.