Страхотна статия, благодаря!
Бих искал да предложа подобрение, а то е - можете да вложите своя монолитен вътрешен индекс, което прави семантиката около импортирането много по-логична и ще се мащабира към по-големи проекти.
Правилата са следните:
- добавете индекс файл за папка с файлове, което експортира всички файлове
- в папка, ТРЯБВА да импортирате братя и сестри директно
- извън папка, ТРЯБВА да импортирате от индекса на целевата папка
Проектът на библиотеката, който ще демонстрирам тук, има около 40–50 файла и около 30 от тях са експортирани и тези правила ме спасиха от някои неприятни кръгови зависимости.
Така че нека вземем произволна листова папка lib/components/browser/
, която съдържа около 10 файла, необходими за изобразяване на компонент на браузъра.
Той има index.ts
файл, който експортира компоненти, които искаме да използваме другаде:
import Browser from './Browser.vue' import BrowserPage from './BrowserPage.vue' import BrowserStack from './BrowserStack.vue' export { Browser, BrowserPage, BrowserStack, }
Всеки компонент в тази папка ТРЯБВА да импортира директно зависимости на братя и сестри, но ако иска да импортира файлове, които НЕ са братя и сестри, може да направи това чрез индекса на тази група:
// Browser.vue // importing siblings (these did not need to be globally exported) import BrowserUrl from './BrowserUrl.vue' import BrowserHead from './BrowserHead.vue' import BrowserPage from './BrowserPage.vue' // importing unrelated files import { WindowModel, TabModel } from '../../state'
Има случаи, когато ще можете да се измъкнете с импортиране на братя и сестри с помощта на индексния файл, но е трудно да се определи кога работи и прави кода непоследователен:
// WorkspaceModel.ts import { TabInfo, TabModel, WindowModel } from '.'
Обратно към папката browser/
, файлът parentlib/components/index.ts
може след това да извърши друго масово експортиране на всички подпапки в components/
:
export * from './tour' export * from './app' export * from './browser'
И накрая, коренът на библиотеката lib
може да експортира всичко отново:
export * from './state' export * from './utils' export * from './mediators' export * from './components'
Всяка от другите папки (state/
, utils/
, mediators/
и т.н.) трябва да импортира и експортира собствените си файлове, като използва същите правила.
По този начин никога няма кръгови препратки, всичко остава модулно и Rollup / Webpack няма да се оплаче!
rollup v2.7.3 bundles src/index.ts → dist/controlspace-tour.js... created dist/controlspace-tour.js in 5.7s bundles src/index.ts → dist/controlspace-tour.esm.js... created dist/controlspace-tour.esm.js in 1.9s
Имам много по-голям проект на работа (100 файлове), който използва същата стратегия, за да направи файловете достъпни за други модули, и без кръгови зависимости.
Надяваме се, че това ще бъде полезно за всеки, който идва след това.
Наздраве :)