有没有办法让模块在分配给表达式时引用自己的默认导出?

Is there a way for a module to reference its own default export when it was assigned to an expression?

例如,在 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 模块,所以modules.export,事实上,工作,但这是非标准的,几乎是偶然的行为)。

当然还是完全可以简单的先声明本地然后再导出:

let actions = 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;
  }
});


export default actions;

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

是否有我缺少的更好的方法?

除了导入本身,我认为没有。

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

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

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

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

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