模块在分配给表达式时是否有一种方法可以引用自己的默认导出?

时间:2015-08-18 21:32:43

标签: module ecmascript-6

例如,在CommonJS中:

var actions = module.exports = Flux.createActions({
  SubmitSignup: function(payload) {
    utils.xhr('POST', payload.url, payload.data, function(response, status){
      actions.ReceiveSignupResponse({
        response: response,
        status: status,
        receiver: payload.receiver
      });
    });
    return payload;
  },
  ReceiveSignupResponse: function(payload) {
    payload.receiver.handleSignupResponse(payload.response, payload.status);
    return payload;
  }
});

这会将Flux.createActions(...)表达式的值导出为模块,并将其分配给内部使用的局部变量actions,以便操作可以相互引用。即使没有多指派单行,表达式的值仍可用作module.exports

ES6仍允许使用export default为模块导出单个值,甚至允许为类和函数的值分配本地名称:

export default function foo() {...}
// or
export default class Foo { ...}

它还允许导出任意表达式(export default (whatever());),并允许导出本地分配(export let actions = Flux.createActions({...});),保留本地名称供本地使用,但是允许将赋值表达式导出为默认值 - 以下都是无效的:

export default let actions = Flux.createActions({...});
export default (let actions = Flux.createActions({...}));
export default as actions = Flux.createActions({...});

也没有可用于在内部引用值的modules.exports等价物(实际上,像babel和其他转换器这样的工具会让你混合 - 并且匹配CommonJS和ES6模块,所以{{实际上,1}} 工作,但这是非标准的,几乎是偶然的行为。)

当然,完全可以简单地先声明本地并稍后导出:

modules.export

那没关系。这似乎是一种奇怪的不协调,您可以为任何非默认值导出和分配本地名称,包括任意表达式,以及默认函数和类,而不是表达式。

有没有更好的方法来做到这一点,我错过了?

1 个答案:

答案 0 :(得分:3)

除了自我导入外,我认为没有。

原因几乎是default没有有效的标识符,所以如果你必须选择自己的标识符,那么你将不得不使用标准的显式导出方式:

let x = …;
export { x as y };
export default x;

请注意,export let x = …只是export { x as x }的语法糖,即本地名称和导出名称相同的地方,默认导出的情况绝对不是这样。

顺便说一句,默认导出一个赋值确实有效,你就是不能使用变量声明。尝试

let actions;
export default (actions = Flux.createActions({...}));