npm package.json主要和项目结构

jon*_*wig 9 node.js npm package.json

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

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

/
dist
  -- index.js
  -- moduleA
    -- index.js
package.json
README.md
Run Code Online (Sandbox Code Playgroud)

所以这么好.但是现在我被迫按如下方式导入它:

import {moduleA} from "myNpmModule/dist/moduleA";
Run Code Online (Sandbox Code Playgroud)

但我不想在我的导入中有dist文件夹.所以我在package.json中设置main

"main": "dist/index.js"
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

问候

rsp*_*rsp 10

这很难说肯定不知道你的主要内容index.jsmoduleA,但它通常是在不导入任何特定文件的方式进行,而是包含该目录的package.json-这样的:

import {moduleA} from "myNpmModule";
Run Code Online (Sandbox Code Playgroud)

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

例如,在dist/index.js:

import {moduleA} from "./moduleA";
module.exports.moduleA = moduleA;
Run Code Online (Sandbox Code Playgroud)

并在您的主要代码中:

import {moduleA} from "myNpmModule";
Run Code Online (Sandbox Code Playgroud)

类似的东西 - 可能的差异适合您自己的模块的结构.

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

更新

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

一个模块遵循我对这个答案的建议:

项目结构:

dist
  -- index.js
  -- moduleA
    -- index.js
package.json
moduleA.js
Run Code Online (Sandbox Code Playgroud)

dist/index.js 内容:

var {moduleA} = require('./moduleA');
module.exports.moduleA = moduleA;
Run Code Online (Sandbox Code Playgroud)

dist/moduleA/index.js 内容:

module.exports.moduleA = {
  info: 'This is what dist/moduleA/index.js exports as moduleA'
};
Run Code Online (Sandbox Code Playgroud)

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"
  },
  // ...
}
Run Code Online (Sandbox Code Playgroud)

moduleA.js 内容:

module.exports = require('./dist/moduleA');
Run Code Online (Sandbox Code Playgroud)

用法

使用此模块的项目:

它可以像这样导入:

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

这将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);
Run Code Online (Sandbox Code Playgroud)

dist/ModuleA/index.js直接导入了包含的内部路径dist.有关工作示例,请参阅test2.js.

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

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

项目的全部内容moduleA.js是:

module.exports = require('./dist/moduleA');
Run Code Online (Sandbox Code Playgroud)

如果项目的根目录中没有这样的文件,您将无法导入moduleA包含dist在您的路径中或直接通过js包含在其中的项目的主文件package.json(dist/index.js在本例中)中导入它.

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

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