Node.js教程 模块加载机制
沉沙 2018-10-31 来源 : 阅读 1610 评论 0

摘要:本篇教程介绍了Node.js教程 模块加载机制,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

本篇教程介绍了Node.js教程 模块加载机制,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

<

 
你真的了解require函数吗?
看似简单的require函数, 其实内部做了大量工作。。。下面我们将详细说明require为我们所做的一切
 
nodejs模块加载原理
node加载模块步骤:
  1) 路径分析 (如判断是不是核心模块、是绝对路径还是相对路径等)
  2) 文件定位 (文件扩展名分析, 目录和包处理等细节)
  3) 编译执行 
 
原生模块加载顺序
  1) 缓存
  2) 本地原生模块
 
文件模块加载顺序
  1) 缓存
  2) 如果是绝对路径, 则直接按路径读取并编译
  3) 如果是“/”则直接从/node_modules目录查找
  4) 如果是相对路径, 则生成如下查询规则,

[
    ‘/home/myapp/mydir/node_module‘,
    ‘/home/myapp/node_module‘   
    ‘/home/node_module‘,
    ‘/node_module‘
]

 
  5) 从上述数组中取出第一个目录作为查找对象, 如果存在结束查找
  6) 然后依次尝试添加.js、.json、.node后缀继续查找, 如果存在则结束
  7) 尝试将require参数作为一个包查找, 读取目录下的package.json文件, 取得main参数指定的文件
  8) 根据指定的文件未找到, 如果没有,执行第6步
  9) 如果main参数不存在或者第8步未找到, 则查找该目录下index文件, 如果没有, 执行第6步
  10) 如果依然没有找到, 则开始取出数组第二条路径, 然后执行5-7步。 直到数组中最后一个值
  11) 如果还没找到, 抛出异常
 
至此, 文件终于找到了。。。然后呢?找到后该做什么呢?
也许有的人早就发现一个问题, require函数是哪里来的呢?模块中明明没有定义啊, 为什么就能使用了呢? 
有的同学马上回答说, 它是个全局的。。。全局的?那这个所谓全局的又在哪定义的呢? 额。。。不知道。。。
 
require到底哪里来的呢?
上面我们已经经过重重困难终于找到了我们的文件, 下一步就是我们的编译
node针对不同后缀的文件分类编译
1) .js文件的编译
  .js文件的编译源码比较复杂, 其最终编译后会包装成如下结构

(function (exports, require, module, __filename, __dirname) {
    var math = require(‘math‘);
    exports.area = function(radius) {
       return Math.PI * radius * radius;
    }
})

  现在知道为什么有require, exports, module这些函数或对象了吧。。。
 
2) .json文件的编译
  .json的文件最为简单, 其实就是调用JSON.parse。下为node源码

Module._extensions[‘.json‘] = function(module, filename) {
  var content = fs.readFileSync(filename, ‘utf8‘);
  try {
    module.exports = JSON.parse(internalModule.stripBOM(content));
  } catch (err) {
    err.message = filename + ‘: ‘ + err.message;
    throw err;
  }
};

 
3) .node文件的编译
  .node是c/c++模块, 在此不深究, 只附上源码

Module._extensions[‘.node‘] = function(module, filename) {
  return process.dlopen(module, path._makeLong(filename));
};

     

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注WEB前端Node.js频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved