loader.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * 模块加载器, 返回数据格式为对象格式, 对象中的key和value分为以下3种:
  3. * 1. 以export default中的name属性为key, 以export default的内容为value的对象;
  4. * 2. 以文件名为key, 以export default的内容为value的对象;
  5. * 3. 自定义key和value的对象;
  6. */
  7. // 验证文件名的扩展名是否为js的文件
  8. const REPLACE_REG = /^([^/]*\/)*|\.js$/g
  9. /**
  10. * 根据组件中的name和内容作为key和value
  11. * @param components 组件对象载体
  12. * @param component 需加载的组件
  13. */
  14. const setByComponentName = (components, component) => {
  15. components[component.name] = component
  16. }
  17. /**
  18. * 根据组件中所在文件的文件名和组件的内容作为key和value
  19. * @param components 组件对象载体
  20. * @param component 需加载的组件
  21. * @param fileName 组件所在文件的文件名
  22. */
  23. const setByFileName = (components, component, fileName) => {
  24. components[fileName.replace(REPLACE_REG, '')] = component
  25. }
  26. /**
  27. * 根据文件模块过滤器加载需要export default中的内容
  28. * @param requireComponent 文件模块过滤器, webpack自带
  29. * @param callback 加载模块的方式,为分3种: 1. 以export default中的name属性为key, 以export default的内容为value的对象; 2. 以文件名为key, 以export default的内容为value的对象; 3. 自定义key和value的对象
  30. * @returns 根据callback中定义的数据格式返回对象
  31. */
  32. const build = (requireComponent, callback) => requireComponent.keys().reduce((components, fileName) => {
  33. let componentConfig = requireComponent(fileName)
  34. let component = componentConfig.default || componentConfig
  35. callback(components, component, fileName)
  36. return components
  37. }, {})
  38. /**
  39. * 对外的接口
  40. */
  41. export default {
  42. getByComponentName: requireComponent => build(requireComponent, setByComponentName),
  43. getByFileName: requireComponent => build(requireComponent, setByFileName),
  44. getByCustom: (requireComponent, callback) => build(requireComponent, callback)
  45. }