深入浅出node(2) 模块机制

  一)CommonJs

    1.1CommonJs模块定义

  二)Node的模块实现

    2.1模块分类

    2.2 路径分析和文件定位

      2.2.1 路径分析

      2.2.2 文件定位

    2.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 模块编译

    

  

时间: 2024-10-20 23:56:03

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

Node.js 模块机制及常见面试问题解答

Node.js 模块机制采用了 Commonjs 规范,弥补了当前 JavaScript 开发大型应用没有标准的缺陷,类似于 Java 中的类文件,Python 中的 import 机制,Node.js 中可以通过 module.exports.require 来导出和引入一个模块. 在模块加载机制中,Node.js 采用了延迟加载的策略,只有在用到的情况下,系统模块才会被加载,加载完成后会放到 binding_cache 中. 面试指南 require的加载机制?,参考:模块加载机制 modu

nodejs从0到1(Node简介+模块机制)

1.nodejs简介: 1.Node不是js应用,而是js运行平台.客户端js通过浏览器和v8引擎联系到了一起,服务器端js用Node和v8又牵起了小手,所以说Node是运行平台,类似于客户端的浏览器.Node采用c++语言编写,v8引擎也是c++写的.Node为神马用c++写呢?这是个有趣的故事,详见<深入浅出Nodejs>. 2.模块机制: 说模块机制之前,先说下CommonJS.CommonJS是一种规范.原来js规范比较薄弱,不利于js大规模应用:主要有以下的缺陷: 2.1:js没有模

node的模块机制

Node.js模块的实现 之前在网上查阅了许多介绍Node.js的文章,可惜对于Node.js的模块机制大都着墨不多.在后续介绍模块的使用之前,我认为有必要深入一下Node.js的模块机制. CommonJS规范 早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来实现的,在这样的背景之下,一没有特色,二没有实用价值.但是随着JavaScript在前端的应用越来越广泛,以及服务端J

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

今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议 有一定Node基础或者做过Node方面的小项目的同学阅读,看完以后你的思维会有很奇特的碰撞,我看的时候就常常会有这样的想法:“哦,原来这个功能是 这样实现的哦”.下面这篇文章是我第二次阅读<深入浅出Node.js>的一些学习记录,并且通过百度脑图这个工具来画出思维导图,每天将自

深入浅出node读书笔记(三)

介绍完了node的模块机制,现在来说说node的一个非常有名的特色:异步I/O. (1)首先我们先要了解一下node自身的执行模型:事件循环.它使得回调函数十分普遍.在启动进程的时候,node创建一个类似于while(true)循环的循环体,每执行一次循环体我们成为一次tick.每个tick的过程就是查看是否有事件需要处理,如果有就看它是否有关联的回调函数,如果有,就执行回调函数,没有就进入下一个循环.直到没有事件为止,就退出流程. 此外,每个事件循环均有一个或者多个观察者,node可向其询问是

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

2.1 CommonJS规范 2.1.1 CommonJS的出发点 2.1.2 CommonJS的模块规范 2.2 Node的模块实现 2.2.1 优先从缓存加载 2.2.2 路径分析和文件定位 2.2.3 模块编译 2.3 核心模块 2.3.1 JavaScript核心模块的编译过程 2.3.2 C/C++核心模块的编译过程 2.3.3 核心模块的引入流程 2.3.4 编写核心模块 2.4 C/C++扩展模块 2.4.1 前提条件 2.4.2 C/C++扩展模块的编写 2.4.3 C/C++扩

Node.js中的模块机制

本文为读书笔记. 一.CommonJS的模块规范 Node与浏览器以及 W3C组织.CommonJS组织.ECMAScript之间的关系 Node借鉴CommonJS的Modules规范实现了一套模块系统,所以先来看看CommonJS的模块规范. CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识3个部分. 1. 模块引用 模块引用的示例代码如下: var math = require('math'); 在CommonJS规范中,存在require()方法,这个方法接受模

Node.js入门:模块机制

CommonJS规范  早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来实现的,在这样的背景之下,一没有特色,二没有实用价值.但是随着JavaScript在前端的应用越来越广泛,以及服务端JavaScript的推动,JavaScript现有的规范十分薄弱,不利于JavaScript大规模的应用.那些以JavaScript为宿主语言的环境中,只有本身的基础原生对象和类型,更多的对

node模块机制

一.node模块化机制 1.commonJS模块规范包括三部分:模块引用.模块定义.模块标识.例如: //math.js exports.add = function(){    var sum = 0;    var args = arguments;    var len = args.length;    for(var i = 0;i < len;i++){        var num = args[i];        sum += num;    }    return sum;}