require.context批量引进文件(个人笔记)

2020-08-12  本文已影响0人  kevision

本文参考: 自动化引入模块

在开发中大型项目时,会将一个大功能拆分成一个个小功能,除了能便于模块的复用,也让模块条理清晰,后期项目更好维护。

像 api 文件一般按功能划分模块,在组合时可以使用 require.context 一次引入文件夹所有的模块文件,而不需要逐个模块文件去引入。每当新增模块文件时,就只需要关注逻辑的编写和模块暴露,require.context 会帮助我们自动引入。

需要注意 require.context 并不是天生的,而是由 webpack 提供。在构建时,webpack 在代码中解析它。

let importAll = require.context('./modules', false, /\.js$/)

class Api extends Request{
    constructor(){
        super()
        //importAll.keys()为模块路径数组
        importAll.keys().map(path =>{
            //兼容处理:.default获取ES6规范暴露的内容; 
            //后者获取commonJS规范暴露的内容
            let api = importAll(path).default || importAll(path)
            Object.keys(api).forEach(key => this[key] = api[key])
        })
    }
}

export default new Api()

require.context 参数:

全局组件批量注册

解决的问题:封装的多次使用的组件不用在每个用到的vue文件里都引进、注册一次,这样会出现很多重复的引入和注册代码。因此我们可以通过一个全局的Js文件来管理,将需要多次使用的组件进行全局注册,使用的时候直接调用即可。

步骤一:在公有组件文件夹components下新建文件globalComponent.js

import Vue from 'vue' // 引入vue

// 处理首字母大写 abc => Abc
function changeStr(str){
    return str.charAt(0).toUpperCase() + str.slice(1)
}

/*
    require.context(arg1,arg2,arg3)
        arg1 - 读取文件的路径
        arg2 - 是否遍历文件的子目录
        arg3 - 匹配文件的正则
        返回值是一个函数
*/
// 拿到components文件夹下所有的组件
const requireComponent = require.context(
    '.', // 其组件目录的相对路径
    false, // 是否查询其子目录,如果components文件夹下还有文件夹就设为true
    /\.vue$/ // 匹配基础组件文件名的正则表达式
)
requireComponent.keys().forEach(fileName => {
    const config = requireComponent(fileName)
    console.log('config:',config)  // 打印
    const componentName = changeStr(
        // 对获取到的文件名进行处理,./child1.vue => child1
        fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')   
    )
    // 动态注册该目录下的所有.vue文件
    Vue.component(componentName, config.default || config) 
})

步骤二:将globalComponent.js引入main.js

// main.js
import  './components/globalComponent'

步骤三:使用这类组件不再需要引入和注册,直接标签使用即可

<template>
  <div>
    <h1>I am HelloWorld</h1>
    <Child1></Child1>
  </div>
</template>
上一篇下一篇

猜你喜欢

热点阅读