字段配置类型名修改
笑笑 编写于 2023-04-26 22:42:15
NewLife.CubeVue
// const map = state.files.map || {}
// files.keys().forEach((key: any) => {
//   map[key] = files(key)
// })
// state.files = function(req: any) {
//   return map[req]
// }
// state.files.map = map
// state.files.keys = function() {
//   return Object.keys(map)
// }

// { "./src/views/account/login.vue": VueComponet }
let map: any = {};

function context(id: string) {
  // console.log('获取文件', id)
  //   console.log(__webpack_require__)
  //   return __webpack_require__(id)
  const req = resolve(id);
  if (!req) {
    throw new Error('找不到模块:' + id);
  }
  return map[req];
}

const keys = function fileContextKeys() {
  return Object.keys(map);
};

const addFiles = function fileContextAddFiles(files: any) {
  // files.keys().forEach((value: any) => {
  //   // 在本地调试的时候“files.resolve(value)”获取的id是“./src”开头的路径
  //   // 打包后运行获取到的是一个4位长的编码
  //   // const id = files.resolve(value)
  //   map[value] = files(value);
  // });

  map = { ...map, ...files }; // 使用vite后,此对象直接就是文件对象
};

/**
 * 解析组件,id传值路径规则:src目录为起始目录
 * 例如:./App.vue
 */
const resolve = (id: any) => {
  if (id.startsWith('@/')) {
    id = id.replace('@/', '/src/'); // vite中,@/ 变成 /src/
  }

  if (keys().includes(id)) {
    return id;
  } else {
    return null;
  }
};

context.addFiles = addFiles;
context.id = 'fileContext';
context.keys = keys;
context.resolve = resolve;

export const fileContext = context;
export default fileContext;