编写一个webpack的loader疑问

321 阅读1分钟

我想写一个自动export的loder,例子如下

const data = {
  getCommodityList: 'commodity/list',
  getCommodity: 'commodity/:id',
  getUserInfo: 'userInfo',
  putUserInfo: 'userInfo'
}

通过loader转换成自动export。这个很简单,从VariableDeclarator确定好name,然后将init.properties循环转化从export语法插入到ast末尾

const data = {
  getCommodityList: 'commodity/list',
  getCommodity: 'commodity/:id',
  getUserInfo: 'userInfo',
  putUserInfo: 'userInfo'
}
export const getCommodityList = data.getCommodityList
export const getCommodity = data.getCommodity
export const getUserInfo = data.getUserInfo
export const putUserInfo = data.putUserInfo

但是如果碰到这种,我还得各种判断,并且得从import引入./commodity和./userInfo文件,获取export default这个导出值,那边的文件如果也是这种迎来引去,我不得弄成递归,然后每次都得fs.readFileSync去获取文件字符串,这样得多慢,然后又得引入动态规划防止重复导入文件。感觉我就做了webpack的工作了。面对这种复杂情况,过来人们有没有好的方案

import commodity from './commodity'
import userInfo from './userInfo'
const data =  {
  ...commodity,
  ...userInfo
}

其实还有各种各样的极端情况,还有一些运行时的操作,我这边基本放弃了,毕竟我不是v8,只能规定一些规则来避免

// 我得判断alias的路径,这个还可以搞搞
import commodity from '@/apis/commodity'

自动添加export这个看起来简单,写的过程但暗藏杀机,在目前来看,我只能通过规则来妥协了。希望大佬们可以指点迷津。或者我这个根本就不是loader的范围