笔者在学习node的时候,突然想到如何自己写一个require,于是就有了这篇文章。
10行代码能够快速写出require功能,主要具备的只是点是fs模块知识、new Function知识,CommonJs知识。
-
首先来介绍本文用到的fs模块知识
- fs = require(‘fs’)这一句代码就是node的引入文件模块,可以进行文件操作
- fs.readFileSync(moduleName,”utf8”);//node的读文件方法,返回读取的内容,参数为文件路径,编码格式
-
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');
-
-
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);//‘欢迎你’