前端工程自动化——动态导入

简介: 介绍webpack的require.context用法和实例

require.context是什么

我们可以先看一下webpack官网有这么个例子:

You can create your own context with the require.context() function.

It allows you to pass in a directory to search, a flag indicating whether subdirectories should be searched too, and a regular expression to match files against.

webpack parses for require.context() in the code while building.

The syntax is as follows:

require.context(directory, useSubdirectories = true, regExp = /^\.\/.*$/, mode = 'sync');

Examples:

require.context('./test', false, /\.test\.js$/);
// a context with files from the test directory that can be required with a request ending with `.test.js`.
require.context('../', true, /\.stories\.js$/);
// a context with all files in the parent folder and descending folders ending with `.stories.js`.

require.context是webpack的api,可以获取一个特定的上下文,主要用来实现自动化导入模块。在前端工程中,如果遇到从一个文件夹引入很多模块的情况,可以考虑使用这个api,遍历文件夹中的匹配文件,然后自动导入,取代逐个导入的写法。

require.context的用法

require.context('.', false, /\.js$/)

先看一下入参:

参数一: 要查询的目录,上述代码指的是当前目录
参数二: 是否要查询子孙目录,方法默认的值为false
参数三: 要匹配的文件的一个正则表达式,上述我要查询的是以.js结尾的文件

require.context函数执行后返回的是一个函数,并且这个函数有3个属性,如下:

resolve (Function):接受一个参数request,request为test文件夹下面匹配文件的相对路径,返回这个匹配文件相对于整个工程的相对路径
keys (Function) :返回匹配成功模块的名字组成的数组
id (String) :执行环境的id,返回的是一个字符串

与传统做法的对比

传统的做法,在页面路由较少时,通常可能都写在同一个文件内。当页面路由较多通过import引入各个模块,再合并成一个总的路由对象。

某个module路由文件,如下图:

import asyncComponent from "utils/asyncComponent";
const PageManage = asyncComponent(() =>
  import("@/app/layout/pageManage/index")
);
const PageAuthority = asyncComponent(() =>
  import("@/app/layout/pageManage/authority.js")
);

export default [
  {
    name: "页面管理",
    url: "/pageManage",
    icon: "snippets",
    key: "ly-upp_pageManage",
    children: [
      {
        name: "页面管理",
        url: "/pageManage/pageDetail",
        key: "ly-upp_pageManage_pageManege",
        component: PageManage,
      },
      {
        name: "页面授权",
        url: "/pageManage/pageAuthority",
        key: "ly-upp_pageManage_pageAuth",
        component: PageAuthority,
      }
    ]
  }
];

index总路由文件,如下图:

import home from './module/home.js'
import account from './module/account.js'
import theme from './module/theme.js'
import page from './module/page.js'
import system from './module/system.js'

export const allMenu = [
  ...home,
  ...account,
  ...theme,
  ...page,
  ...system
]

通过require.context的方法,当路由模块文件较多,达到简化的效果就越明显,并且在以后添加新的路由模块时,仅需要新增一个路由模块文件,无须在总路由文件手动引入,代码可以直接简化如下图。

// 读取文件路径,是否查找子目录,正则匹配
const routeList = importAll(require.context('./module', true, /\.js/))

export const allMenu = [
  ...routeList
]

需要注意的一点是,这种方式引入的文件的顺序是以文件名排序的,如果要以特定的顺序还需在额外处理一下。

当然,除了应用在路由模块组件的引入,其实还可以应用在很多地方,例如组件、接口api文件等等,具体需要结合项目进行使用,以达到前端工程自动化。

相关文章
|
7月前
|
前端开发 JavaScript jenkins
构建高效前端项目:从模块化到自动化
【2月更文挑战第13天】 随着Web技术的不断进步,前端项目的复杂性日益增加。为了确保可维护性和性能,前端工程师必须采用模块化和自动化的策略来优化开发流程。本文将探讨如何使用现代前端工具和最佳实践来构建一个高效的前端项目架构,包括模块打包、代码分割和持续集成等方面。
|
7月前
|
设计模式 前端开发 算法
前端工程中的设计模式应用(下)
前端工程中的设计模式应用(下)
|
2月前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
6月前
|
前端开发 JavaScript API
探索现代Web开发中的动态数据交互——前端与后端整合实战
本文探讨了现代Web开发中前端与后端整合的关键技术点,通过实际案例演示了如何利用JavaScript和Node.js实现动态数据交互,全面解析从数据请求到响应的全过程。
232 18
|
4月前
|
JSON 前端开发 JavaScript
革新Admin.NET框架:前端体验飞跃与代码生成自动化的双重革命,引领高效开发新时代!
【8月更文挑战第3天】Admin.NET是一款专为现代企业应用打造的高效框架,凭借强大的后台管理和灵活的扩展性深受开发者喜爱。本文探讨如何优化其前端体验与开发效率。首先,通过采用Flexbox和CSS Grid等技术实现响应式布局重构,确保了不同设备上的一致体验。其次,引入Vue.js或React实现组件化开发,提高代码复用性和维护性。再者,利用Webpack等工具进行性能优化,提升页面加载速度。此外,开发了代码生成器以自动生成CRUD模块,极大提高了开发效率。这些改进使Admin.NET前端开发更高效、灵活且易于维护。
120 0
|
5月前
|
前端开发 JavaScript PHP
技术心得:前端点击按钮,导入excel文件,上传到后台,excel接收和更新数据
技术心得:前端点击按钮,导入excel文件,上传到后台,excel接收和更新数据
71 0
|
5月前
|
JavaScript 前端开发
前端 JS 经典:动态执行 JS
前端 JS 经典:动态执行 JS
54 0
|
7月前
|
运维 Cloud Native 持续交付
云原生架构的未来演进:打造更加动态和自动化的基础设施
【5月更文挑战第25天】 随着企业数字化转型的深入,云原生技术以其独特的弹性、敏捷性和自动化能力成为支撑现代应用的关键。本文将探讨云原生架构的最新发展趋势,重点分析其在提高运维效率、促进资源优化配置以及支持复杂业务场景中的作用。文章还将讨论如何通过持续集成、持续部署(CI/CD)流程,微服务架构和容器化技术,实现基础设施的自愈能力,从而推动企业向完全自动化的云原生未来迈进。
|
7月前
|
弹性计算 运维 监控
|
7月前
|
开发框架 前端开发 JavaScript
【Flutter前端技术开发专栏】Flutter中的动态UI构建与数据驱动视图
【4月更文挑战第30天】Flutter是一款高效跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称,简化了动态UI和数据驱动视图的实现。本文深入讨论了动态UI构建原理,包括基于Widget树模型的UI更新和状态管理,如使用StatefulWidget和数据流库(如Provider、Redux)。此外,文中还介绍了实现技巧,如使用ListView等可滚动组件、StreamBuilder进行数据流驱动的UI更新,以及应用响应式布局以适应不同设备。Flutter为开发者提供了构建高效动态界面的强大工具。
203 0
【Flutter前端技术开发专栏】Flutter中的动态UI构建与数据驱动视图