【问题标题】:How to use the 'main' parameter in package.json?如何在 package.json 中使用“main”参数?
【发布时间】:2014-04-26 02:51:07
【问题描述】:

我已经做了很多搜索。但是,仍然对 Node 项目的 package.json 中的 'main' 参数存有疑问。

  1. 填写此字段有何帮助?换个方式问,如果出现这个字段,我能不能以不同的方式启动模块?
  2. 我可以在主参数中填写多个脚本吗?如果是,它们会作为两个线程启动吗?如果不是,如何在一个模块中启动两个脚本并让它们并行运行?

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

如果通知传递过程被实现为单个线程,我担心通知传递过程会阻塞 REST API。但是,它们必须连接到同一个 MongoDB 盒式磁带。此外,如果可能的话,如果两个组件都可以在同一个档位上使用,我想节省一个档位。

欢迎提出任何建议。

【问题讨论】:

    标签: javascript node.js rest asynchronous openshift


    【解决方案1】:

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


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

    -lib/
    --bundle.js
    

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

    {
      "name": "my-library-name",
      "main": "lib/bundle.js",
      ...
    }
    

    使用 npm 将 node 包安装到您的 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 属性只指向库的主入口点文件。

    【讨论】:

      【解决方案2】:

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

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

      lib/entry.js 将是您的包的主要入口点。

      打电话时

      require('zig-zag');
      

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

      【讨论】:

      • 那么如果代码不是要导入的,我们可以省略'main'参数吗?
      • @Kokodoko 是的,这就是这种情况下的建议
      【解决方案3】:

      只需将其视为“起点”。

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

      例如

      public class IamMain  // when export and require this guy
      {
          public IamMain()  // this is "main"
          {...}
      
          ...   // many others such as function, properties, etc.
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          来自the npm documentation

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

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

          对于大多数模块,拥有一个主脚本和 其他的通常不多。

          简而言之:

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

          【讨论】:

          • 谢谢,那么我会考虑将该组件实现为子进程。
          • 旁注 1,electron 尊重主要参数,即electron . 确实从子文件夹开始正确的事情,如果有例如"main": "dist/app/index.js", in package.json(可能也适用于其他平台/框架)。
          • 旁注 2:You can't have two scripts as main... - 是的。但是,如果您的包碰巧提供了多个 CLI 命令(在开发期间可在 ./node_modules/.bin/<symlink> 下访问)check out the "bin" parameter
          • 这里的每个人都在使用.js 扩展,但是“模块标识符”没有扩展......我不喜欢我们应该使用的模棱两可
          • @testndtv 这一切都非常相似,例如import Foo from 'foo' 将在 foo 包的入口点中寻找默认导出,这将是 foopackage.json 中的 main 参数设置为(或 index.js 购买默认值) )。
          【解决方案6】:

          要回答您的第一个问题,您加载模块的方式取决于模块入口点和 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')

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 2017-08-31
              • 2020-05-16
              • 2012-12-31
              • 2018-03-14
              • 2015-11-15
              • 2016-08-25
              • 2018-09-06
              • 2017-09-28
              • 1970-01-01
              相关资源
              最近更新 更多