Node.js package.json主要参数


147

我已经做了很多搜索。但是,仍然对Node.js的package.json中的主要参数有疑问。

  1. 填写该字段有什么帮助?用另一种方式问,如果此字段出现,是否可以以其他样式启动模块?
  2. 我可以在主要参数中填写多个脚本吗?如果是,它们是否将作为两个线程启动?如果没有,如何在模块中启动两个脚本并使它们并行运行?

我知道第二个问题很奇怪。这是因为我在OpenShift上托管了Node.js应用程序,但是该应用程序包含两个主要组件。一种是REST API,一种是通知传递服务。

我担心如果将通知API实施为单个线程,则通知传递过程将阻止REST API。但是,它们必须连接到相同的MongoDB卡式盒。此外,如果可能的话,两个组件都可以在同一个齿轮中使用,我想节省一个齿轮。

欢迎任何建议。

Answers:


149

npm文档中

主要字段是模块ID,它是程序的主要入口点。也就是说,如果您的包名为foo,并且用户安装了该包,然后执行了require(“ foo”),则将返回主模块的导出对象。

这应该是相对于软件包文件夹根目录的模块ID。

对于大多数模块,拥有一个主脚本是最有意义的,而通常没有太多其他东西。

简而言之:

  1. 仅当包的入口点与其根文件夹中的入口点不同时,才需要一个main参数。例如,人们常把入口点或,在这种情况下,相应的脚本必须被描述为在。package.jsonindex.jslib/index.jslib/<packagename>.jsmainpackage.json
  2. 您不能将两个脚本用作main,仅仅是因为require('yourpackagename')必须明确定义入口点。

谢谢,然后我将考虑将该组件作为子进程来实现。
加文

1
旁注1 electron尊重主要参数,即electron .如果有"main": "dist/app/index.js",in ,则从子文件夹开始正确的事情package.json(对于其他平台/框架也可能成立)。
Frank Nocke '18

1
旁注2:You can't have two scripts as main...–正确。但是,如果您的软件包碰巧提供了多个CLI命令(在开发过程中,在下可访问./node_modules/.bin/<symlink>),请签出“ bin”参数
Frank Nocke '18 -10-9

我有build / index.js,但如果将其更改为src / index.js,它会执行任何操作。它仍然指向buld / index。我正在使用npm链接
卡洛斯,

每个人都.js在这里使用扩展,但是“模块标识符”没有扩展。.我不喜欢我们应该使用的歧义
ChaseMoskal

47

要回答第一个问题,加载模块的方式取决于模块入口点和package.json的主要参数。

假设您具有以下文件结构:

my-npm-module
|-- lib
|   |-- module.js
|-- package.json

package.json中没有main参数的情况下,您必须通过提供模块入口点来加载模块: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 '19

7

main密钥的一项重要功能是为您的入口点提供路径。使用时,这非常有用nodemon。如果你有工作nodemon,你定义main在你的钥匙package.json为让说"main": "./src/server/app.js",那么你可以简单地杀青了打字的服务器nodemon与根的CLI为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中的main属性仅指向库的主入口点文件。



-5

只需将其视为“起点”即可。

从C#的面向对象编程的意义上讲,它是对象类的init()或构造函数,这就是“入口点”的含义。

例如

public class IamMain  // when export and require this guy
{
    public IamMain()  // this is "main"
    {...}

    ...   // many others such as function, properties, etc.
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.