npm package.json主要和项目结构

时间:2016-09-28 09:40:57

标签: node.js npm package.json

我遇到了npm和主要字段的问题。我看到了文档,根据我的理解,我指出主要是与./index.js不同的入口点。我已经测试了所有dist文件都在根文件夹中的包。我在包装阶段使用.npmignore忽略了src和测试,但我不喜欢构建和打包项目以验证结构将所有文件打包到包根文件夹中。所以我把输出更改为dist。

如果我使用npm pack并解压缩文件,我会得到以下结构:

/
dist
  -- index.js
  -- moduleA
    -- index.js
package.json
README.md

所以非常好。但现在我被迫按如下方式导入它:

import {moduleA} from "myNpmModule/dist/moduleA";

但我不想在导入中使用dist文件夹。所以我在package.json

中设置了main
"main": "dist/index.js"

但它仍然不起作用,只有在我用dist导入时才有效。 我使用npm 3.10.7和节点6.7.0。

有人可以帮忙吗?

此致

3 个答案:

答案 0 :(得分:8)

很难确定不知道主index.jsmoduleA的内容,但通常以您导入的方式进行操作任何特定文件,而是包含package.json的目录 - 如:

import {moduleA} from "myNpmModule";

现在,index.js被引用为" main"在package.json中应导入其余模块,并将其导出为自己的module.exports属性。

例如,在dist/index.js

import {moduleA} from "./moduleA";
module.exports.moduleA = moduleA;

并在您的主要代码中:

import {moduleA} from "myNpmModule";

类似的东西 - 可能存在差异,以适合您自己的模块结构。

实际上我写了一个模块,它自动执行类似的操作,在子目录中导入模块并将它们作为属性导出。我没有把它放在npm上,因为它是我自己使用的,当我将其发布到npm时,我会更新此答案。

更新

以下是我上面描述的一个工作示例 - 将import更改为require()以避免需要进行转换步骤。

模块

一个模块遵循我的回答:

项目结构:

dist
  -- index.js
  -- moduleA
    -- index.js
package.json
moduleA.js

dist/index.js内容:

var {moduleA} = require('./moduleA');
module.exports.moduleA = moduleA;

dist/moduleA/index.js内容:

module.exports.moduleA = {
  info: 'This is what dist/moduleA/index.js exports as moduleA'
};

package.json内容:

{
  "name": "nested-project-structure-example",
  "version": "0.0.1",
  "description": "An example for a Stack Overflow answer",
  "main": "dist/index.js",
  "scripts": {
    "test": "node test.js"
  },
  // ...
}

moduleA.js内容:

module.exports = require('./dist/moduleA');

用法

使用此模块的项目:

可以像这样导入:

版本1
var {moduleA} = require('nested-project-structure-example');
console.error(moduleA.info);

这会通过dist/ModuleA/index.js中引用的dist/index.js文件导入package.json。有关工作示例,请参阅test1.js

版本2
var {moduleA} = require('nested-project-structure-example/dist/moduleA');
console.error(moduleA.info);

直接导入dist/ModuleA/index.js知道内部路径,包括dist。有关工作示例,请参阅test2.js

版本3
var {moduleA} = require('nested-project-structure-example/moduleA');
console.error(moduleA.info);

这将通过主项目目录中的dist/ModuleA/index.js文件导入moduleA.js。这种方式不需要知道内部项目组织 - 不需要dist路径。有关工作示例,请参阅test3.js

项目中moduleA.js的全部内容为:

module.exports = require('./dist/moduleA');

如果项目的根目录中没有此类文件,则无法在路径中包含moduleA或直接通过主{dist导入js {1}}中包含您项目的{1}}文件(在这种情况下为package.json)。

这些是实现问题目标的3种方法,其中两种方法不会在导入模块的代码中包含dist/index.js。我希望它能回答你的问题。

这些是您没有将模块拆分成一组完全独立的模块的唯一选项,每个模块分别分布。

答案 1 :(得分:1)

所以我理解这是如何工作的。我并非100%确定这是真的。我从简单的观察和推理中获得了这种洞察力,而不是通过实际在文档中看到这一点。 假设1(package.json):

{... "name": "my-package", "main": "dist/index.js", "scripts": { "build": "babel src --out-dir dist", "prepublish": "npm run build" }... }

假设2(包结构):

/
  -- dist
    -- moduleA
      -- index.js
        -- moduleAA
          -- index.js
    -- moduleB
      -- index.js

做到以上你得到:

var myPackage = require("my-package");
var moduleAA = myPackage.moduleA.moduleAA;
// or in short
var moduleAA = require("my-package").moduleA.moduleAA;
然而,似乎是这样:

import moduleA from "my-package/moduleA/moduleAA";

不等于上面使用require的语句。你能做什么而不是id:

import { moduleA } from "my-pakage";
const moduleAA = moduleA.moduleAA;

假设你仍然希望从moduleAA直接导入上面给出的项目结构,你需要这样做:

import moduleAA from "my-package/dist/moduleA/moduleAA";

所以这是我的结论以及我对此的理解。

...来自" my-package / dist / moduleA / moduleAA&#34 ;;从JS / npm的角度来看(导出的内容)不会查看项目结构,而是在使用from短语时立即查看包的文件结构。

这意味着如果您使用

import { moduleA } from "my-pakage";

它实际上会从dist / index.js导入所有导出,但如果导入" my-package / moduleA"如果路径" / moduleA"它实际上看起来在包内。存在。在上述情况下并非如此。如果我们省略dist文件夹并将结构移动到包根中,那么该语句实际上会按照您期望的方式工作。

所以没有人可以问我为什么要把这些东西放在dist文件夹中?在git中很容易忽略。据我了解使用节点的最佳做法,您可以使用" prepublish"步骤实际构建您的包。这意味着如果您重新签出代码并运行" npm install"执行" npm运行preublish"按照设计,它会使用打包和转换的文件来保存文件夹结构。

玩了几个小时后,我放弃了,接受了#34; npm install"可能会垃圾我的文件夹。作为替代方案,我无法在package.json中定义preublish,只需运行" npm run build"之前" npm发布"。 ("脚本":{" build":" babel src --out-dir。"})

答案 2 :(得分:0)

这是一个古老的问题,也许现在有更好的方法了,但是这是我的方法

将此添加到package.json中的脚本

  "scripts": {
     "link:publish": "tsc && cp package.json dist && cp README.md dist && cp tsconfig.json dist && cd dist && npm publish",
  },

基本上是在dist文件夹中复制要从那里发布的内容。有点黑,但就我而言是必要的