创建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'
答案 0 :(得分:2)
答案 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")
。
您可以按照希望向消费者展示的方式维护此结构。