1

我正在使用 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"
4

3 回答 3

0

require.context是 Webpack 中一个非常晦涩的功能,在运行单元测试时会遇到问题。但是,要解决您的问题;您需要在main.js项目中导入 index.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

为了让你的单元测试与 jest 一起工作,你需要模拟require.context(). 这是一个真正的痛苦,但可以通过使用 babel-plugin-transform-require-context轻松实现

于 2019-04-25T14:04:29.713 回答
0

我创建了一个库来为我做这一切,也许它可以帮助其他人。

命名出口

于 2019-07-09T16:20:00.017 回答
0

我尝试使用您的方式来做到这一点,并且知道您在 module.exports
module.exports can not use import 犯了一个错误,我认为您可以
在 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
  }
};
于 2019-04-25T14:47:27.197 回答