webpack之require.context实现前端工程自动化

原文地址

使用require.context实现前端工程自动化

require.context是什么

一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多模块的情况,可以使用这个api,它会遍历文件夹中的指定文件,然后自动导入,使得不需要每次显式的调用import导入模块

什么时候需要用到require.context

在Vue写的项目中,我把路由通过不同的功能划分成不同的模块,在index.js中一个个导入,随着项目越来越大,结构越来越复杂,每次都得手动import就很是令人烦躁
这个时候我们可以使用require.context函数遍历modules文件夹的所有文件一次性导入到index.js中

require.context参数说明

require.context函数接受三个参数

  1. directory {String} -读取文件的路径
  2. useSubdirectories {Boolean} -是否遍历文件的子目录
  3. regExp {RegExp} -匹配文件的正则
//例如
require.context('./modules', false, /.test.js$/)
/*
上面的代码遍历当前目录下的modules文件夹的所有.js结尾的文件,不遍历子目录
就像这样
 */
router                           // 路由文件夹
  |__index.js                    // 总入口,这里做一些自动化处理
  |__common.js                   // 通用路由:声明通用路由
  |__modules                     // 业务逻辑模块:所以的业务逻辑模块
        |__b.js               // 业务模块b
        |__home.js               // 业务模块home:业务模块
        |__a.js                  // 业务模块a

在index.js中调用 require.context('./modules', false, /.js$/);会得到modules文件下3个文件的执行环境

值得注意的是require.context函数执行后返回的是一个函数,并且这个函数有3个属性

  1. resolve {Function} -接受一个参数request,request为modules文件夹下面匹配文件的相对路径,返回这个匹配文件相对于整个工程的相对路径
  2. keys {Function} -返回匹配成功模块的名字组成的数组
  3. id {String} -执行环境的id,返回的是一个字符串,主要用在module.hot.accept,应该是热加载?

这三个都是作为函数的属性(注意是作为函数的属性,函数也是对象,有对应的属性)

废话不多说 直接上代码,看看怎么用

index.js自动化文件中这么写

const files = require.context('./modules', false, /\.js$/)

console.log(files.keys()) // ["./home.js"] 返回一个数组
let configRouters = []
/**
* inject routers
*/
files.keys().forEach(key => {
  configRouters = configRouters.concat(files(key).default) // 读取出文件中的default模块
})
export default configRouters // 抛出一个Vue-router期待的结构的数组

业务模块中这样写

import Frame from '@/views/frame/Frame'
import Home from '@/views/index/index'
export default [
    // 首页
    {
      path: '/index',
      name: '首页',
      redirect: '/index',
      component: Frame,
      children: [ // 嵌套路由
        {
          path: '',
          component: Home
        }
      ]
    }
]

大功告成!!!!

(0)

相关推荐

  • Webpack4.0各个击破(10)integration篇

    一. Integration 下文摘自webpack中文网: 首先我们要消除一个常见的误解,webpack是一个模块打包工具(module bundler),它不是一个任务执行工具,任务执行器是用来自 ...

  • babel 版本原因运行报错,解决办法

    学习 babel 时,遇到的问题,使用旧版本 babel 命名规则安装后运行报错,初步查找到原因是因为 babel 各个preset和plugin新旧不同版本之间存在兼容问题,提示使用 npx bab ...

  • Webpack 的异步加载原理及分包策略

    (给前端大全加星标,提升前端技能) 作者:lzg9527 https://segmentfault.com/a/1190000038180453 webpack 异步加载原理 webpack ensu ...

  • 大白话理解Webpack!

    一.背景 Webpack 最初的目标是实现前端项目的模块化,旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候,我们会通过文件划分的形式实现模块化,也就是将每个功能及其相关状态数据各自单独放 ...

  • 手写一个webpack,看看AST怎么用

    Vue中文社区 以下文章来源于进击的大前端 ,作者蒋鹏飞 Dennis 进击的大前端前端工程师,2020年开始写博客.一年时间成为掘金"优秀作者",思否2020年度"To ...

  • Webpack笔记

    webpack 导入以及导出方式 node 使用var 名称 = require('模块标识符')导入 使用module.exports 和exports 来暴露成员 ES6 import 模块名称 ...

  • 用Yeoman + gulp + webpack 来管理你的前端项目

    核心依然是plugin !Webpack出口文件即Gulp入口文件 这里也只是讲如何写一个初略的gulpfile.js 核心便是task,src,start,watch等api,详细说明见官网Gulp ...

  • 细分市场 智造未来 LED自动化机器换人工程峰会

    近年来,LED行业竞争愈加激烈,价格也越来越低,成本抽底.而更为严峻的是,人工成本越来越高,部分省市又提升了员工最低工资,这无疑让陷于增量不增利的企业,更加雪上加霜.节省成本几乎成为照明电器企业的最重 ...

  • 自动化包装与仓储 关乎你我 ——2017 后端智能包装与物流仓储自动化系统集成工程峰会羊城上演

    文/新战略机器人全媒体记者 熙文 3月2日,由新战略机器人全媒体.新战略机器人产业研究所及雅式展览服务有限公司联合举办的<2017 后端智能包装与物流仓储自动化系统集成工程峰会>在广州市琶 ...

  • 初窥Web前端工程化:web-pack核心组件设计

    上期回顾 先来回顾一下,在上期内容里,川哥为我们揭示了当下前端编译打包工具都是运行再Node环境下的,开发者是离不开编辑器IDE.编译打包这些工具. 但如何离开Node环境,前端开发者又该怎么办呢,此 ...

  • 一键数据分析&自动化特征工程!

    创造新的特征是一件十分困难的事情,需要丰富的专业知识和大量的时间.机器学习应用的本质基本上就是特征工程.--Andrew Ng 业内常说数据决定了模型效果上限,而机器学习算法是通过数据特征做出预测的, ...

  • 机械工程及自动化专业就业方向和前景

    以下内容主 要 是<就业方向>相关资讯,欢迎 阅读 . 机械工程及 自 动化专业就业方向和前景如何呢?同学们都了解清楚了吗.下面是由 30高考 小编为大家整理的"机械工程及 自动 ...

  • 使用开源微前端框架 Luigi 创建一个基于微前端架构的工程

    官网地址 微前端通常被称为"前端微服务". 它们允许您将大型单体前端分解为独立的.可扩展的.可以协同工作的独立部分. 微前端架构对于复杂的产品或拥有众多团队的公司尤其有用,可以帮助 ...

  • 自动化设计基础讲解-工程制图

    本文讲解的是制作一份信息完整.适合制造加工的工程图纸思维过程,而非机械制图的基础教程.目的在于纠正一些初级设计师常见的制图错误.所以,制图的基本知识:画法几何学.机械图学以及各种特征的简化. 表示法等 ...

  • Webpack 5模块联邦会不会引发微前端的革命呢? 本文详解

    Webpack 5的模块联邦提供加载部分编译好的代码能力,这个似乎会成为微前端架构的标准实现. Webpack只是我分享的一小点,我是08年出道的高级前端架构师,有问题或者交流经验可以进我的扣扣裙 5 ...