Как я могу динамически экспортировать компоненты в index.js?
Я работаю над проектом с nuxt.js и хочу реализовать методологию атомного дизайна
поэтому я в настоящее время импортирую компоненты, как это
import ButtonStyled from '@/components/atoms/ButtonStyled.vue'
import TextLead from '@/components/atoms/TextLead.vue'
import InputSearch from '@/components/atoms/InputSearch.vue'
но мне нужно импортировать, как это
import {
ButtonStyled,
TextLead,
InputSearch
} from '@/components/atoms'
чем ближе я это понял,
/atoms/index.js
const req = require.context('./', true, /\.vue$/)
const modules = {}
req.keys().forEach(fileName => {
const componentName = fileName.replace(/^.+\/([^/]+)\.vue/, '$1')
modules[componentName] = req(fileName).default
})
export const { ButtonStyled, TextLead } = modules
но я все еще определяю имена переменных экспорта статически, мне нужно определить динамику на основе компонентов внутри папки
ПРИМЕЧАНИЕ: я не могу использовать
export default modules
если я использую приведенный выше фрагмент кода, я не смогу импортировать так, как мне нужно, а именно:
import { ButtonStyled } from "@/components/atoms"
2 ответа
require.context
это довольно непонятная функция в Webpack, у вас будут проблемы при запуске модульных тестов. Но, чтобы решить вашу проблему; Вам нужно будет импортировать файл index.js в main.js
вашего проекта.
Вот как я это делаю:
_globals.js
// Globally register all base components prefixed with _base for convenience, because they
// will be used very frequently. Components are registered using the
// PascalCased version of their file name.
import Vue from 'vue'
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'
const requireComponent = require.context('.', true, /_base-[\w-]+\.vue$/)
requireComponent.keys().forEach(fileName => {
const componentConfig = requireComponent(fileName)
const componentName = upperFirst(
camelCase(fileName.replace(/^\.\/_base/, '').replace(/\.\w+$/, ''))
)
Vue.component(componentName, componentConfig.default || componentConfig)
})
компоненты / index.js
//...
import './_globals'
//...
main.js
//...
import './components' // This imports in the index.js
//...
Таким образом, ваши компоненты загружаются с require.context()
регистрируется как компонент vue и становится доступным по всему миру. Я советую использовать только глобальные компоненты с компонентами, которые будут использоваться часто. Не загружайте компонент глобально, если вы собираетесь использовать его только один раз.
Вы можете найти рабочий пример здесь -> https://github.com/IlyasDeckers/vuetiful/tree/master/src
Чтобы ваши юнит-тесты работали с шуткой, вам нужно будет смоделировать require.context()
, Это была настоящая боль, но ее можно легко достичь с помощью https://www.npmjs.com/package/babel-plugin-transform-require-context
Я пытаюсь использовать ваш способ сделать это, и известно, что вы допустили ошибку в module.exports
module.exports не может использовать импорт, я думаю, что вы можете сделать это
at atom /index.js
const req = require.context("./", true, /\.vue$/);
const atoms = {};
req.keys().forEach(fileName => {
const componentName = fileName.replace(/^.+\/([^/]+)\.vue/, "$1");
atoms[componentName] = req(fileName).default;
});
export default atoms;
где использовать
import k from "@/components/atoms/index.js";
export default {
components: {
test1: k.test1,
test2: k.test2
}
};
или index.js
import test1 from "./test1.vue";
import test2 from "./test2.vue";
export { test1, test2 };
и где использовать, как это
import {test1,test2} from "@/components/atoms/index.js";
export default {
components: {
test1,
test2
}
};
Я создал библиотеку, которая делает все это за меня, может быть, это помогает другим людям.