docs: async function renderVirtualFileStructure(dirPath) {
          const stat = await MzFs.stat(dirPath);
          if (!stat.isDirectory()) {
              throw new TypeError('dirPath should be a folder');
          }
  
          const virtualNodeList = [];
          const childNameList = await MzFs.readdir(dirPath);
  
          await Promise.all(childNameList.map(childName => {
              return ((async () => {
                  try {
                      const childPath = Path.join(dirPath, childName);
                      const {name: childNameWithoutSuffix} = Path.parse(childPath);
                      const fileNameAnalysis = new FileNameAnalysis(childNameWithoutSuffix);
  
                      const childStat = await MzFs.stat(childPath);
  
                      // 是文件夹
                      if (childStat.isDirectory()) {
                          // 是否是需要操作的文件夹
                          if (
                              !FileAndFolderMatch.matcherFolder(childPath) ||
                              fileNameAnalysis.isModule ||
                              fileNameAnalysis.isIgnore
                          ) {
                              return;
                          }
                          // 标记为parent目录的渲染
                          if (fileNameAnalysis.isParent) {
                              const virtualNode = {path: childPath};
                              virtualNode.child = await renderVirtualFileStructure(childPath);
                              virtualNodeList.push(virtualNode);
                              return;
                          }
                          const _virtualNodeList = await renderVirtualFileStructure(childPath);
                          virtualNodeList.push(..._virtualNodeList);
                          return;
                      }
  
                      // 是文件
                      if (
                          !FileAndFolderMatch.matcherFile(childPath) ||
                          fileNameAnalysis.isModule ||
                          fileNameAnalysis.isIgnore
                      ) {
                          return;
                      }
  
                      virtualNodeList.push(childPath);
                  } catch (error) {
                      return Promise.reject(error);
                  }
              })());
          }));
  
          return virtualNodeList;
      }