首先来介绍本文用到的 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);//'欢迎你'
来源: https://www.2cto.com/kf/201808/766164.html