Node学习笔记之模块实现
一、模块分类
- 由Node提供的模块,称为核心模块;部分核心模块在Node源代码的编译过程中,编译进了二进制执行文件。在node进程启动时,该部分就直接加载进内存,文件定位和编译执行的步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。
- 用户编写的模块,成文文件模块;文件模块在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速度比核心模块慢。
二、模块规范(CommonJs)
- 模块的引用
- var http = require('math');
- 在CommonJs中存在require()方法,这个方法接受模块标识,以此引入一个模块的API到当前的上下文中。
- 模块定义
- 用exports对象导出当前模块的方法或者变量,并且它是唯一导出的出口。在模块中,还存在module对象,代表模块本身,而exports是module的属性。在node中,一个文件就是一个模块,将方法挂载在exports对象上作为属性即可定义导出的方式。
//math.js exports.add = function(){
var sum = 0,
i =0 ,
args = arguments,
l =args.length;
while (i<1){
sum += args[i++];
}
return sum
} //program.js var math = require('math');//引入自定义模块(math.js) exports.increment = function(val){
return math.add(val,1);//使用模块定义的方法
};
3.模块标识
模块标识就是传递给require()方法的参数,它必须是符合小驼峰命名的字符串,或者以. 、..开头的相对路径,或者绝对路径,可以没有后缀名.js
三、 Node模块实现
实现三步骤
1.路径分析 |
通过标识符进行模块查找,分几类
加载方式和优先级
|
2.文件定位 |
注意:从缓存加载的优化策略使得二次引入是不需要路径分析、文件定位、编译执行的过程,大大提高了再次加载模块时的效率。 在文件定位的过程中,还要注意一些细节,包括文件扩展名的分析、目录和包的处理。
|
3.编译执行 |
每个文件模块都是一个对象,定位到具体文件后,Node就会新建一个模块对象,然后根据路径载入并编译。对于不同的文件扩展名,载入方法不同
每个编译成功的模块都会将其文件路劲作为索引缓存在Module._cache对象上,以提高二次引入的性能。 |
Node学习笔记之模块实现的更多相关文章
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- node 学习笔记 - Modules 模块加载系统 (2)
本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...
- node学习笔记6——自定义模块
自定义模块三大关键词: require——引入模块: exports——单个输出: module——批量输出. 从例子下手: 1.创建module.js: exports.a=22; exports. ...
- node学习笔记(二)(ajax方式向node后台提交数据)
通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...
- Python学习笔记—itertools模块
这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...
- node学习笔记3——文件操作fs
文件操作关键字: http('fs') —— 请求 node 里面的 http 模块 readFile —— 读文件,参数包括 文件名,回调函数 writeFile —— 写文件,参数包括 文件 ...
- Python学习笔记之模块与包
一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...
- node学习笔记
一.准备(github地址) 什么是Javascript? ... Javascript能做什么? ..... 浏览器中的Javascript可以做什么? 操作DOM(增删改查) AJAX/跨域 BO ...
- node学习笔记(三)
//事件驱动events //events是node最重要的模块没有之一,因为node.js本身的架构就是事件式的,而他提供了唯一的接口,所以堪称node.js事件编程的基石; //events几乎被 ...
随机推荐
- Vue 页面15分钟无操作时返回首页
这种需求手机端和pc端一般是不存在的,因为都是可以手动操作刷新的. 最近在做一个户外社区大屏的项目,因为大屏是全屏显示,没法手动刷新,不可能在页面专门做一个刷新按钮,也不好看,那这样的需求就显得格外重 ...
- CSS选择器之伪类选择器(元素)
:first-child 选择某个元素的第一个子元素(IE6不支持) :last-child 选择某个元素的最后一个子元素 :first-of-type [CSS3]选择一个上级元素下的第一个同类子元 ...
- Android Studio 使用Intent实现页面的跳转(带参数)
不管是在APP,还是在网站中,页面之间的跳转都是很常见的,本文主要讲一下在APP中,如何通过Intent实现页面的跳转. 不带参数: 写在MainActivity页面的代码: Intent inten ...
- Android技术博客精华汇总
MVC/MVP/MVVM/MVPVM 更好的架构设计 MVC,MVP 和 MVVM 的图示 http://www.apkbus.com/blog-822721-68034.html Android架构 ...
- create alter rename desc select update delete insert
conn scott/root;create table student (id number(3), name varchar2(10), sex char(2), sno number(3));a ...
- Object、String、数组的 toString() 方法和 equals() 方法及java.util.Arrays
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
- jquery validation表单验证插件。
这个是刚学的,觉得对以后挺有用的,就想把自己所学的分享一下. 校验规则: (1)required:true 必输字段 (2)number:true 必须输入合法的数字(负数,小数) (3)digits ...
- Grunt-学习。
Grunt 依赖 Node.js 所以在安装之前确保你安装了 Node.js.然后开始安装 Grunt 实际上,安装的并不是 Grunt,而是 Grunt-cli,也就是命令行的 Grunt,这样你就 ...
- swift版的元组
swift版的元组 说明 元组的内容并不多,使用的话跟普通变量类似,以下是测试源码: // // ViewController.swift // Tuples // // Created by You ...
- Linux系统清除多余的账号
清除多余的账号 注释掉/etc/passwd文件中nologin的行 grep 'nologin' /etc/passwd 注: 目前暂没想到用命令行替换,后面再想想