Я работаю над проектом nuxt.js / vue.js и применяю методологию атомарного проектирования, это означает, что компоненты будут разделены на сотни компонентов в каждой папке
/components
/atoms
/molecules
/organisms
Я хочуи нужно импортировать сгруппированным и умным способом, поэтому я делаю:
в webpack.config.js
или nuxt.config.js
, используя крючки компилятора из веб-пакета для каждой сборки,генерирование index.js экспортирующих компонентов
const exec = require('child_process').exec;
module.exports = {
// ... other config here ...
plugins: [
// ... other plugins here ...
{
apply: compiler => {
compiler.hooks.beforeCompile.tap('MyPlugin', compilation => {
exec('sh assets/DynamicExport.sh', (err, stdout, stderr) => {
if (stdout) process.stdout.write(stdout)
if (stderr) process.stderr.write(stderr)
})
})
}
}
]
};
в assets/DynamicExport.sh
ls components/atoms/ | grep -v index.js | sed 's#^\([^.]*\).*$#export {default as \1} from "./&"#' > components/atoms/index.js
ls components/molecules/ | grep -v index.js | sed 's#^\([^.]*\).*$#export {default as \1} from "./&"#' > components/molecules/index.js
ls components/organisms/ | grep -v index.js | sed 's#^\([^.]*\).*$#export {default as \1} from "./&"#' > components/organisms/index.js
, затем в каждой папке создается файл index.js
путем экспорта всех компонентов папки
export { default as ButtonStyled } from './ButtonStyled.vue'
export { default as TextLead } from './TextLead.vue'
export { default as InputSearch } from './InputSearch.vue'
....
Наконец, я могу импортировать понятным, сгруппированным и умным способом в любое место моего приложения.
import {
ButtonStyled,
TextLead,
InputSearch
} from '@/components/atoms'
import {
SearchForm
} from '@/components/molecules'
все работает нормально, однако я нахожу решение немного большим, вызываяфайл в assets
, может быть, есть другой способ, который я не знаю ..
Есть ли способ реорганизовать и снизить содержание assets/DynamicExport.sh
что-то менее повторяющееся?
Любой кодРефакторинг будет приветствоваться.
Заранее спасибо.