前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过webpack的require.context,去路由中心化管理

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

作者头像
Peter谭金杰
发布2020-05-09 17:35:47
9960
发布2020-05-09 17:35:47
举报

什么是webpack的require.context?

官网解释:

您可以使用require.context()函数创建自己的上下文。

它允许您传入一个目录进行搜索,一个标志表示是否也应该搜索子目录,以及一个正则表达式来匹配文件。

在构建时,webpack解析代码中的require.context()。


直接在项目中使用,我的webpack4+react的一个开源项目,很早之前写的移动端项目,大家有兴趣可以看看,给个Star

代码语言:javascript
复制
gitHub地址:https://github.com/JinJieTan/react-webpack

并且这个项目还是带docker+gitHub+Travis CI的,教程在我之前写的这里:

前端工程师学Docker ? 看这篇就够了 【零基础入门;原创】

项目结构:

代码语言:javascript
复制
+ src
  + APP.jsx
  + pages 
    + buy
      + index.jsx
    + home 
      + index.jsx 
    + person 
      + index.jsx 
    //...
  + index.js 
  //....

我在src文件夹下的APP.jsx中使用webpack的require.context API

代码语言:javascript
复制
require.context('./pages', true, /\.jsx$/)

require.context接受三个参数,官网解释:

代码语言:javascript
复制
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.

意思是:

它允许你通过一个目录进行搜索,flag指定是否搜索子目录,以及与文件匹配的正则表达式

也就是说 require.context 有三个参数:

  • directory:说明需要检索的目录
  • useSubdirectories:是否检索子目录
  • regExp: 匹配文件的正则表达式

当我使用

代码语言:javascript
复制
require.context('./pages', true, /\.jsx$/)

得到的打印返回值是:

代码语言:javascript
复制
ƒ webpackContext(req) {
  var id = webpackContextResolve(req);
  return __webpack_require__(id);
} ,"测试"

官网解释:

代码语言:javascript
复制
上下文模块导出一个(require)函数,该函数接受一个参数:请求。
导出的函数有3个属性:解析、键值、id。
resolve是一个函数,返回解析后的请求的模块id。
keys是一个函数,它返回上下文模块可以处理的所有可能请求的数组。

我按照官网示例演示,加入新的代码:

代码语言:javascript
复制
 const cache = {};

function importAll (r) {
  r.keys().forEach(key => cache[key] = r(key));
}

importAll(require.context('./pages', true, /\.jsx$/));

console.log(cache,'cache')

我得到一些模块信息:

大家可能会联想到路由结合的使用,放一个示例代码,之前我们在react中写声明式路由,集中化管理需要这样:

代码语言:javascript
复制
// rootRoute.js
const rootRoute = {
    childRoutes: [
        {
            path: '/',
            component: AppLayout,
            childRoutes: [
                require('./modules/shop/route'), //购买详情页
                require('./modules/order/route'), // 订单页
                require('./modules/login/route'), // 登录注册页
                require('./modules/service/route'), // 服务中心
                // ...
                // 其他大量新增路由
                // ...
            ]
        }
    ]
};

现在我们只需要这样,就可以实现去中心化路由管理

代码语言:javascript
复制
const rootRoute = {
    childRoutes: [
        {
            path: '/',
            component: AppLayout,
              childRoutes: (r => {
                  return r.keys().map(key => r(key));
            })(require.context('./', true, /^\.\/modules\/((?!\/)[\s\S])+\/route\.js$/))
        }
    ]
};

这里childRoutes是一个IIFE,立刻可以执行函数,传入require.context的结果,r就是初始值

修改之前的代码成这样:

代码语言:javascript
复制
const childRoutes = ((r) => {
  console.log(r.keys(), 'keys');
  return r.keys().map((key) => {
      console.log(key,'key',r(key))
    return r(key);
  });
})(require.context('./pages', true, /\.jsx$/));

console.log(childRoutes, 'childRoutes');

看打印结果

这样每个childRoutes的子节点,就是个require进来的模块啦

优化后,新增一个业务模块,只要业务模块 route 文件遵循统一的目录结构。业务模块 route 就能被自动关联到 rootRoute 里。

如果感觉写得不错,记得点个赞,关注下:前端巅峰专栏和我的公众号

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档