【问题标题】:Scoped Exports in JSJS 中的范围导出
【发布时间】:2020-04-21 11:53:50
【问题描述】:

一旦我们export 某事在JS。例如,在一个名为 foo.js 的文件中,我们有一行写着::

export default foo;

我们可以从任何我们想要的文件全局导入它。但是,如果需要避免它怎么办。

这是一个问题陈述:

  • 认为X 是一个包含AB 模块的应用程序。
  • 每个模块AB 都包含一个文件parser.js,其中包含一些同名的导出函数。
  • 假设AB 是独立的模块。
  • 如果AB 是独立模块,原则上,模块不应访问其范围之外的功能/功能。
  • 由于导出是全球可用的,在开发过程中,一个人可以访问parser.js 文件中的函数,他/她可能会在不知不觉中使用错误的代码。

有没有办法定义一个范围,导出的模块只能在某个级别使用。

如果没有,那么有什么创造性的方法可以解决这个问题吗?

寻找解决大规模开发问题/经验的想法 :)

【问题讨论】:

  • 鉴于您必须使用它们的文件路径从这些文件中显式导入函数,这不是比较清楚吗?
  • 没错,它们的文件路径不同。我试图与访问对象属性的开发经验进行类比。如果我正在使用一个对象,它的所有属性都可用(可访问)。我想知道是否有办法使用exports 实现类似的依赖行为。有点像命名空间?
  • 模块本身已经是一个命名空间。如答案中所述,也许您正在寻找import * as foo from "mod.js"; 为整个模块分配一个清晰的名称?
  • 是的,我认为这可能有效。谢谢:)

标签: javascript ecmascript-6 ecmascript-next


【解决方案1】:

您可以只使用别名来避免命名冲突:

import {
  foo,
} from './some/path';

import {
  foo as bar,
} from './some/other/path';

但是,是的,大多数库都有一个单独的入口点(通常是 index.js)来导出子模块的功能,而您所要做的就是不导出要隐藏的模块。现在,当然,有人仍然可以通过在 node_modules 文件夹中指定路径来直接导入您想要隐藏的子模块,但是这样做的人是 a) 愚蠢地依赖非公共 API 和 b) 可能玩得足够高避免这种错误的水平。

对于直接使用的应用程序代码,只需将其包装在您添加到 package.json 的库中,例如一个 git url,或者只是注释代码或更改名称。 Typescript 也可以提供帮助,如果函数具有不同的类型签名,则无法在您所指的地方使用一个。

但归根结底,最简单的方法是对您的开发人员同行抱有一点信心:要努力防止人们犯他们不太可能犯的错误。

根据评论编辑

导入可以像这样命名空间:

import * as Whatever from 'some-module';

Whatever.someFn();

【讨论】:

  • 没错,但我想知道为什么 javascript 不允许命名空间导入。
  • 嗯。有道理:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多