Node.js是package.json的主要参数

Gav*_*vin 127 javascript rest asynchronous node.js openshift

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

  1. 如何填写这个领域有帮助?以另一种方式询问,如果此字段显示,我可以以不同的方式启动模块吗?
  2. 我可以在主参数中填入多个脚本吗?如果是的话,他们会以两个线程开始吗?如果不是,我如何在模块中启动两个脚本并让它们并行运行?

我知道第二个问题很奇怪.这是因为我在OpenShift上托管了一个Node.js应用程序,但该应用程序由两个主要组件组成.一个是REST API,另一个是提供服务的通知.

我担心如果将REST API实现为单个线程,则通知传递过程将阻止REST API.但是,他们必须连接到相同的MongoDB盒式磁带.此外,如果可能的话,如果两个组件都可以在相同的档位上运行,我想保存一个档位.

欢迎任何建议.

bre*_*hin 130

npm文档:

主要字段是模块ID,它是程序的主要入口点.也就是说,如果您的包名为foo,并且用户安装它,然后执行require("foo"),那么将返回主模块的exports对象.

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

对于大多数模块而言,最有意义的是拥有一个主脚本并且通常没有其他内容.

简而言之:

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


Bas*_*ien 40

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

假设您有以下文件结构:

my-npm-module
|-- lib
|   |-- module.js
|-- package.json
Run Code Online (Sandbox Code Playgroud)

如果没有package.json中的main参数,则必须通过给出模块入口点来加载模块:require('my-npm-module/lib/module.js').

如果按如下方式设置package.json主参数"main": "lib/module.js",则可以这样加载模块:require('my-npm-module').


pro*_*sti 18

例如,如果你的package.json文件中有:

{
"name": "zig-zag",
"main": "lib/entry.js",
...
}
Run Code Online (Sandbox Code Playgroud)

lib/entry.js将是您的包裹的主要入口点.打电话的时候

require( 'zig-zag' );

在节点中,lib/entry.js将是所需的实际文件.

  • 因此,如果不打算导入代码,我们可以省略“main”参数吗? (3认同)

Rob*_*uch 8

据我所知,它是 npm 的节点包(库)的主要入口点。如果您的 npm 项目成为可以由其他人通过 npm 安装的节点包(库),则需要它。


假设您有一个带有 build/、dist/ 或 lib/ 文件夹的库。在此文件夹中,您为库获得了以下编译文件:

-lib/
--bundle.js
Run Code Online (Sandbox Code Playgroud)

然后在你的package.json 中,告诉 npm 如何访问库(节点包):

{
  "name": "my-library-name",
  "main": "lib/bundle.js",
  ...
}
Run Code Online (Sandbox Code Playgroud)

将带有 npm 的节点包安装到您的 JS 项目后,您可以从捆绑的bundle.js文件中导入功能:

import { add, subtract } from 'my-library-name';
Run Code Online (Sandbox Code Playgroud)

这在为您的库使用代码拆分(例如 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',
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,您仍需package.json 中定义一个到您的库的主要入口点:

{
  "name": "my-library-name",
  "main": "lib/main.js",
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后在使用库时,您可以从主入口点导入文件:

import { add, subtract } from 'my-library-name';
Run Code Online (Sandbox Code Playgroud)

但是,您也可以绕过package.json 中的主要入口点并导入代码拆分包:

import add from 'my-library-name/lib/add';
import subtract from 'my-library-name/lib/subtract';
Run Code Online (Sandbox Code Playgroud)

毕竟,package.json 中的 main 属性仅指向库的主入口点文件。


Aka*_*ash 7

main密钥的一个重要功能是它为您的入口点提供了路径.这在使用时非常有用nodemon.如果你正在使用nodemon并且你main在你package.json所说的中定义了密钥"main": "./src/server/app.js",那么你可以简单地在服务器上输入nodemonroot,而不是 使用root作为pwd nodemon ./src/server/app.js.