CMS规范中require方法的简易实现

发布于:2023-03-12 ⋅ 阅读:(45) ⋅ 点赞:(0)

简单来说几个步骤

  1. 读取要加载的文件内容
  2. 执行文件内容
  3. 给执行后的结果包一层module外壳并返回

一个导出文件module.js

module.exports = function () {
  return "hello world";
};

引入这个导出文件index.js

const hello = my_Require("./module.js");
console.log("hello~", hello());

my_Require实现

const { readFileSync } = require("fs");
const path = require("path");
const { Script } = require("vm");

function my_Require(filename) {
  // read file
  const fileContent = readFileSync(path.resolve(__dirname, filename), "utf-8");
  //   fileContent包含了module.exports,下面套上这层壳
  const wrapperFileContent = `(function(require,module,exports){
    ${fileContent}
})`;
  // 运行字符串
  const scripts = new Script(wrapperFileContent, {
    filename: "index.js",
  });
  const module = {
    exports: {},
  };
  const res = scripts.runInThisContext();
  res(my_Require, module, module.exports);
  return module.exports;
}
global.my_Require = my_Require;
my_Require("./index.js");

运行requier.js文件
打印出hello~ hello world