请选择 进入手机版 | 继续访问电脑版
查看: 159|回复: 2

【Nodejs学习】NodeJS实现的原理代码分析

[复制链接]

699

主题

740

帖子

5977

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5977
发表于 2018-9-2 12:45:30 | 显示全部楼层 |阅读模式
[JavaScript] 纯文本查看 复制代码
// 我来实现一个自己定义的require.js
function myRequire(path) {
    /**
     * 创建一个Module模块
     */
    function Module() {
        this.exports = {};
    }

    // fs模块是Node.计算提供的一个原生的用于读取文件的模块
    var fs = require('fs');
    var sourceCode = fs.readFileSync(path, 'utf-8');
    //  console.log(sourceCode);

    // 读取文件,拼接字符串
    var packSouceCode = '(function(exports, module){' + sourceCode + ' return module.exports; })';
    console.log(packSouceCode);
    // 通过eval()这个函数可以动态地执行JavaScript代码
    var packObj = eval(packSouceCode);      

    // 我自己来创建一个模块
    var module = new Module();

    console.log(typeof packObj);    // function

    // 开始动态执行我自己定义的这个require 函数( 需要把形参传递给我自定义的函数的实参)
    var executeRes = packObj(module.exports, module);
    //  输出返回的结果
    console.log(executeRes);  // 1234567, 这个函数执行的结果返回的实际上就是一个module.exports
}


//  测试, 直接会输出文件中的内容信息
var res = myRequire('./model4.js');
console.log(res);



 (function(exports, module){
    var name = 'xiuxiu';
    exports.name = name;
    module.exports = function(){
    console.log(arguments);
    } 
    return module.exports; 
})



 // 头部
var str = (function(exports, module){
    var name = 'xiuxiu';
    exports.name = name;
    module.exports = '1234567'; 
    // 尾部
    return module.exports; 
})

// 可以执行一个字符串
var res = eval(str);
console.log(res);
var obj = res('module1', 'module');
console.log(obj);



实际上NodeJS是通过require的方式间接读取文件内容,然后解析js,最后使用eval函数实现模块的加载的


[JavaScript] 纯文本查看 复制代码
// 我来实现一个自己定义的require.js
function myRequire(path) {
    /**
     * 创建一个Module模块
     */
    function Module() {
        this.exports = {};
    }

    // fs模块是Node.计算提供的一个原生的用于读取文件的模块
    var fs = require('fs');
    var sourceCode = fs.readFileSync(path, 'utf-8');
    //  console.log(sourceCode);

    // 读取文件,拼接字符串
    var packSouceCode = '(function(exports, module){' + sourceCode + ' return module.exports; })';
    console.log(packSouceCode);
    // 通过eval()这个函数可以动态地执行JavaScript代码
    var packObj = eval(packSouceCode);      

    // 我自己来创建一个模块
    var module = new Module();

    console.log(typeof packObj);    // function

    // 开始动态执行我自己定义的这个require 函数( 需要把形参传递给我自定义的函数的实参)
    var executeRes = packObj(module.exports, module);
    //  输出返回的结果
    console.log(executeRes);  // 1234567, 这个函数执行的结果返回的实际上就是一个module.exports
}


//  测试, 直接会输出文件中的内容信息
var res = myRequire('./model4.js');
console.log(res);



 (function(exports, module){
    var name = 'xiuxiu';
    exports.name = name;
    module.exports = function(){
    console.log(arguments);
    } 
    return module.exports; 
})



 // 头部
var str = (function(exports, module){
    var name = 'xiuxiu';
    exports.name = name;
    module.exports = '1234567'; 
    // 尾部
    return module.exports; 
})

// 可以执行一个字符串
var res = eval(str);
console.log(res);
var obj = res('module1', 'module');
console.log(obj);





上一篇:使用一款黑科技软件YunDownload破解百度云下载加速文件清理重复文件删除等功能
下一篇:【项目实战】MVC三层架构项目实战---网上电子图书商城管理系统
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
回复过本主题
的还回复过:

0

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2019-1-23 12:46:27 | 显示全部楼层
路过~
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
回复

使用道具 举报

3

主题

18

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2019-2-5 22:53:58 | 显示全部楼层
感谢分享
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

微信扫一扫

我爱科技论坛(www.52tech.tech)旨在打造全网最大的免费资源共享平台。目前论坛包括考研资料、编程学习、黑科技/科学上网、开源软件等资源模块,竭力服务于正在学习道路上的每一个人。我爱科技论坛,爱科技,更爱分享。致力于营造一个资源丰富、内容完善的大型网络学习交流资源共享平台!

QQ|Archiver|手机版|小黑屋|我爱科技论坛 快乐学习交流

(请勿发布违反中华人民共和国法律法规的言论,会员观点不代表我爱科技论坛的官方立场)

Powered by Discuz! X3.4© 2001-2013 Technology Inc.

返回顶部 返回列表