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

147

Я уже довольно много искал. Тем не менее, все еще есть сомнения по поводу основного параметра в package.json Node.js.

  1. Как поможет заполнение этого поля? По-другому, могу ли я запустить модуль в другом стиле, если это поле присутствует?
  2. Могу ли я добавить в основной параметр несколько сценариев? Если да, будут ли они запущены как два потока? Если нет, как я могу запустить два скрипта в модуле и запустить их параллельно?

Я знаю, что второй вопрос довольно странный. Это потому, что я размещал приложение Node.js в OpenShift, но приложение состоит из двух основных компонентов. Один - REST API, а другой - служба доставки уведомлений.

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

Любые предложения приветствуются.

Gavin
источник

Ответы:

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, он сделает все что угодно. это все еще указывает на бульд / индекс. Я использую ссылку npm
Карлос
все используют .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?
Кокодоко
@ Кокодоко да, это то, что предлагается в этом случае
cquezel
7

Одной из важных функций mainключа является то, что он обеспечивает путь к вашей точке входа. Это очень полезно при работе с nodemon. Если вы работаете с nodemonи вы определяете mainключ в своем, package.jsonскажем "main": "./src/server/app.js", ключе , то вы можете просто запустить сервер, введя nodemonCLI с 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',
  },
  ...
}

Тем не менее, вы должны определить одну основную точку входа в вашу библиотеку в вашем 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.
}
Jeb50
источник