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.js
和moduleA
的内容,但是通常不会导入任何特定的文件,而是包含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
。 这种方式不需要知道内部项目组织 – dist
path是不需要的。 看到一个工作的例子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。”})