有没有办法让模块在分配给表达式时引用自己的默认导出?
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({...}));
例如,在 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({...}));