require.context妙用-實現前端自動引入同一文件夾下多個文件(替代import)

今天在看vue-element-admin,發現了一個很好的關於批量導入多個文件的作法,不須要手動import同一文件夾下的多個文件,便於前端自動化配置,特此拿出來作一次分享。前端

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

// 知識點1: 可用於模塊的批量導入,類同於import引入同一文件夾下多個文件。
// require.context(directory, useSubdirectories = false, regExp = /^.//);
// 參數: 1. 讀取文件的路徑 2. 是否遍歷文件的子目錄 3. 匹配文件的正則表達式
// 返回是一個函數,是該文件夾下的匹配文件的執行環境
// 該函數有三個屬性
// 1. resolve {Function} -接受一個參數request,request爲test文件夾下面匹配文件的相對路徑,返回這個匹配文件相對於整個工程的相對路徑
// 2. keys {Function} -返回匹配成功模塊的名字組成的數組
const modulesFiles = require.context('./modules', true, /\.js$/)

// 知識點2:reduce(()=> {total, currentValue, currentIndex, arr}, initValue)
// 參數: 1. 執行每條數據的函數 2. 傳遞給函數的初始值,可選(之前沒發現初始值的妙用-可用於統計個數、去重等)
// 函數的參數 
// 1. total             必需。初始值, 或者計算結束後的返回值。若是設置初始值就用初始值,不然就是函數的第一條數據
// 2. currentValue     必需。當前元素


const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  // 忽略第1個js
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  // 執行modulesFiles函數,返回一個對象{default: {// 文件內容}, _esModule: true}
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})

const store = new Vuex.Store({
  modules,
  getters
})

export default store
相關文章
相關標籤/搜索