使用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/*';
或者类似的东西,按照大家理解的约定,每个文件包含一个默认导出,每个模块与其文件同名。
这可能吗?
我不认为这是可能的,但我认为模块名称的解析取决于模块加载器,所以可能有一个加载器实现支持这一点。
在此之前,你可以在lib/things/index.js中使用一个中间的“模块文件”,它只包含
export * from 'ThingA';
export * from 'ThingB';
export * from 'ThingC';
它可以让你这么做
import {ThingA, ThingB, ThingC} from 'lib/things';
只是对答案中已经提供的主题的一个变化,但是这样如何:
在一件事中,
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'
这并不完全是你所要求的,但是,有了这个方法,我可以在我的其他文件中迭代componentsList,并使用componentsList.map(…)等函数,我发现非常有用!
import StepOne from './StepOne';
import StepTwo from './StepTwo';
import StepThree from './StepThree';
import StepFour from './StepFour';
import StepFive from './StepFive';
import StepSix from './StepSix';
import StepSeven from './StepSeven';
import StepEight from './StepEight';
const componentsList= () => [
{ component: StepOne(), key: 'step1' },
{ component: StepTwo(), key: 'step2' },
{ component: StepThree(), key: 'step3' },
{ component: StepFour(), key: 'step4' },
{ component: StepFive(), key: 'step5' },
{ component: StepSix(), key: 'step6' },
{ component: StepSeven(), key: 'step7' },
{ component: StepEight(), key: 'step8' }
];
export default componentsList;
如果你使用webpack。这将自动导入文件并导出为api命名空间。
所以不需要更新每一个文件添加。
import camelCase from "lodash-es";
const requireModule = require.context("./", false, /\.js$/); //
const api = {};
requireModule.keys().forEach(fileName => {
if (fileName === "./index.js") return;
const moduleName = camelCase(fileName.replace(/(\.\/|\.js)/g, ""));
api[moduleName] = {
...requireModule(fileName).default
};
});
export default api;
对于Typescript用户;
import { camelCase } from "lodash-es"
const requireModule = require.context("./folderName", false, /\.ts$/)
interface LooseObject {
[key: string]: any
}
const api: LooseObject = {}
requireModule.keys().forEach(fileName => {
if (fileName === "./index.ts") return
const moduleName = camelCase(fileName.replace(/(\.\/|\.ts)/g, ""))
api[moduleName] = {
...requireModule(fileName).default,
}
})
export default api