var math = require('math');
[!NOTE]
上下文提供exports对象用于导出当前模块的方法和变量,而且他是惟一的导出出口前端
exports其实是module.exports,而module.exports就是以一个暴露给外部的对象。node
// a.js module.exports = { a: 1 } // or exports.a = 1 // b.js var module = require('./a.js') module.a // -> log 1
var module = require('./a.js') module.a // 这里其实就是包装了一层当即执行函数,这样就不会污染全局变量了, // 重要的是 module 这里,module 是 Node 独有的一个变量 module.exports = { a: 1 } // module 基本实现 var module = { id: 'xxxx', // 我总得知道怎么去找到他吧 exports: {} // exports 就是个空对象 } // 这个是为何 exports 和 module.exports 用法类似的缘由 var exports = module.exports var load = function (module) { // 导出的东西 var a = 1 module.exports = a return module.exports }; // 而后当我 require 的时候去找到独特的 // id,而后将要使用的东西用当即执行函数包装下,over
在Node中引入模块,须要经历3个步骤json
在node中,模块分为两类:一类是node提供的模块称为核心模块,一类是用户编写的成为文件模块。后端
核心模块在编译中编译成了二进制文件。在Node进程启动时,部分核心模块就被直接加载入内存。因此这部分核心模块引入时就省了文件定位和编译执行这两个步骤,而且在路径分析中优先判断,它的加载速度是最快的。缓存
文件模块是运行时动态加载。须要完整的路径分析、文件定位、编译执行网络
Node对引入的模块都回进行缓存,并且缓存的是编译执行后的对象。异步
不论是核心模块仍是文件模块,require()都一概采用缓存优先的方式。函数
[!NOTE]
每个编译成功的模块都会将其文件路径索引缓存在Module._cache对象上,以提升二次引入性能性能
[!NOTE]
在编译的过程当中,Node对获取的JS文件进行了头尾包装。这也是每一个模块都能访问到 require、exports、module、__filename、__dirname的缘由ui
(funciton(exports, require, module, __filename, __dirname) { /* 本身写的代码 */ });
这样使得模块文件间都进行了做用域隔离,不用担忧变量污染全局。
为moudle.exports赋值,exports对象是经过形参的方式传入,直接赋值形参会改变形参的引用,但并不能改变做用域外的值。
exports = function() { // my class } var change = function(a) { a = 100; } var a = 10; change(a); console.log(a); // => 10
若是要达到require引入一个类的效果,请赋值给 module.exports对象。这个迂回的方案不改变形参的引用。
Node调用process.dlopen()方法进行加载和执行。
实际上 .node模块并不须要编译,由于它是编写C/C++模块以后编译生成的,因此这里只有加载和执行的过程。在执行的过程当中,模块exports对象与.node模块产生练习,而后返回给调用者。
[!NOTE]
Node的核心模块在编译成可执行文件的过程当中被编译进了二进制文件。核心模块其实分为C/C++编写的和Javascript编写的两部分,其中C/C++文件存放在Node项目的src目录下,Javascript文件存放在lib目录下。
C/C++拓展模块
模块调用栈
先后端公用模块
前端瓶颈在于带宽,后端瓶颈在于CPU和内存等资源。前端须要经过网络加载代码,后端则从磁盘加载,两者加载速度再也不同一量级上。
node的模块引入几乎都是同步的,但前端模块如果也采用同步方式来引入必会在用户体验上形成很大的问题,即UI初始化实际过长
Asynchronous Moudle Definition “异步模块定义”, AMD须要在声明的时候指定全部的依赖,经过形参传递依赖到模块内容中。
定义以下
define(id?, dependencies, factory);
与AMD主要区别在于定于模块与依赖引入部分。
CMD支持动态引入
define(funtion(require, exports, moudle) { // The module code goes here })