【问题标题】:How to set relative path resolution based on 'dist' folder如何根据“dist”文件夹设置相对路径分辨率
【发布时间】: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 并复制部分脚本,例如installpreparepublishversion 等?
  • 是的。它会更麻烦,但它会给你一个“更干净”的包。您可能只拥有一个package.dist.json,您可以将其复制并重命名为构建步骤。尽管您的分布式版本可能会少得多的脚本;它真的只需要一个安装和运行脚本。

标签: javascript node.js


【解决方案1】:

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

export NODE_PATH=./dist

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

【讨论】:

  • 这是一个全局环境和应用程序。问题是针对模块的。但是为链接+1。 :)
【解决方案2】:

通常的方法是从“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?

【讨论】:

  • 是的。这是 ES6 上的一个好方法。 OP 是关于相对路径解析,这是一个有争议的话题。
【解决方案3】:

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

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

给定一个具有目录结构的包:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2018-02-23
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多