【发布时间】:2018-02-20 02:55:05
【问题描述】:
在创建 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'
【问题讨论】:
-
你可以发布
dist目录。 -
您的意思是在
dist中创建package.json的副本吗?这意味着我必须同步dependencies并复制部分脚本,例如install、prepare、publish、version等? -
是的。它会更麻烦,但它会给你一个“更干净”的包。您可能只拥有一个
package.dist.json,您可以将其复制并重命名为构建步骤。尽管您的分布式版本可能会少得多的脚本;它真的只需要一个安装和运行脚本。
标签: javascript node.js