npm package.json主要和项目结构

我有一个NPM和主场的问题。 我看到的文档和我的理解我主要是一个不同的入口点比./index.js。 我已经testing了所有dist文件都在根文件夹内的软件包。 我忽略了src,并在包装​​阶段使用.npmignore进行testing,但是我不喜欢将项目构build和打包以validation结构将所有文件打包到根文件夹中。 所以我改变输出为dist而不是。

如果我使用npm包并提取文件,我得到以下结构:

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

所以这么好。 但现在我被迫input如下:

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

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

 "main": "dist/index.js" 

但是它仍然不起作用,只有当我inputdist时才有效。 我使用npm 3.10.7和节点6.7.0。

谁能帮忙?

问候

很难确定是否知道主要index.jsmoduleA的内容,但是通常不会导入任何特定的文件,而是包含package.json的目录 – 比如:

 import {moduleA} from "myNpmModule"; 

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

例如,在dist/index.js

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

并在你的主要代码:

 import {moduleA} from "myNpmModule"; 

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

其实我写了一个模块,自动做这样的事情,在子目录中导入模块,并将其导出为属性。 我没有把它放在npm因为它是我自己使用,当我发布到npm我会更新这个答案。

更新

下面是我上面描述的一个工作示例 – import改为require()以避免需要一个转码步骤。

一个模块遵循我的build议从这个答案:

项目结构:

 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); 

这通过package.json引用的dist/index.js文件导入dist/ModuleA/index.js 。 看到一个工作的例子test1.js 。

版本2

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

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

版本3

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

这通过主项目目录中的moduleA.js文件导入dist/ModuleA/index.js 。 这种方式不需要知道内部项目组织 – distpath是不需要的。 看到一个工作的例子test3.js 。

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

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

如果在项目的根目录中没有这样的文件,那么如果没有在path中包含dist ,或者直接通过package.json包含的项目的主js文件( dist/index.js直接导入,就无法导入moduleA在这种情况下)。

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

这些是唯一的select,你没有把你的模块分成一组完全独立的模块,每个单独分发。

所以这里是我的理解如何工作。 我不是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"; 

不等同于上述使用要求的声明。 你可以做什么,而不是id:

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

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

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

所以这里是我的结论,我是如何理解这一点的。

…来自“my-package / dist / moduleA / moduleAA”; 没有从JS / npm的angular度(导出的内容)查看项目结构,而是只要在源句中使用/,就会查看包的文件结构。

这意味着如果你使用

 import { moduleA } from "my-pakage"; 

它实际上会导入dist / index.js的所有导出,但是如果导入“my-package / moduleA”,实际上如果path“/ moduleA”存在,它将在程序包内查找。 在上述情况下是不正确的。 如果我们省略dist文件夹并将结构移动到程序包根目录下,那么语句实际上会以您期望的方式工作。

所以没有人可以问为什么我想在dist文件夹中有这个东西? 在git中很容易忽略。 正如我理解使用节点的最佳做法,您使用“预发布”步骤来实际构build您的包。 这意味着如果你重新检查代码并运行“npm install”,它执行“npm run prepublish”devise,它会将文件夹结构与打包和转换后的文件进行混淆。

玩了几个小时后,我放弃了,只是接受“npm安装”可能会垃圾邮件我的文件夹。 作为替代,我无法在我的package.json中定义预发布,并在“npm发布”之前运行“npm run build”。 (“scripts”:{“build”:“babel src –out-dir。”})