首页 > 编程语言 >nodejs 实现 AMD 加载 依赖

nodejs 实现 AMD 加载 依赖

时间:2024-03-21 16:33:35浏览次数:29  
标签:const string val nodejs rep AMD return aux 加载

import fs from "fs";
import path from "path";
import vm from "vm";

export class LoadComponent {
  componentsPath: string = path.resolve("../first/components/");
  componentName: string = "";
  componentIndex: string = "";

  loadCodeFile() {
    this.componentIndex = path.join(
      this.componentsPath,
      this.componentName,
      "res/js/index.js"
    );

    const file = fs.readFileSync(this.componentIndex).toString();

    return file;
  }

  loadComponent(componentName: string) {
    this.componentName = componentName;

    const componentFolder = fs
      .readdirSync(this.componentsPath)
      .find((val) => val === componentName);

    if (componentFolder === undefined) throw Error("component does not exist!");

    interface sample {
      name: string;
      params: string[];
      entity: (...args: any) => any;
    }
    // mock require
    const repository: sample[] = [];

    const collectParams = (arr: string[], exports: object) => {
      return arr.map((val) => {
        if (val === "exports") return exports;
        val = path.join(this.componentsPath, val);
        if (cache[val]) return cache[val];
        let rep = repository.find((rep) => rep.name === val);
        if (rep === undefined) {
          if (!fs.existsSync(val)) return undefined;
          aux.window.modulePath = val;
          const defineModule = fs.readFileSync(val).toString();
          const script = new vm.Script(defineModule);
          vm.createContext(aux);
          script.runInContext(aux);

          rep = repository.find((rep) => rep.name === val) as sample;
        }

        let exportsObj: any = {};
        const ret = rep.entity(...collectParams(rep.params, exportsObj));
        cache[val] = ret ? ret : exportsObj;

        return cache[val];
      });
    };

    const moduleRequire = (...args: any) => {
      let prep: any[] = [];
      if (Object.prototype.toString.call(args[0]) === "[object Array]") {
        const first = args[0] as string[];
        const exportObj = {};
        prep = collectParams(first, exportObj);
      }

      if (Object.prototype.toString.call(args[1]) === "[object Function]") {
        args[1](...prep);
      }
    };

    const cache: { [moduleName: string]: any } = {
      require: moduleRequire,
    };

    // mock require end
    const script = new vm.Script(
      this.loadCodeFile() +
        `\n require(['/${this.componentName}/res/js/index.js'], (module)=>{ window.auxClass = Object.values(module)[0] })`
    );

    const aux = {
      window: {
        auxClass: null,
        modulePath: this.componentIndex,
      },
      require: moduleRequire,
      define: (params: string[], fun: (...args: any) => undefined | object) => {
        repository.push({
          name: aux.window.modulePath,
          params,
          entity: fun,
        });
      },
      // console,
    };

    vm.createContext(aux);

    script.runInContext(aux);

    return aux.window.auxClass;
  }
}
  loadTest() {
    const load = new LoadComponent();
    const com = load.loadComponent("head");
    console.log(com);
  }

 

标签:const,string,val,nodejs,rep,AMD,return,aux,加载
From: https://www.cnblogs.com/laremehpe/p/18087678

相关文章

  • 7、静态文件的加载
    fromflaskimportFlask,render_templateapp=Flask(__name__)@app.route("/")defhello_world():"""静态文件加载,包括图片,css,js.涉及到html的标签,已经函数url_for的使用."""returnrender_template("static.html&quo......
  • vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支
    效果图在vue2、vue3项目开发中,使用element饿了么组件库,实现Table表格组件动态懒加载表格数据,可以决定是否自动展开所有2级或3级,也可以点击加载下级数据,可搭配表格的增删改查,数据变化后自动更新列表不会破坏树状的展开和折叠结构。提供详细示例代码,一键复制运行查看效果,稍......
  • Three.js中加载和渲染3D Tiles
    1.引言3DTiles是3DGIS中常见的三维数据格式,能否用Three.js来加载渲染呢?肯定是可以,Three.js只是一个WebGL框架,渲染数据肯定可以,但是加载、解析数据得手动解决有没有一个第三方库解决这个问题呢?有,比如这个:NASA-AMMOS/3DTilesRendererJS:Rendererfor3DTilesinJavascrip......
  • AMD Zen5越来越近了!Linux GCC编译器已支持
    AMD预计会在今年年中左右开始推出下一代Zen5CPU架构产品,首先从移动端开始,然后是桌面端、服务器端,相关支持也正在紧锣密鼓地进行中,尤其是Linux系统下。现在,AMD已经将Zen5微架构加入到了GCC编译器的支持,GCCGit仓库的target设定值为“znver5”,可以赶上GCC4.1稳定版的发布。目前......
  • Pytorch | Tutorial-07 保存和加载模型
    这是对Pytorch官网的Tutorial教程的中文翻译。在本节中,我们将了解如何通过保存、加载和运行模型预测来持久保存模型状态。importtorchimporttorchvision.modelsasmodels保存和加载模型权重PyTorch模型将学习到的参数存储在内部状态字典中,称为 state_dict 。这......
  • 4.零基础Nodejs快速入门——Node.js 模块化
    Node.js模块化一、介绍1.1什么是模块化与模块?将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用1.2什么是模块化项目?......
  • 6.零基础Nodejs快速入门——包管理工具
    包管理工具一、概念介绍1.1包是什么『包』英文单词是package,代表了一组特定功能的源码集合1.2包管理工具管理『包』的应用软件,可以对「包」进行下载安装,更新,删除,上传等操作借助包管理工具,可以快速开发项目,提升开发效率包管理工......
  • 【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本 npm报错
    CentOS7环境下安装Nvm,在执行nvmuse18.17.0后执行node-v爆出如下错误 bash复制代码node:/lib64/libm.so.6:version`GLIBC_2.27'notfound(requiredbynode)node:/lib64/libc.so.6:version`GLIBC_2.25'notfound(requiredbynode)node:/lib64/libc.so......
  • tomcat类加载器
    https://blog.csdn.net/MeBieber/article/details/105114645?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-105114645-blog-3672450.235^v43^pc_blog_bottom_relevance_base1&spm=1001.2101.3001.4242.2&utm_rele......
  • 资源加载和序列化
    一切加载最后都要跑到LoadPackageInternal:创建Linker序列化(LoadAllObjects){ FUObjectSerializeContext*InOutLoadContext=LoadContext; Linker=GetPackageLinker(InOuter,PackagePath,LoadFlags,nullptr,InReaderOverride,&InOutLoadContext,ImportLinker,In......