在 Javascript 中导出动态名称

Jim*_*Jin 3 javascript ecmascript-6

假设我们要导出大量的名字。

export const fn0 = fn.bind(null, '0');
export const fn1 = fn.bind(null, '1');
...
export const fn999 = fn.bind(null, '999');
Run Code Online (Sandbox Code Playgroud)

是否可以导出如下动态名称?

// array is [0 to 999]
array.forEach(i => export const [`fn${i}`] = fn.bind(null, i.toString());
Run Code Online (Sandbox Code Playgroud)

Eua*_*ith 5

坦率地说,不。这是设计使然。

\n\n

模块语法被设计为可静态分析这意味着无需执行任何代码即可确定其他模块需要哪些模块。这在所谓的“tree shake”中具有巨大的好处,可以根据实际使用的内容有选择地导入代码(并且此功能由rollupwebpack等模块捆绑器使用)。

\n\n

这是 ES6 模块与commonjs不同的关键方式。如果您require使用库中的方法,则文件中的所有内容都会运行,而不仅仅是您使用的内容。如果您import使用库中的函数,您(应该)只获得该函数。如果您必须运行所有代码才能找出导出的内容,则您无法执行此操作。

\n\n

从这里引用

\n\n
\n

ECMAScript 6 为您提供了两全其美的功能:Node.js 的同步语法加上 AMD 的异步加载。为了使这两者成为可能,ES6 模块在语法上不如 Node.js 模块灵活:导入和导出必须在顶层进行。这意味着它们也不能是有条件的。此限制允许 ES6\n 模块加载器静态分析模块导入的模块并在执行其主体之前加载它们。

\n
\n