如何根据'dist'文件夹设置相对路径分辨率

时间:2017-09-11 19:16:27

标签: javascript node.js

创建npm包时,如此构造它是非常常见和方便的:

root
  / dist
  / src
  / package.json

其中package.json

{
  "main": "dist/index.js"
  "files": [ "dist" ]
}

这种方法的缺点是,当消费者想要使用相对路径要求文件时,它需要包含dist文件夹。例如。 const abc = require('my-package/dist/x/y/abc');

有没有办法让NodeJS根据path.dirname(main)或类似的东西来解析相对路径?

更新:澄清一下,这与相对/深度分辨率有关,而与ES6中的出口吊装无关。 这是一个有争议的主题,应该这样做,因为消费者耦合到包的内部文件夹结构。

更新2:我想要实现的是“子模块”的概念(类似于命名空间)。例如,我的文件夹结构如下所示:

root
  / dist
     / testUtil.js
     / index.js

testUtil.js包含有用的测试功能。由于它不在正常使用中使用,我不想在顶层导出它们。即,而不是:

// index.js
export * from './testUtil'

我愿意:

// index.js
import * as testUtil from './testUtil'
export { testUtil }

但是,仍然会在顶层公开testUtil模块命名空间,并且很难使用:

// consuming.js
import { testUtil } from 'my-package'
const { funcA, funcB } = testUtil

如果我能在相对路径下“拖拽”它会更好:

// consuming.js
import { funcA, funcB } from 'my-package/testUtil'

目前,如果不解决'dist'问题,我必须这样做:

// consuming.js
import { funcA, funcB } from 'my-package/dist/testUtil'

3 个答案:

答案 0 :(得分:2)

您可以设置NODE_PATH环境变量,这应该可以解决问题:

export NODE_PATH=./dist

您还可以尝试其他一些模式here

答案 1 :(得分:0)

通常的方式是从你的" dist / index.js"中导出大量的东西。文件,而不是让人们导入其他文件。你可以重新导出这样的东西:

export { default as Something } from './something.js'
export SomethingElse from './something-else.js'

有关详情,请参阅此答案:ES6, how can you export an imported module in a single line?

答案 2 :(得分:0)

要解决dist文件夹问题,您可以将dist目录发布为独立程序包。这将涉及维护一个单独的package.json(与您的源包相比,它很可能会更轻薄package.json

对于子模块/命名空间问题,我没有看到问题。

给定一个包含目录结构的包:

root
  / index.js
  / testUtils.js
  / utilities
    / index.js
    / calculator.js
    / worker.js

您可以使用require("root")访问常规顶级导出。

您可以testUtils访问require("root/testUtils")

您可以使用utilities访问顶级require("root/utilities")模块。

您可以calculator访问require("root/utilities/calculator")

您可以按照希望向消费者展示的方式维护此结构。