首页 > 编程语言 >nodejs 组件引入

nodejs 组件引入

时间:2024-01-30 13:35:27浏览次数:30  
标签:src return string nodejs startMark 引入 endMark 组件 const

const fs = require("fs");
const nodePath = require("path");
// import * as fs from "fs";
const folder = "./";
const condition = ["node_modules", "compile"];

let arr: string[] = [];
main(folder, (val) => {
  if (!/.js$/.test(val)) return;
  arr.push(val);
}).then(() => {
  arr.forEach((src) => {
    // console.log(src, "forEach", nodePath.resolve(src));
    let srcFile = fs.readFileSync(nodePath.resolve(src)).toString();

    const analyseRes = analyzeModule(srcFile);

    if (
      analyseRes.modulePaths.length === 0 ||
      analyseRes.startMark === -1 ||
      analyseRes.endMark === -1
    )
      return;

    analyseRes.modulePaths.forEach(
      (module) => (srcFile = loadModule(srcFile, module))
    );
    srcFile = eraseModuleMark(
      srcFile,
      analyseRes.startMark - startMarkStr.length,
      analyseRes.endMark + endMarkStr.length
    );

    fs.writeFileSync(src, srcFile);

    console.log("load modules for: " + src);
  });
});

/**
 *
 * @param filePath file path
 * @returns ['common/js/request.js','common/js/test.js', ...]
 */
const startMarkStr = "//@LoadModuleStart@";
const endMarkStr = "//@LoadModuleEnd@";
const analyzeModule = (
  file: string
): { modulePaths: string[]; startMark: number; endMark: number } => {
  const startMark = file.indexOf(startMarkStr) + startMarkStr.length;
  const endMark = file.indexOf(endMarkStr);
  if (endMark === -1 || startMark === -1)
    return { modulePaths: [], startMark, endMark };
  const modules = file.substring(startMark, endMark);
  const modulePaths = modules.replace(/\n|\/\//g, "").split("//");

  return { modulePaths, startMark, endMark };
};

const loadModule = (src: string, moduleFileSrc: string) => {
  const moduleFile = fs.readFileSync(moduleFileSrc).toString();
  return (src =
    "\n//--------------\n" + moduleFile + "\n//--------------\n" + src);
};

const eraseModuleMark = (
  file: string,
  startMark: number,
  endMark: number
): string => {
  return file.substring(0, startMark) + file.substring(endMark);
};

async function main(folder: string, callback: (val: string) => void) {
  const curDir = path(folder);
  await iterate(curDir);
  async function iterate(root: string) {
    let task;
    try {
      task = fs.readdirSync(root).map(async (val: string) => {
        const tmp = path(root) + val;
        if (await isFile(tmp)) filter(tmp) && callback(tmp);
        else {
          const nextPath = path(tmp);
          filter(nextPath) && (await iterate(nextPath));
        }
      });
    } catch (err) {
      console.log(err);
    }

    return Promise.all(task);
  }
}

function path(dir: string) {
  const temp = dir.replace(/\\/g, "/");
  if (temp.endsWith("/")) return temp;
  return temp + "/";
}
function isFile(dir: string) {
  return new Promise((resolve, reject) => {
    fs.stat(dir, (err: object, stat) => {
      if (err) reject(err);
      resolve(stat.isFile());
    });
  });
}

function filter(path: string) {
  return !condition.find((val) => path.indexOf(val) !== -1);
}

 

标签:src,return,string,nodejs,startMark,引入,endMark,组件,const
From: https://www.cnblogs.com/laremehpe/p/17996906

相关文章

  • HT UI 5.0,前端组件图扑是认真的
    为顺应数字时代的不断发展,图扑HTUI5.0在原有功能强大的界面组件库的基础上进行了全面升级,融入了更先进的技术、创新的设计理念以及更加智能的功能。HTUI5.0使用户体验更为直观、个性化,并在性能、稳定性和安全性等方面达到新的高度。HTUI5.0的改版升级,是团队对于用户需......
  • HT UI 5.0,前端组件图扑是认真的!
    为顺应数字时代的不断发展,图扑HTUI5.0在原有功能强大的界面组件库的基础上进行了全面升级,融入了更先进的技术、创新的设计理念以及更加智能的功能。HTUI5.0使用户体验更为直观、个性化,并在性能、稳定性和安全性等方面达到新的高度。HTUI5.0的改版升级,是团队对于用户需求......
  • 既可以通过从层次结构更高层组件(如 FilterableProductTable)开始“自上而下”构建,也可
    既可以通过从层次结构更高层组件(如FilterableProductTable)开始“自上而下”构建,也可以通过从更低层级组件(如ProductRow)“自下而上”进行构建。在简单的例子中,自上而下构建通常更简单;而在大型项目中,自下而上构建更简单。为什么这么说呢?合理吗?在构建React应用时,"自上而下"(Top-Do......
  • 了解鸿蒙OS Text组件
    文本(Text)是用来显示字符串的组件,在界面上显示为一块文本区域。Text作为一个基本组件,有很多扩展,常见的有按钮组件Button,文本编辑组件TextField。使用Text创建Text<Textohos:id="$+id:text"ohos:width="match_content"ohos:height="match_content"o......
  • org.springframework.web该引入哪个包?
    只引入springboot并没有引入springmvc?难道两者不是包含关系吗?还要再手动引入?不懂。。<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</versi......
  • EVE-NG的环境导入IOL组件
    IOL或IOSOnLinux,也称为IOU或IOSOnUnix。IOL是一个模拟器,一般仅思科使用。IOL指为i386架构编译的Linux版本。IOU指为Sparc架构编译的Unix(Solaris)版本。由于IOL是内部IOS版本,因此IOL只能由Cisco授权客户使用。需要注意,这里的IOS区别于苹果IOS,是指互联操作系统是思科网络设备的操......
  • 组件复写:搜索人员栏,状态默认为全部
    要复写的位置如下: 整体代码:ecodeSDK.overwritePropsFnQueueMapSet('WeaSelect',{//组件名fn:(newProps)=>{//newProps代表组件参数//进行位置判断if(newProps.ecId!='_Route@mb5ed9_WeaSwitch@cbdl58@8_SelectItem@dv4xjh_WeaSelect@3vudrr'){......
  • 界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(二)
    由DevExpress开发的快速且功能完整的ASP.NETWebForms的DataGrid组件,从全面的数据塑造和数据过滤选项到十多个集成数据编辑器,该套件提供了帮助用户构建极佳数据所需的一些,没有限制!在上文中(点击这里回顾>>),我们为大家介绍了DevExpressASP.NETWebForms数据网格组件的性能、过滤......
  • 页面中的blockShow组件展示,可进行相关的样式修改,一般月饼图搭配使用,具体根据实际来
    <template><!--这是新版的相对应的颜色列表的UI--><divclass="bllockListShow"><divclass="pieList"v-for="(item,index)indataArr":key="index"@click="clickUptown(index,item)"......
  • 动态绑定组件时 v-model:value 的使用
    //requireimportcomponentsconstfiles=require.context("@/components/control",true,/\index.vue$/);//console.log('files:',files.keys())//files:['./cascader/index.vue','./control/cascader/index.vue',......