felayman---nodejs的几种模块加载方式

nodejs的几种模块加载方式

一.直接在exports对象中添加方法

1.首先创建一个模块(module.js)module.js

exports.One = function(){
	console.log('first module');
};

2.load.js

var module  =require('./module');
module.One();

这样我们就可以在引入了该模块后,返回一个exports对象,这里是指module对象,其实都只是两个引用或者句柄,只是都指向了同一个资源,在load.js里,module的名字可以是任意取的,因为它仅仅是指向require(‘./module‘);返回后的一个实例对象的引用,在load.js文件里的module和在module.js里的exports对象是同一个东西.因此上述两个文件可以用一个文件来表示:

exports.One = function(){
	console.log('first module');
};
exports.One();

其运行结果是一致的,这里我们可以很清晰的看到,我们在使用require(‘./xxxx‘)后其实返回的总是在xxxx.js文件中的exports对象的引用,这个引用的名字我们可以任意取,但是为了规范我们还是最好取符号某些非标准规定(后面说道),但是这样会有不妥的地方,因为它是始终指向exports的实例对象,也就是说,我们虽然有了这个模块,但是这个模块我们只能使用一次,这取决于rquire(‘./module‘)只会加在一次该模块.比如我们修改上述代码,

module.js

var name ;
exports.setName = function(oName){
	name = oName;
};
exports.getName  = function(){
	console.log(name);
};

load.js

var module1  = require('./module');
module1.setName("felayman1");
module1.getName();
var module2  = require('./module');
module2.setName("felayman2");
module2.getName();
module1.getName();

我们可以看到,虽然我们使用了两次require(‘./module‘);,但是当我们修改module2后,module1的内容也被修改,这恰恰说明了,module1和module2是指向的同一个对象.有时候这并不影响我们的程序,但是如果我们的module是Person呢?我们希望我们require(‘./person‘)后返回的是不同的对象.因此,这种方式是有缺陷的,尽管很方便,这种方式在大部分nodejs的模块中都是很常见,比如fs模块,http模块等.

二.将模块中的函数挂载到exports对象的属性上

person.js

<span style="font-family:Courier New;font-size:18px;">function Person{
<span style="white-space: pre; ">	</span>var name;
<span style="white-space: pre; ">	</span>this.setName = function(theName){
<span style="white-space: pre; ">		</span>name = theName;
<span style="white-space: pre; ">	</span>};
<span style="white-space: pre; ">	</span>this.sayHello = function(){
<span style="white-space: pre; ">		</span>console.log('Hello',name);
<span style="white-space: pre; ">	</span>};
}
exports.Person = Person;</span><span style="font-size:24px;font-family: 'Microsoft YaHei'; ">
</span>

load.js

var Person  = require('./person').Person;
var person1 = new Person();
person1.setName("felayman1");
person1.sayHello();
var person2 = new Person();
person2.setName("felayman2");
person2.sayHello();
person1.sayHello();

这样我们可以看到,我们就可以引入一个函数了,我们把在person.js文件中的Person函数设置为eports对象的一个属性,我们只需要在load.js文件中引入该属性,就可以获取到多个该函数的实例,在nodejs中的EventEmitter就是基于这种方式,但是这样我们总是在使用 require(‘./person‘).Person;这样的写法有点太复杂,因此nodejs允许我们使用其他更简洁的方式,利用全局变量--module,这样我们在其他文件中引入其他模块的时候,就更方便了.

三.利用全局变量module

person.js

<span style="font-family:Courier New;">function Person(){
	var name;
	this.setName = function(theName){
		name = theName;
	};
	this.sayHello = function(){
		console.log('Hello',name);
	};
}
// exports.Person = Person;
module.exports = Person;
</span>

load.js

var Person  = require('./person');
var person1 = new Person();
person1.setName("felayman1");
person1.sayHello();
var person2 = new Person();
person2.setName("felayman2");
person2.sayHello();
person1.sayHello();

这样一修改,我们就在使用require函数的时候就方便了,如果觉得这里难以理解,我们可以把两个文件里语法放到一起:

var Person  = require('./person');
module.exports = Person;

这样,我们就可以看出,其实就是这样

var Person =  Person.  

因为上述我们都已经说过,require(‘./person‘)其实就是module.exports 对象的,这里的module我们不用太在意,就跟javascript中的window一样,是一个全局变量,即module.exports =exports就类似于window.alert()
=alert()差不多的效果,这样我们就能看出,我们再次使用require(‘./person‘)的时候其实就是导入了我们所需要的exports对象的属性函数模板了,这样我们也可以多次实例化我们所需要的对象了.这种方式是综合了前两种的方法,因此也是官方推荐的使用方法.

felayman---nodejs的几种模块加载方式,布布扣,bubuko.com

时间: 2024-08-09 19:51:57

felayman---nodejs的几种模块加载方式的相关文章

EF的三种数据加载方式

EF中有3种数据加载方式,具体如下: 延迟加载(默认): 设置导航属性为virtual 贪婪加载:不设置导航属性为virtual,并且对导航属性使用Include 显示加载:不设置导航属性为virtual,并且对导航属性使用Reference(单个对象).Load()或Collection(对象集).Load() public class Programm { public static void Main() { TestDbContext db = new TestDbContext();

深入浅出nodejs(一) 模块加载机制

声明: 深入浅出nodejs系列文章将会在后面持续更新. 该系列文章部分参考 朴灵<深入浅出nodejs>,并加以总结补充 你真的了解require函数吗? 看似简单的require函数, 其实内部做了大量工作...下面我们将详细说明require为我们所做的一切 nodejs模块加载原理 node加载模块步骤: 1) 路径分析 (如判断是不是核心模块.是绝对路径还是相对路径等) 2) 文件定位 (文件扩展名分析, 目录和包处理等细节) 3) 编译执行 原生模块加载顺序 1) 缓存 2) 本地

浅谈js模块加载方式(初级)

1.简介:  前端模块化开发日渐鼎盛,如何将零散的插件或者是普通的js脚本文件统一管理及引用,是众多开发者共同的目标.本人是从事.net开发的,最近对前端的一些东西特别的感兴趣,也会尝试的夹杂一点自己的想法,写一些小东西.东西不牛逼,但是感觉用起来还是方便那么一点的.下面就展示一下简短的小代码. 2.中心思想:通过外部调用事先封装好的模块加载方法,传入参数(包括主目录及模块js或者css的目录 ),在程序运行的同时,会动态的将相应的css或者是js代码追加引用到head标签内,这样,就可以使用被

springboot(一) 三种热加载方式

参考博客:开发常用的热部署方式汇总 热加载方式有三种: Spring Loaded spring-boot-devtools JRebel插件 原文地址:https://www.cnblogs.com/rouqinglangzi/p/9503246.html

imageNamed , imageWithContentsOfFile , initWithContentsFile 三种图片加载方式的区别

UIImage常用的加载图片有3种方式: imageNamed , imageWithContentsOfFile , initWithContentsFile .imageNamed:UIImage image = [UIImage imageNamed:@"image.gif"] . 得到的对象是autoRelease的.这个方法有点特殊,它在生成image对象的同时,会把图像数据 根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能.即使

JavaScript之:模块加载程序的历史与背景

原文:History and Background of JavaScript Module Loaders 作者:Elias Carlston 翻译:leotso 介绍 Web 应用程序的应用程序逻辑不断从后端移到浏览器端.但是,由于富客户端 JavaScript 应用程序的规模变得更大,它们遇到了类似于多年来传统应用所面临的挑战:共享代码以便重用,同时保持架构的隔离分层,并且足够灵活以便于轻松扩展. 这些挑战的一个解决方案是开发 JavaScript 模块和模块加载系统.这篇文章将着重于比较

模块加载规范对比

一.commonJS模块加载规范 CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作.由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用.浏览器端一般采用AMD模块加载方式或者ES6的模块加载标准. 模块导出方法(为防止混淆,建议一律采用module.exports而非exports): 模块导入方法:利用require //文件a.js module.exports

浅谈Entity Framework中的数据加载方式

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx,其中的一系列文

nodejs js模块加载

nodejs的非核心模块(core module)加载主要使用的就是module.js. 项目主模块(index.js/main.js等)加载使用的应该是module.js中的runMain(),其他js模块加载流程基本上是: 1,获取js文件信息: 2,new Module(): 3,读取js文件内容,封装到一个function中,同时注入module本身,module.exports,包装过的require函数等变量: 4,在某个上下文环境中执行这个封装后的function: 5,返回mod