Основний параметр 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.