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


147

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

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

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

Я боюсь, что процесс доставки уведомлений заблокирует REST API, если они будут реализованы как один поток. Однако они должны подключаться к одному и тому же картриджу 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, он сделает все что угодно. это все еще указывает на бульд / индекс. Я использую ссылку 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.
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.