有什么方法可以限制nodejs中包内的导出吗?

问题描述 投票:0回答:3

NodeJS 中是否有一种方法或模式可以仅在包的模块内共享函数,而不允许从另一个包共享它们?

例如,如果包 A 有 file1.js、file2.js 和 index.js。 index.js 使用 file1 和 file2 中的函数。

B包使用了A包。貌似从file1和file2导出的所有模块都对B包可用。是否只能限制为从A包的index.js导出的模块?

简而言之,是否支持受保护范围之类的东西?

node.js npm package
3个回答
0
投票

正如AZ_所说:只导出你想要导出的内容。

示例:

// file1
export const foo = () => { console.log("foo"); }
// file2
import {foo} from "./file1"

export const bar = () => { 
   foo();
   console.log("bar"); 
}
// index
import {bar} from "./bar"

// the package will only export bar
export { bar }   


0
投票

没有内置的方法,但我专门为此目的编写了一个 ESLint 插件:eslint-plugin-export-scope


0
投票

您可以选择将哪些模块导出到外部代码。此外,您可以清楚地传达意图,即从文件导出的代码只能在包内部使用,而不能在包外部使用(包范围)。

我的解决方案基于另一种编程语言的想法。根据 Google 创建的 Dart 编程语言采用的约定

与 Java 不同,Dart 没有关键字 public、protected 和 private。如果标识符以下划线 (_) 开头,则它对其库是私有的。

因此,对于导出包私有代码的文件,其名称应带有下划线

_
前缀,例如
_packagePrivate.js
。此文件中的所有命名导出(例如,常量、函数)也应该以下划线
_
为前缀。

JSDoc 有一个特殊的块标签

@package
:

此符号意味着 package-private。通常,此标记指示符号仅可用于与该符号的源文件位于同一目录中的代码。

JSDoc 中的

@package
标签与
@access package
相同(参见
@access
)。

TSDoc提供修饰符标签

@internal
:

表示某个 API 项目不打算由第三方开发者使用。该工具可能会从公开发布中删除声明。在某些实现中,某些指定的包可能被允许使用“内部 API 项”,例如因为这些包是同一产品的组件。

因此,
_packagePrivate.ts

可能看起来像这样:

/**
 * @package
 * @internal
 */
export function _doSomething(): void {}

const _apiKey = '...';

/**
 * @package
 * @internal
 */
export default _apiKey;

根据 ES 2015 模块的 JSDoc 示例

在大多数情况下,您只需将 JSDoc 注释添加到定义导出值的导出语句中即可。如果您要以其他名称导出值,则可以在其导出块中记录导出的值。

© www.soinside.com 2019 - 2024. All rights reserved.