Javascript 如何将命名导入放入命名空间?

Javascript 如何将命名导入放入命名空间?,javascript,ecmascript-6,Javascript,Ecmascript 6,我想访问一些导入,如Rx.Observable或Rx.Subject。请看以下内容: import {Observable, Subject} from 'rxjs' 这是有效的,但它们将被导入当前范围而不是命名空间 import {Observable, Subject} as Rx from 'rxjs' 这是无效的 import * as Rx from 'rxjs' 这是有效的,但它会导入所有内容并使文件大小变大 有解决方案吗?如果您可以使用一个额外的JavaScript文件来实现

我想访问一些导入,如
Rx.Observable
Rx.Subject
。请看以下内容:

import {Observable, Subject} from 'rxjs'
这是有效的,但它们将被导入当前范围而不是命名空间

import {Observable, Subject} as Rx from 'rxjs'
这是无效的

import * as Rx from 'rxjs'
这是有效的,但它会导入所有内容并使文件大小变大


有解决方案吗?

如果您可以使用一个额外的JavaScript文件来实现此目的,我建议添加一个新的文件,并添加一行

export { Observable, Subject } from 'rxjs';
如果是在
/namespaces/rx.js
中,那么可以在现有文件中编写

import * as Rx from './namespaces/rx.js';

它允许您拥有一个名称空间,其中只包含您想要针对的导出。

“这是有效的,但它会导入所有内容,并会使文件大小变大。” — 导入不会根据导入的零件影响文件大小。您仍然需要下载整个文件。@SebastianSimon他说的是捆绑代码的文件大小,是的,它确实会产生巨大的差异,尤其是在处理像
rxjs
这样的大型库时。我恳请您阅读,它是基于对进口产品的分析而起作用的。使用
*
而不是特定标识符可以防止静态分析正确地震动树。为什么不进行动态导入?如果担心文件大小?@PatrickRoberts否,使用名称空间导入并不能防止树抖动,除非您将对象传递给无法轻松分析的对象。@Bergi问题在于,如果在这两个语句之间进行选择,并且假设模块没有副作用,命名的导入更有可能也更容易被树震动。我想知道这种方法有多普遍,为什么ecmascript设计者没有为这种用法创建更好的语法case@Thomas根据我的经验,将导入作为命名空间的一部分不是常见的模式。更典型的做法是从“rxjs”导入{Observable as RxObservable,Subject as RxSubject}如果名称与从其他库导入的内容冲突。如果导入没有名称冲突,那么就没有理由创建名称空间。