请选择 进入手机版 | 继续访问电脑版

我爱科技论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 283|回复: 3

[技术分享] 【Nodejs学习】NodeJS实现的原理代码分析

[复制链接]

696

主题

743

帖子

6875

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6875

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 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

主题

7

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2019-1-23 12:46:27 | 显示全部楼层
路过~

点评

666  发表于 2020-3-13 16:46
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
回复

使用道具 举报

3

主题

23

帖子

51

积分

注册会员

Rank: 2

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

使用道具 举报

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

本版积分规则

微信扫一扫

快速回复 返回顶部 返回列表