这部分主要总结深入浅出Node.js的第二章

 一)CommonJs

    1.1CommonJs模块定义

  二)Node的模块实现

    2.1模块分类

    2.2 路径分析和文件定位

      2.2.1 路径分析

      2.2.2 文件定位

    2.3 模块编译

      2.3.1 javascript模块编译

      2.3.2 exports和module.exports

  三)前后端共用的模块

    3.1 前后端侧重点

    3.2 AMD和CMD

    3.3 兼容多种模块规范  

一) CommonJs  在CommonJs的官网上写着这样一句话 javascript:not just for browsers any more  CommonJs是一种规范,它涵盖了模块.二进制.Buffer.文件系统.包管理等,node就是借鉴了CommonJs的Modules规范实现了一套非常易用的模块系统

  1.1 CommonJs模块的定义  主要分模块引用.模块定义.模块标识  CommonJs的模块导入导出机制可以使用户不必考虑变量污染等问题

/*模块引入*/
var math = require("math"); /*模块标识 传递给require的参数*/
/*模块定义*/
exports.add = function(a,b) {
return a + b;
}

二)Node的模块实现   在Node中对规范进行了一定的取舍,也增加了一定自身需要的特性 node中引入模块主要分为3个步骤

  1. 路径分析
  2. 文件定位
  3. 编译执行

  2.1 Node中的模块分类  在node中模块分为两类 Node提供的模块,核心模块. 用户编写的模块,文件模块

  • 核心模块 在node的源代码编译的过程中被编译进了二进制执行文件,在node进程启动的时候,部分的核心模块被直接加载到内存,所以引用这部分模块不需要文件的定位和编译执行,并且在路径分析中优先判断,所以加载速度最快
  • 文件模块  运行时动态的加载,需要完成的路径解析,文件定位,编译执行过程,加载速度相对较慢    

无论是核心还是文件模块 Node都会采用缓存优先的策略,不同于浏览器中缓存的是文件,Node中缓存的是编译和执行之后的对象

  2.2 路径分析和文件定位

    2.2.1 路径分析 node中根据require()中传入的标识符,来进行模块的查找和定位,对不同类型的标识符查找定位的方式会有一些区别  标识符只要分为下面几类

  1. 核心模块(核心模块的优先级的优先级仅次于缓存加载,在Node的源代码的编译过程中已经被编译成了二进制的代码,加载过程最快 无法加载与核心模块相同标识符的自定义模块,只能通过其他的方式加载与核心模块相同标识符的自定义模块)
  2. 绝对路径或者相对路径的文件模块(通过将相对路径和绝对路径转换成真实路径,并且以真实路径作为索引,将编译后的结果放到缓存中,由于指明了确切的文件位置,所以其加载速度慢于核心模块)
  3. 非路径形式的文件模块,通常为自定义模块(当前文件目录下的node_modules  父目录下的node_modules 父目录的父目录下的node_modules  沿路径向上逐级递归,直到根目录的node_modules   很像原型链的查找 所以自定义模块的查找速度最慢)       

    2.2.2 文件定位

  • 文件的扩展名分析 CommonJs中允许在标识符中不包含扩展名,这种情况下Node会按照.js,.node,.json的次序补足扩展名 在require的时候,是同步阻塞的判断文件是否存在的,此时加入你确定需求的文件的扩展名字是.node,.json,在require的时候补足扩展名,能加快一下访问速度
  • 目录分析和包  如果你通过require()的标示符查找到一个目录,Node会将这个目录当做包处理 Node会在当前的目录下查找package.json文件,通过JSON.parse()解析出包描述对象,从中读取出main属性执行的文件进行定位,如果该文件不存在扩展名,则进入扩展名解析的步骤 如果main执行的文件错误或者不存在package.json文件,Node会将index当做默认的扩展名,然后依次的查找index.js,index.json,index.json
  • 如果在通过上面的方式仍然没有定位到相应的文件或者模块,则上升到下一个模块路径进行查找    

  2.3 模块编译  在node中文件模块都是对象.类似下面的定义 在定位到具体的文件后,node会创建一个模块对象,然后载入和编译

  

function Module(id,parent) {
this.id = id;
this.exports = {};
this.parent = parent;
if(parent && parent.children) {
parent.children.push(this);
}
this.filename = null;
this.loaded = false;
this.children = [];
}

  在引入模块的时候,对不同扩展名的文件node的载入方式也不同

  • .js 通过fs模块同步读取文件后编译执行
  • .node C++编写的扩展文件,通过dlopen()方法加载最后编译生成的文件  (.node模块是通过C/C++编译后生成的,所以只有加载和执行的过程,C/C++模块的优势是执行效率更高但相对于javascript模块来说开发门槛更高)
  • .json 通过fs模块同步读取文件后,用JSON.parse()解析返回结果
  • 其余扩展名 都会当做.js文件载入

  2.3.1 javascript模块编译 

    在编译的过程中,node会对获取到的内容进行封装 类似于下面的样子

(function(exports,require,module,__filename,__dirname){
/**
* 你的js代码
*/
})

这样模块之间就进行了作用域的隔离 然后通过vm原生模块的runInThisContext()方法执行返回一个function对象 然后将之前的模块对象的exports,require()方法,module,文件路径等信息传入给函数执行,执行之后将exports属性返回给调用方,并且将编译后的结果根据路径索引缓存到Module._cache上

  exports和module.exports

    简单理解就是exports是module.exports的引用 具体看 exports和module.exports的区别

三)前后端共用的模块

  3.1 前后端侧重点

  • 浏览器端的javascript需要从同一个服务器分发到客户端,受限于带宽,读取速度慢
  • 服务器端的javascript是相同的代码需要多次的执行,受限于CPU和内存,后端代码直接从硬盘中读取加载速度快
  • node中模块的引入是同步的,但浏览器中同步的方式不可行    

  3.2 AMD和CMD规范

  • AMD模块定义的方式如下,它是CommonJs规范的一个延伸
define(id?,dependencies?,factory)

这里的factory就是实际代码的内容  在AMD中需要显示的定义一个模块,在node中这个过程是隐式包装

  • CMD CMD在引入的时候支持动态引入  

  3.3 兼容多种模块规范

;(function(name,definition){
var hasDefine = typeof define === 'define',
hasExports = typeof module !== 'undefined' && module.exports;
if(hasDefine) {
//AMD CMD
define(definition);
} else if(hasExports){
//node环境
module.exports = definition()
} else {
//挂在在window
this[name] = definition();
}
})(name,function(){
var obj = {};
retuen obj;
});

深入浅出node(2) 模块机制的更多相关文章

  1. Nodejs:Node.js模块机制小结

    今天读了<深入浅出Nodejs>的第二章:模块机制.现在做一个简单的小结. 序:模块机制大致从这几个部分来讲:JS模块机制的由来.CommonJS AMD CMD.Node模块机制和包和n ...

  2. 深入浅出Node.js---Connect模块解析 。转载

    文章地址:https://blog.csdn.net/zhangyuan19880606/article/details/51509205 1 Connect模块背景 Node.js的愿望是成为一个能 ...

  3. Node总结 模块机制

    1. Node中的模块分为两类.一个是node提供的模块,称为核心模块,如http, fs, path:另一类是用户编写的模块,称为文件模块. 2. require()方法接收一个标识符进行模块查找. ...

  4. 一个月时间整理《深入浅出Node.js》

    今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在 ...

  5. 浅谈NodeJs的模块机制

    J历史 我们都知道,js在刚被创建的时候,只是为了在网页上写一些小脚本而已,比如网页特效,表单验证等等,创立者也许没觉悟到以后的js会发展到如此规模.这是web1.0时代. 在web 2.0时代,各种 ...

  6. 《深入浅出Node.js》第2章 模块机制

    @by Ruth92(转载请注明出处) 第2章 模块机制 JavaScript 先天缺乏的功能:模块. 一.CommonJS 规范: JavaScript 规范的缺陷:1)没有模块系统:2)标准库较少 ...

  7. 深入浅出Node.js (2) - 模块机制

    2.1 CommonJS规范 2.1.1 CommonJS的出发点 2.1.2 CommonJS的模块规范 2.2 Node的模块实现 2.2.1 优先从缓存加载 2.2.2 路径分析和文件定位 2. ...

  8. Node.js入门:模块机制

    CommonJS规范      早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来 ...

  9. 【读书笔记】《深入浅出nodejs》第二章 模块机制

    1.什么是模块? 指在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位:或指大型软件系统的一部分. ----<百度百科> 2.JavaScr ...

随机推荐

  1. CentOS7之按时间段截取指定的Tomcat日志到指定文件的方法

    CentOS7之按时间段截取指定的Tomcat日志到指定文件的方法 sed -n '/2016-11-02 15:00:/,/2016-11-02 15:05:/p' catalina.out > ...

  2. Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决

    PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...

  3. .NET开源进行时:消除误解、努力前行(本文首发于《程序员》2015第10A期的原始版本)

    2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET ...

  4. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  5. 2016年我们重新思考移动互联网创业的风险, 微信还是APP?

    感觉这两年前端开发又火起来了,很多做内容创业和做微电商创业的人,往往都选择了运营微信号.对于做纯技术开发的人来说,一般是看不上微信号的,感觉没什么技术含量,或者说没什么技术壁垒.也有另一批人观点相反的 ...

  6. CSharpGL(20)用unProject和Project实现鼠标拖拽图元

    CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...

  7. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

  8. 苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转

    昨天下午,测试提了一个bug,问题是:在苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转. 思前想后找了半天没思路,后来经过同事的点拨,说可能是禁用了cookie之类的,反正我也没思路就顺 ...

  9. select,epoll,poll比较

    介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...

  10. mongodb全套配置

    1,下载&安装 MongoDB 提供了centos yum安装方式. 参考:http://docs.mongodb.org/manual/tutorial/install-mongodb-on ...