繁体   English   中英

npm package.json 主要和项目结构

[英]npm package.json main and project structure

我对 npm 和 main 字段有问题。 我看到了文档,据我所知,我指出 main 是一个与 ./index.js 不同的入口点。 我已经测试了所有 dist 文件都在根文件夹中的包。 我在打包阶段使用 .npmignore 忽略了 src 和 test,但我不喜欢构建和打包项目以验证结构将我的所有文件拉入包根文件夹的这一点。 所以我将输出改为 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。

任何人都可以帮忙吗?

问候

很难确定不知道您的主要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()以避免需要转译步骤。

模块

遵循我从这个答案中获得的建议的模块:

项目结构:

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/dist/moduleA');
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的内部路径。 有关工作示例,请参阅test2.js

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

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

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

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

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

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

这些是您唯一的选择,无需将模块拆分为一组完全独立的模块,每个模块单独分布。

所以这就是我对它的工作原理的理解。 我不是 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”; 不会从 JS/npm 的角度(导出的内容)查看项目结构,而是在 from 短语中使用 / 时立即查看包的文件结构。

这意味着如果你使用

import { moduleA } from "my-pakage";

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

所以没有人会问为什么我要把这些东西放在 dist 文件夹中? 在 git 中很容易被忽略。 据我了解,使用 node 的最佳实践是使用“预发布”步骤来实际构建包。 这意味着如果您重新检出代码并运行“npm install”,它按照设计执行“npm run prepublish”,它会向文件夹结构发送带有打包和转换文件的垃圾邮件。

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

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

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

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

基本上复制 dist 文件夹中的东西从那里发布。 有点hacky但在我的情况下是必要的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM