[javascript] 와일드 카드를 사용하여 디렉토리의 모든 파일에서 모듈을 가져올 수 있습니까?
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';
답변
이미 답변에 제공된 주제의 변형이지만 어떻게됩니까?
A의 Thing
,
export default function ThingA () {}
에서 things/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'
답변
현재 답변은 해결 방법을 제안하지만 이것이 존재하지 않는 이유를 알았습니다. 그래서 babel
플러그인을 만들었습니다 .
다음을 사용하여 설치하십시오.
npm i --save-dev babel-plugin-wildcard
그런 다음에 추가하십시오 .babelrc
.
{
"plugins": ["wildcard"]
}
자세한 설치 정보 는 repo 를 참조하십시오
이를 통해 다음을 수행 할 수 있습니다.
import * as Things from './lib/things';
// Do whatever you want with these :D
Things.ThingA;
Things.ThingB;
Things.ThingC;
다시 repo 에는 정확히 무엇을하는지에 대한 추가 정보가 포함되어 있지만이 방법을 사용하면 index.js
파일 작성 을 피할 수 readdir
있으며 런타임에 s 를 피하기 위해 컴파일 타임에 발생 합니다.
또한 최신 버전을 사용하면 예제와 똑같이 할 수 있습니다.
import { ThingsA, ThingsB, ThingsC } from './lib/things/*';
위와 동일하게 작동합니다.
답변
큰 못 생겨요! 이것은 필요 이상으로 힘들었습니다.
플랫 기본값 하나 내보내기
이 사용할 수있는 좋은 기회가 확산 ( ...
에 { ...Matters, ...Contacts }
아래 :
// imports/collections/Matters.js
export default { // default export
hello: 'World',
something: 'important',
};
// imports/collections/Contacts.js
export default { // default export
hello: 'Moon',
email: 'hello@example.com',
};
// imports/collections/index.js
import Matters from './Matters'; // import default export as var 'Matters'
import Contacts from './Contacts';
export default { // default export
...Matters, // spread Matters, overwriting previous properties
...Contacts, // spread Contacts, overwriting previosu properties
};
// imports/test.js
import collections from './collections'; // import default export as 'collections'
console.log(collections);
그런 다음 명령 줄 (프로젝트 루트 /)에서 babel 컴파일 된 코드 를 실행하려면 다음을 수행하십시오 .
$ npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
(trimmed)
$ npx babel-node --presets @babel/preset-env imports/test.js
{ hello: 'Moon',
something: 'important',
email: 'hello@example.com' }
하나의 트리와 같은 기본값 내보내기
속성을 덮어 쓰지 않으려면 다음을 변경하십시오.
// imports/collections/index.js
import Matters from './Matters'; // import default as 'Matters'
import Contacts from './Contacts';
export default { // export default
Matters,
Contacts,
};
출력은 다음과 같습니다.
$ npx babel-node --presets @babel/preset-env imports/test.js
{ Matters: { hello: 'World', something: 'important' },
Contacts: { hello: 'Moon', email: 'hello@example.com' } }
기본 이름없이 여러 개의 명명 된 내보내기 내보내기
DRY 전용이라면 가져 오기에 대한 구문도 변경됩니다.
// imports/collections/index.js
// export default as named export 'Matters'
export { default as Matters } from './Matters';
export { default as Contacts } from './Contacts';
기본 내보내기가없는 2 개의 명명 된 내보내기가 생성됩니다. 그런 다음 변경하십시오.
// imports/test.js
import { Matters, Contacts } from './collections';
console.log(Matters, Contacts);
그리고 출력 :
$ npx babel-node --presets @babel/preset-env imports/test.js
{ hello: 'World', something: 'important' } { hello: 'Moon', email: 'hello@example.com' }
명명 된 모든 내보내기 가져 오기
// imports/collections/index.js
// export default as named export 'Matters'
export { default as Matters } from './Matters';
export { default as Contacts } from './Contacts';
// imports/test.js
// Import all named exports as 'collections'
import * as collections from './collections';
console.log(collections); // interesting output
console.log(collections.Matters, collections.Contacts);
통지 destructuring import { Matters, Contacts } from './collections';
앞의 예입니다.
$ npx babel-node --presets @babel/preset-env imports/test.js
{ Matters: [Getter], Contacts: [Getter] }
{ hello: 'World', something: 'important' } { hello: 'Moon', email: 'hello@example.com' }
실제로
다음과 같은 소스 파일이 제공됩니다.
/myLib/thingA.js
/myLib/thingB.js
/myLib/thingC.js
/myLib/index.js
모든 파일을 묶기 위해 를 만들면 가져 오기 / 내보내기의 목적이 무효가됩니다. index.js “래퍼 파일”을 통해 가져 오기 / 내보내기를 통해 모든 것을 전역으로 만드는 것보다 모든 것을 첫 번째로 전역 적으로 만드는 것이 더 쉽습니다.
import thingA from './myLib/thingA';
자신의 프로젝트에서 특정 파일을 원할 경우 .
모듈에 대한 내보내기로 “래퍼 파일”을 작성하는 것은 npm 또는 다년간의 다중 팀 프로젝트로 패키징하는 경우에만 의미가 있습니다.
이거 멀었 어? 자세한 내용은 문서 를 참조하십시오.
또한, stackoverflow가 결국 코드 펜스 마크 업으로 3을 지원합니다.
답변
비동기 import ()를 사용할 수 있습니다.
import fs = require('fs');
그리고:
fs.readdir('./someDir', (err, files) => {
files.forEach(file => {
const module = import('./' + file).then(m =>
m.callSomeMethod();
);
// or const module = await import('file')
});
});
답변
허용되는 질문과 유사하지만 작성할 때마다 색인 파일에 새 모듈을 추가 할 필요없이 확장 할 수 있습니다.
./modules/moduleA.js
export const example = 'example';
export const anotherExample = 'anotherExample';
./modules/index.js
// require all modules on the path and with the pattern defined
const req = require.context('./', true, /.js$/);
const modules = req.keys().map(req);
// export all modules
module.exports = modules;
./example.js
import { example, anotherExample } from './modules'
답변
나는 그것들을 몇 번 사용했습니다 (특히 많은 파일 (예 : AST 노드)에 데이터를 분할하는 거대한 객체를 구축하는 데 사용). 그들을 구축하기 위해 작은 스크립트를 만들었습니다. 사용할 수 있습니다).
사용법 (현재 내보내기 파일을 사용하려면 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()