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

时间:2014-03-19 16:59:27

标签: javascript node.js rest asynchronous openshift

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

  1. 如何填写此字段有帮助?以另一种方式询问,如果此字段显示,我可以以不同的方式启动模块吗?
  2. 我可以在主参数中填入多个脚本吗?如果是的话,他们会以两个线程开始吗?如果不是,我如何在模块中启动两个脚本并使它们并行运行?
  3. 我知道第二个问题很奇怪。这是因为我在OpenShift上托管了一个Node.js应用程序,但该应用程序由两个主要组件组成。一个是REST API,另一个是提供服务的通知。

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

    欢迎任何建议。

7 个答案:

答案 0 :(得分:114)

来自the npm documentation

  

主要字段是模块ID,它是您的主要入口点   程序。也就是说,如果您的包名为foo,并且用户安装   它,然后确实需要(“foo”),然后你的主模块的出口   对象将被退回。

     

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

     

对于大多数模块而言,最有意义的是拥有一个主脚本和   通常不多。

简而言之:

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

答案 1 :(得分:37)

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

假设您有以下文件结构:

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

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

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

答案 2 :(得分:16)

例如,如果您有package.json文件:

{
"name": "zig-zag",
"main": "lib/entry.js",
...
}

lib/entry.js将成为您的软件包的主要入口点。 致电时

require( 'zig-zag' );

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

答案 3 :(得分:7)

main键的一个重要功能是它为您的入口点提供了路径。使用nodemon时,这非常有用。如果您使用nodemon并在main中定义package.json密钥,就像"main": "./src/server/app.js"那样,那么您只需键入nodemon即可启动服务器在CLI中,root为pwd 而不是 nodemon ./src/server/app.js

答案 4 :(得分:1)

对于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 :(得分:1)

据我所知,它是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';

在您的库中使用Code Splitting(例如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属性仅指向库的主入口点文件。

答案 6 :(得分:0)

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

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

例如

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

    ...   // many others such as function, properties, etc.
}