我已经做了一些调查。但是,仍然对包中的“main”参数有疑问。Node项目的json。

填写这个字段会有什么帮助呢?问在另一种方式,我可以启动模块在不同的风格,如果这个字段出现? 我可以在主参数中填充多个脚本吗?如果是,它们会作为两个线程启动吗?如果没有,我如何在一个模块中启动两个脚本,并让它们并行运行?

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

如果将通知传递过程实现为单个线程,恐怕会阻塞REST API。但是,它们必须连接到相同的MongoDB磁带。此外,我想节省一个齿轮,如果两个组件可以在同一齿轮服务,如果可能的话。

欢迎提出任何建议。


来自npm文档:

主字段是一个模块ID,它是您的 程序。也就是说,如果您的包名为foo,并且用户安装 It,然后does require("foo"),然后是主模块的导出 对象将返回。 这应该是一个相对于包根的模块ID 文件夹中。 对于大多数模块,有一个主脚本和是最有意义的 除此之外通常没什么。

简而言之:

在包中只需要一个主参数。如果你的包的入口点不同于根文件夹中的index.js。例如,人们经常将入口点放在lib/index.js或lib/<packagename>.js中,在这种情况下,相应的脚本必须在package.json中描述为main。 你不能有两个脚本作为主脚本,因为入口点require('yourpackagename')必须明确定义。


对于OpenShift,您只能绑定一个PORT和IP对(每个应用程序)。听起来,您应该能够通过为每个服务端点添加内部路由,从单个nodejs实例中同时服务这两个服务。

我有一些关于OpenShift如何使用你的项目包的信息。在这里启动应用程序:https://www.openshift.com/blogs/run-your-nodejs-projects-on-openshift-in-two-simple-steps#package_json


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

假设你有如下的文件结构:

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

包内无主要参数。Json,你必须通过给出模块入口点:require('my-npm-module/lib/module.js')来加载模块。

如果你设置了包。Json的主要参数如下:"main": "lib/module.js",你将能够以这种方式加载模块:require('my-npm-module')。


主键的一个重要功能是为入口点提供路径。这在与nodemon一起工作时非常有用。如果您使用nodemon,并且在包中定义了主键。比如“main”:“./src/server/app.js”,然后你可以在命令行中输入nodemon,用root作为pwd,而不是nodemon ./src/server/app.js来启动服务器。


如果你的包里有。json文件:

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

Lib /entry.js将是你的包的主要入口点。

当调用

require('zig-zag');

在node中,lib/entry.js将是实际需要的文件。


据我所知,它是npm的节点包(库)的主要入口点。如果你的npm项目变成了一个节点包(库),其他人可以通过npm安装它。


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

-lib/
--bundle.js

然后在你的包裹里。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';

但是,您也可以绕过包的主入口点。并导入代码拆分后的bundle:

import add from 'my-library-name/lib/add';
import subtract from 'my-library-name/lib/subtract';

毕竟,包中的主要属性。Json只指向你的库的主要入口点文件。


在Node.js入门文档中,它声明;

额外注意:如果传递给require的文件名实际上是一个目录,它将首先查找package。并加载main属性中引用的文件。否则,它将查找index.js。