是否存在导出与命名和默认导出相同常量的用例



问题

我看到了一个大的代码库,其中每个带有常量的文件看起来都是这样的:

export const DEFAULT_ID = 0;
export const CURRENT_CODE = 'ABC123';
export default {
DEFAULT_ID,
CURRENT_CODE
};

它们对所有常量使用命名导出和默认导出。当谈到如何实际导入常量时,它们似乎通常只是将其作为命名导出导入:

import {CURRENT_CODE} from './whatever.consts';

这种做法有什么用例吗这很不寻常,因为通常使用命名导出或默认导出,而不是两者都使用。

研究

我检查了这个问题,希望能深入了解为什么要以这种方式将它们结合在一起,但我什么也找不到。

我得到的最接近答案是在这篇文章中。在">为什么将符号同时公开为默认导出和命名导出?"一节中,他们提供了一个简短的示例,说明如何允许用户使用import {A, B} from './a',而不需要编写类似import A, {B} from './a'的内容。然而,这种解释对我来说没有意义,因为如果常量只是作为命名导出导出,则可以使用相同的语法。

我的想法

我能想到的唯一原因是,在导入常量时,这种方法可以提供更大的灵活性。也就是说,它允许同时使用

import {DEFAULT_ID, CURRENT_CODE} from './whatever.consts';
let id = DEFAULT_ID, code = CURRENT_CODE;

import INITIALIZATION_CONSTS from './whatever.consts';
let id = INITIALIZATION_CONSTS.DEFAULT_ID, code = INITIALIZATION_CONSTS.CURRENT_CODE

用于导入常量。

这是使用这种方法的正当理由吗?是否存在任何最佳实践影响?

这种做法有用例吗?

不是。我唯一能想到的是向后兼容性,如果模块是其他地方使用的库,这可能与他们如何传输代码有关。

我能想到的唯一原因是,在导入常量时,这种方法可以提供更大的灵活性。

不需要默认导出。您可以很容易地将命名空间导入与命名导出一起使用:

import * as INITIALIZATION_CONSTS from './whatever.consts';
let id = INITIALIZATION_CONSTS.DEFAULT_ID, code = INITIALIZATION_CONSTS.CURRENT_CODE

最新更新