Основний параметр Node.js package.json


147

Я вже зробив досить багато пошуків. Однак, все ще виникають сумніви щодо основного параметра в package.json Node.js.

  1. Як допоможе заповнення цього поля? Запитуючи іншим способом, чи можу я запустити модуль в іншому стилі, якщо це поле представлено?
  2. Чи можу я мати більше ніж один сценарій, заповнений основним параметром? Якщо так, то вони б починалися як дві нитки? Якщо ні, то як я можу запустити два сценарії в модулі і паралельно їх запускати?

Я знаю, що друге питання досить дивне. Це тому, що я розмістив додаток Node.js на OpenShift, але програма складається з двох основних компонентів. Один - API REST, а один - послуга доставки сповіщень.

Я побоююся, що процес доставки сповіщень заблокує API REST, якщо вони будуть реалізовані як єдиний потік. Однак вони повинні підключитися до того ж картриджа MongoDB. Крім того, я хотів би зберегти одну передачу, якщо обидва компоненти могли б працювати, якщо це можливо, в одній передачі.

Будь-які пропозиції вітаються.

Відповіді:


149

З документації npm :

Головне поле - це ідентифікатор модуля, який є основною точкою входу до вашої програми. Тобто, якщо ваш пакунок названий foo, а користувач встановлює його, а потім вимагає ("foo"), тоді об'єкт експорту вашого основного модуля буде повернутий.

Це має бути ідентифікатор модуля відносно кореня папки вашого пакета.

Для більшості модулів має сенс мати основний сценарій, а часто не дуже багато іншого.

Коротше кажучи:

  1. Вам потрібен mainпараметр, лише package.jsonякщо точка входу до вашого пакета відрізняється від index.jsкореневої папки. Наприклад, люди часто ставлять точку входу lib/index.jsабо lib/<packagename>.js, у цьому випадку, відповідний сценарій повинен бути описаний як mainв package.json.
  2. Ви не можете мати два сценарії main, просто тому, що точка введення require('yourpackagename')повинна бути визначена однозначно.

Дякую, тоді я б розглядав можливість використання компонента як дочірнього процесу.
Гевін

1
Побічна примітка 1, electronвшановує основні параметри, тобто electron .починає правильно з підпапки, якщо є, наприклад, "main": "dist/app/index.js",in package.json(може бути справедливим і для інших платформ / фреймворків).
Френк Нокк

1
Побічна примітка 2: You can't have two scripts as main...- вірно. Однак якщо у вашому пакеті є, наприклад, кілька команд CLI (під час розробки, доступні в розділі ./node_modules/.bin/<symlink>), перевірте параметр "bin" .
Френк Нокк

У мене є build / index.js, але якщо я змінив його на src / index.js, він робить щось. він все ще вказує на buld / index. Я використовую npm-посилання
Carlos

тут усі використовують .jsрозширення, але "ідентифікатори модулів" не мають розширень. Мені не подобається двозначність, якою ми повинні користуватися
ChaseMoskal

47

Щоб відповісти на ваше перше запитання, спосіб завантаження модуля залежить від точки входу модуля та основного параметра paketa.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 так, це те, що пропонується в цьому випадку
cquezel

7

Однією з важливих функцій mainключа є те, що він забезпечує шлях до точки входу. Це дуже корисно при роботі nodemon. Якщо ви працюєте nodemonі ви визначаєте mainключ у своєму, package.jsonяк скажімо "main": "./src/server/app.js", тоді ви можете просто запустити сервер, набравши nodemonв CLI із root як pwd замість 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 використовує розбиття коду проекту на кілька пакетів замість одного.

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',
  },
  ...
}

Тим не менш, ви б визначили одну з головних точок входу до вашої бібліотеки у пакеті.json :

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

Потім, використовуючи бібліотеку, ви можете імпортувати свої файли з головної точки входу:

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

Однак ви також можете обійти головну точку входу з пакету.json та імпортувати розбиті пакети коду:

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

Зрештою, головна властивість у пакеті.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.
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.