NodeJS 中是否有一种方法或模式可以仅在包的模块内共享函数,而不允许从另一个包共享它们?
例如,如果包 A 有 file1.js、file2.js 和 index.js。 index.js 使用 file1 和 file2 中的函数。
B包使用了A包。貌似从file1和file2导出的所有模块都对B包可用。是否只能限制为从A包的index.js导出的模块?
简而言之,是否支持受保护范围之类的东西?
正如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 }
没有内置的方法,但我专门为此目的编写了一个 ESLint 插件:eslint-plugin-export-scope
您可以选择将哪些模块导出到外部代码。此外,您可以清楚地传达意图,即从文件导出的代码只能在包内部使用,而不能在包外部使用(包范围)。
我的解决方案基于另一种编程语言的想法。根据 Google 创建的 Dart 编程语言采用的约定:
与 Java 不同,Dart 没有关键字 public、protected 和 private。如果标识符以下划线 (_) 开头,则它对其库是私有的。
因此,对于仅导出包私有代码的文件,其名称应带有下划线
_
前缀,例如_packagePrivate.js
。此文件中的所有的命名导出(例如,常量、函数)也应该以下划线_
为前缀。
@package
:
此符号意味着 package-private。通常,此标记指示符号仅可用于与该符号的源文件位于同一目录中的代码。
JSDoc 中的
@package
标签与 @access package
相同(参见 @access
)。
@internal
:
表示某个 API 项目不打算由第三方开发者使用。该工具可能会从公开发布中删除声明。在某些实现中,某些指定的包可能被允许使用“内部 API 项”,例如因为这些包是同一产品的组件。
因此,
_packagePrivate.ts
可能看起来像这样:
/**
* @package
* @internal
*/
export function _doSomething(): void {}
const _apiKey = '...';
/**
* @package
* @internal
*/
export default _apiKey;
根据 ES 2015 模块的 JSDoc 示例
在大多数情况下,您只需将 JSDoc 注释添加到定义导出值的导出语句中即可。如果您要以其他名称导出值,则可以在其导出块中记录导出的值。