使用ES6,我可以像这样从文件中导入几个导出:
import {ThingA, ThingB, ThingC} from 'lib/things';
但是,我喜欢每个文件有一个模块的组织方式。我最终得到了这样的导入:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
我希望能够做到这一点:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
或者类似的东西,按照大家理解的约定,每个文件包含一个默认导出,每个模块与其文件同名。
这可能吗?
你也可以使用require:
const moduleHolder = []
function loadModules(path) {
let stat = fs.lstatSync(path)
if (stat.isDirectory()) {
// we have a directory: do a tree walk
const files = fs.readdirSync(path)
let f,
l = files.length
for (var i = 0; i < l; i++) {
f = pathModule.join(path, files[i])
loadModules(f)
}
} else {
// we have a file: load it
var controller = require(path)
moduleHolder.push(controller)
}
}
然后使用动态加载控制器的moduleHolder:
loadModules(DIR)
for (const controller of moduleHolder) {
controller(app, db)
}
我不认为这是可能的,但我认为模块名称的解析取决于模块加载器,所以可能有一个加载器实现支持这一点。
在此之前,你可以在lib/things/index.js中使用一个中间的“模块文件”,它只包含
export * from 'ThingA';
export * from 'ThingB';
export * from 'ThingC';
它可以让你这么做
import {ThingA, ThingB, ThingC} from 'lib/things';
我用过它们几次(特别是在构建大型对象时,将数据拆分到多个文件中(例如AST节点)),为了构建它们,我做了一个小脚本(我刚刚添加到npm中,以便其他人都可以使用它)。
使用方法(目前你需要使用babel来使用导出文件):
$ npm install -g folder-module
$ folder-module my-cool-module/
生成包含以下内容的文件:
export {default as foo} from "./module/foo.js"
export {default as default} from "./module/default.js"
export {default as bar} from "./module/bar.js"
...etc
然后你就可以使用这个文件了:
import * as myCoolModule from "my-cool-module.js"
myCoolModule.foo()
只是对答案中已经提供的主题的一个变化,但是这样如何:
在一件事中,
export default function ThingA () {}
在事情/ index.js,
export {default as ThingA} from './ThingA'
export {default as ThingB} from './ThingB'
export {default as ThingC} from './ThingC'
然后去其他地方消费,
import * as things from './things'
things.ThingA()
或者只消耗一些东西,
import {ThingA,ThingB} from './things'
Nodejs吗?这样做:
用index.js创建一个文件夹,在索引文件中添加以下内容:
var GET = require('./GET');
var IS = require('./IS');
var PARSE = require('./PARSE');
module.exports = { ...GET, ...IS, ...PARSE};
并且,在GET.js或IS.js文件中正常导出:
module.exports = { /* something as you like */}
现在,你只需要像这样包含index.js:
const Helper = require('./YourFolder');
Helper将包括你文件夹中的所有功能。
美好的一天!
目前的答案提出了一个解决方案,但这是bug我为什么不存在,所以我创建了一个通天塔插件,它做到了这一点。
使用以下方法安装:
npm i --save-dev babel-plugin-wildcard
然后将它添加到你的.babelrc:
{
"plugins": ["wildcard"]
}
有关详细的安装信息,请参阅回购
这允许你这样做:
import * as Things from './lib/things';
// Do whatever you want with these :D
Things.ThingA;
Things.ThingB;
Things.ThingC;
同样,repo包含了关于它到底做什么的进一步信息,但是这样做避免了创建index.js文件,并且也发生在编译时,以避免在运行时进行readdirs。
同样,在一个更新的版本中,你可以完全像你的例子一样:
import { ThingsA, ThingsB, ThingsC } from './lib/things/*';
工作原理与上述相同。