理解node中的require和exports
来源:互联网 发布:blct升级数据 编辑:程序博客网 时间:2024/06/05 20:59
js模块的实现
node中模块的实现,其实是依赖于闭包的,也就是说,module,exports其实都是外部传入的参数,这个简化形式如下:
function NativeModule(id){ this.id=id; this.filename=id+".js"; this.exports={};}NativeModule.require=function(id){ var module=new NativeModule(id); module.compile(); return module.exports();};NativeModule.prototype.compile = function() { //第一种自执行函数 ( function(exports, require, module, filename, dirname) { exports=module.exports=function(){alert(this.id)}; } (this.exports, NativeModule.require, this, this.filename) ); //第二种自执行函数 //( // function(exports, require, module, filename, dirname) // { // exports=module.exports=function(){alert(this.id)}; // } // )(this.exports, NativeModule.require, this, this.filename)};NativeModule.require("我是id")
(附:上面的代码可以复制出来直接在控制台运行)
通过上面的代码我们惊奇的发现,其实我们看见的模块文件的代码,一般而言都是类似
exports=module.exports=function(){alert("leexiaosi")};
同时我们也就明白,为什么在模块文件中用var定义的变量都是私有的了。这里关键点就是
NativeModule.prototype.compile
这个函数的实现。为了方便理解,我们设上面的自执行函数
var fnImport=function(exports, require, module, filename, dirname)
那么,根据闭包的原理,这个函数在执行时,其[[scope]]会记录fnImport这个函数定义的作用域的各个变量,
- fnImport函数中的形参值,即this.exports, NativeModule.require, this, this.filename
- fnImport函数中function声明的函数
- fnImport函数中通过var声明的变量
- fnImport函数的父函数的作用域[[scope]]
fnImport这个函数对其fnImport.[[scope]]的操作都是有权限的。故this.exports会被更改,尽管在NativeModule的构造函数中this.exports的定义是空对象。
事实上的NativeModule的实现要比这个复杂得多,尽管一般而言,非核心模块加载都是依赖于module这个模块,但是,module的实现模块加载的基本思想也是这样,只是module中增加了模块的检索功能。而模块文件中,require正是NativeModule.require这个函数。从return module.exports()来看,require初次加载模块时候必然是阻塞的(初次加载之后会被缓存,所以加载之后再require就不是阻塞的了
阅读全文
0 0
- 理解node中的require和exports
- Node.js, Require 和 Exports
- Node.js模块 require和 exports
- Node.js模块 require和 exports
- Node.js模块 require和 exports
- Node.js exports 和 require 两个对象
- Node.js模块 require和 exports
- Node.js模块 require和 exports
- Node.js模块 require和 exports
- node中的exports和module.exports
- node中的global、exports和module.exports
- javascript 中的require /exports 和import/export
- 理解 module.exports和node.js的exports
- Node.js中的module.exports和exports的区别
- require中exports和module.exports
- (译)Node.js, Require 与 Exports
- node.js中的exports
- Node.j: exports 和 module.exports
- Android实现掌盟战绩图(矩形进度条)
- 解决Redis服务错误一例听语音
- lintcode 3:统计数字
- Android中TextView实现富文本展示效果
- java
- 理解node中的require和exports
- coursera Machine Learning 第六周 测验quiz2答案解析 Machine Learning System Design
- 快速幂取模
- java大数据
- PHP入门-变量声明与使用
- 新老系统迁移及整合方案
- 数据结构之归并排序(java)
- linux CentOS 7 安装 java1.8
- Android网络请求-sign参数的设置