笔者在学习node的时候,突然想到如何自己写一个require,于是就有了这篇文章。
10行代码能够快速写出require功能,主要具备的只是点是fs模块知识、new Function知识,CommonJs知识。

  1. 首先来介绍本文用到的fs模块知识

    • fs = require(‘fs’)这一句代码就是node的引入文件模块,可以进行文件操作
    • fs.readFileSync(moduleName,”utf8”);//node的读文件方法,返回读取的内容,参数为文件路径,编码格式
  2. new Function知识

    • new Function可以产生一个普通的函数fn,那么fn与Function之间有什么关系呢?

      • new Funtion中最后一个参数,就是fn的函数执行体
      • new Funtion中其余参数,为new Funtion中最后一个参数的参数,也就是fn函数执行体的参数
      • new Funtion所有的参数都为字符串
            //举一个简单的例子
            function(a,b){
                return a+b;
            }
            //就可以写成
            let fn = new Function('a','b','return a+b'); 
        
  3. CommonJs知识点

    CommonJs是一种js模块化规范。
    核心思想是通过‘require’方法来同步加载依赖的其他模块,通过‘module.exports’到处需要暴露的接口

    • 采用CommonJs导入及到处的代码如下:
    • 导入

      let str = require('./a.js');
      console.js(str);//'欢迎光临'
    • 导出a.js文件

      module.exports = '欢迎光临';

那么,具备了以上知识之后,就可以写出以下代码阿里实现require功能了!!!

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

/*
    原生js实现require功能
        - fs模块  文件操作

*/
let fs = require('fs');//node的文件模块,可以进行文件操作
function requireCustom(moduleName){
    /*
        moduleName 要读的文件的路径
    */
    let content = fs.readFileSync(moduleName,"utf8");//node的读文件方法,返回读取的内容,参数为文件路径,编码格式
    // console.log(content);
    /*
        new Function(),最后一个参数是函数的执行体,前面其余都是最后这个执行体参数的参数,所有参数都是字符串格式
    */
    let fn = new Function("exports",'module','require','__dirname','__filename',content + "\n return module.exports");

    let module = {
        exports:{}
    }
    return fn(module.exports,module,requireCustom,__dirname,__filename);
    /*
        上面的函数其实就是:
            function(exports,module,require,__dirname,__filename){
                module.exports = "欢迎你";
                return module.exports;
            }

    */
}

let str = requireCustom('./a.js');
console.log(str);//‘欢迎你’