当前位置: 首页 > Web前端 > HTML5

通过webpack的require.context,去路由集中管理

时间:2023-04-05 18:39:32 HTML5

webpack的require.context是什么?官网说明:可以使用require.context()函数来创建自己的context。它允许您传入要搜索的目录、指示是否还应搜索子目录的标志以及用于匹配文件的正则表达式。在构建时,webpack在代码中解析require.context()。直接在项目中使用,我的一个webpack4+react的开源项目,很久以前写的一个移动端项目,有兴趣的可以看看,给个star。gitHub地址:https://github.com/JinJieTan/react-webpack这个项目还有docker+gitHub+TravisCI,教程写在我之前:前端工程师学Docker?看完这篇【零基础入门;原创】项目结构:+src+APP.jsx+pages+buy+index.jsx+home+index.jsx+person+index.jsx//...+index.js//....我在src文件夹下的APP.jsx中使用webpack的require.contextAPIrequire.context('./pages',true,/\.jsx$/)require.context接受三个参数,官网说明:它允许您传入要搜索的目录、指示是否也应搜索子目录的标志以及用于匹配文件的正则表达式。含义:它允许你通过一个目录进行搜索,flag指定是否搜索子目录,以及匹配文件的正则表达式也就是说,require.context有三个参数:directory:表示需要检索的目录useSubdirectories:是否retrievesubdirectoriesregExp:Regularexpressionthatmatchesfiles当我使用require.context('./pages',true,/\.jsx$/)得到的打印返回值是:?webpackContext(req){varid=webpackContextResolve(req);return__webpack_require__(id);},《测试》官网解释:context一个模块导出一个(require)函数,它接受一个参数:request。导出的函数有3个属性:parsing、keyvalue、id。resolve是一个返回已解析请求的模块ID的函数。keys是一个函数,它返回上下文模块可以处理的所有可能请求的数组。我按照官网的demo添加了新的代码:constcache={};functionimportAll(r){r.keys().forEach(key=>cache[key]=r(key));}importAll(require.context('./pages',true,/\.jsx$/));console.log(cache,'cache')我得到一些模块信息:你可能会想到路由组合的使用,放个例子代码,在我们在react中写声明式路由之前,集中管理需要这样://rootRoute.jsconstrootRoute={childRoutes:[{path:'/',component:AppLayout,childRoutes:[require('./modules/shop/route'),//购买详情页面require('./modules/order/route'),//订单页面require('./modules/login/route'),//登录注册页面require('./modules/service/route'),//服务中心//...//大量其他新增路由//...]}]};现在我们只需要这样就可以实现去中心化的路由管理constrootRoute={childRoutes:[{path:'/',component:AppLayout,childRoutes:(r=>{returnr.keys().map(key=>r(key));})(要求uire.context('./',true,/^\.\/modules\/((?!\/)[\s\S])+\/route\.js$/))}]};这里的childRoutes是一个IIFE,函数可以立即执行,传入require.context的结果。r是修改初始值前的代码:constchildRoutes=((r)=>{console.log(r.keys(),'keys');returnr.keys().map((key)=>{console.log(key,'key',r(key))returnr(key);});})(require.context('./pages',true,/\.jsx$/));console.log(childRoutes,'childRoutes');看打印结果,这样childRoutes的每个子节点都是一个需要进来的模块。经过优化,新增加一个业务模块,只要业务模块路由文件遵循统一的目录结构,业务模块路由可以自动关联到rootRoute。觉得写的不错记得点赞关注:前端巅峰专栏和我的公众号