Javascript 使用ES5语法在节点中混合默认和命名导出
我所有导出/导入模块的经验都是在ES6中使用Javascript 使用ES5语法在节点中混合默认和命名导出,javascript,node.js,node-modules,ecmascript-5,Javascript,Node.js,Node Modules,Ecmascript 5,我所有导出/导入模块的经验都是在ES6中使用导出和导入,您可以这样做,让单个模块导出默认函数以及单独的命名函数 // module.js export default mainFunction export { namedFunction } // main.js import mainFunction from 'functions' mainFunction() import { namedFunction } from 'function' namedFunction() 但是,我不
导出
和导入
,您可以这样做,让单个模块导出默认函数以及单独的命名函数
// module.js
export default mainFunction
export { namedFunction }
// main.js
import mainFunction from 'functions'
mainFunction()
import { namedFunction } from 'function'
namedFunction()
但是,我不知道如何使用module.exports
和require
进行ES5样式的导入。据我所知,我可以导出一个默认值:
// module.js
module.exports = function mainFunction() {}
// main.js
const mainFunction = require('module.js')
或者,我可以创建命名导出:
// module.js
module.exports = {
namedFunction: function() {}
}
// main.js
const namedFunction = require('module.js').namedFunction
但我不能两者都做。我想我可以这样命名一个导出“default”,但它不起作用
// module.js
module.exports = {
default: function() {},
namedFunction: function() {}
}
// main.js
const mainFunction = require('module.js') // does not work
const mainFunction = require('module.js').default // works, but not what I want
const namedFunction = require('module.js').namedFunction
如何使用ES5完成此双重默认/命名导出?您希望将
模块的值指定为默认函数。导出
,然后将所有命名导出作为该函数的属性
const defaultFunction = () => { console.log('default!'); };
const namedFunction1 = () => { console.log('1!'); };
const namedFunction2 = () => { console.log('2!'); };
const myModule = module.exports = defaultFunction;
myModule.namedFunction1 = namedFunction1;
myModule.namedFunction2 = namedFunction2;
假设这是在myModule.js
中。然后你可以这样做:
const myModule = require('./myModule');
myModule(); // Prints: 'default!'
myModule.namedFunction1(); // Prints: '1!'
如果不想重复命名的导出,可以执行以下操作
module.exports = defaultFunction;
module.exports = Object.assign(module.exports, {
namedFunction1,
namedFunction2,
});
然后你可以要求像平常一样
const myModule = require('./myModule');
myModule();
myModule.namedFunction1();
ES6中的导出(使用babel编译)将默认值导出到名为
default
的属性,并设置属性\u esModule
。导入默认模块时,它将导入默认值iff\u esModule
存在。否则,它将导入整个模块作为默认值。这种行为造成了一些问题。我想这是有原因的,但为什么不直接分配给module.exports呢?我试过了,似乎效果不错:module.exports=defaultFunction;module.exports.namedFunction1=namedFunction1代码>@arichards如果这对你来说更容易/更好,那么这应该行得通。如果我合理地确定该函数将在使用它的地方调用myModule
,那么我喜欢在定义它的地方调用它myModule
。但那只是我的偏好。