代码在 这里
用法:因为没有发布到npm,所以就把这个文件里面的代码拷贝下来自己建一个模块,比如叫require-dir.js

const requireDir = require('path/to/require-dir')

第一个参数固定为__dirname,第二个参数为需要require的目录。

多次加载同一目录时,第一次加载的结果会进行缓存,以后再次使用requireDir去require该目录的时候会直接拿到缓存的对象而不会再次利用fs去读取该目录。

假设目录结构如下:

|_src
|  |_lalala
|     |_wxdir
|     |  |_event.js
|     |  |_other-thing.js
|     |_user.js

一. 树状结构

将整个目录中所有的js模块进行迭代,返回一个对象,对象的属性结构和目录结构一致,如果文件夹或者文件名中有非字母数字的字符,其对应的对象属性中则会移除该字符并且以其作为分隔进行驼峰式命名,如下面的other-thing.js

const lalala = requireDir(__dirname, 'path/to/lalala')

lalala的结构为,

{
  user: require('path/to/user.js')
  wxdir: {
    event: require('path/to/event.js'),
    otherThing: require('path/to/other-thing.js')
  }
}

二. 平行结构

1.依然将整个目录的js进行迭代,只不过返回的对象不是树状结构,而是将它与传入路径的相对路径进行分割和驼峰式命名

const lalala2 = require(__dirname, 'path/to/lalala', true)

lalala2的结构为

{
  user: require('path/to/user.js'),
  wxdirEvent: require('path/to/event.js'),
  wxdirOtherThing: require('path/to/other-thing.js')
}

2.自定义命名规则,第三个参数可以传入一个对象{ nameHandler: func },func的唯一参数是一个字符串,返回值还是字符串,requireDir返回的对象的属性则是原本的熟悉传入func后的返回值

const lalala3 = require(__dirname, 'path/to/lalala', { nameHandler: i => `$${i}` })

lalala3的结构为

{
  $user: require('path/to/user.js'),
  $wxdirEvent: require('path/to/event.js'),
  $wxdirOtherThing: require('path/to/other-thing.js')
}

acookiebear
50 声望0 粉丝

哈哈哈