如何加载Nodejs模块

JavaScript08

如何加载Nodejs模块,第1张

nodejs的几种模块加载方式

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

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

exports.One = function(){

console.log('first module')

}

2.load.jsvar 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.jsvar 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

function Person{

var name

this.setName = function(theName){

name = theName

}

this.sayHello = function(){

console.log('Hello',name)

}

}

exports.Person = Person

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

function Person(){

var name

this.setName = function(theName){

name = theName

}

this.sayHello = function(){

console.log('Hello',name)

}

}

// exports.Person = Person

module.exports = Person

load.jsvar 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对象的属性函数模板了,这样我们也可以多次实例化我们所需要的对象了.这种方式是综合了前两种的方法,因此也是官方推荐的使用方法.

同学很简单的,如下操作。

1.一些购买的模板是可以改变的可变图片区域。一般就是这个按钮和对话框,可以在模板的特定模块中找到替换图片。

2.但是,固定背景、边框和标题栏中使用的一些图片无法修改,因为模板制作者将它们封装在固定图片区域中。

3.如果需要修改某一张图片,可以咨询模板制作人,他们最后能给出最准确的答案。

4.原则上不使用黑科技是不能修改买来的模板的。其实就算是已经上线的模板,xml也是不能再编辑的。所以加功能肯定不行(淘宝模板php,php,css都可以改)。一般买家只能通过模板后台已有的功能来更改东西。买的模板的代码不能自己改。

5.自己写代码做模板去应聘设计师就行了。只用简单的php知识,xml,css,html。如果不是js模板,js就不要了。淘宝有很多内置组件,随便叫。

安装requirejs

requirejs官方提供了一个可用于node的适配器 r.js 。有两种方法可以在项目里面加入此库。

1. npm

在具体项目目录下使用如下命令来引入requirejs:

npm install requirejs

windows环境下安装需要注意不要加上 -g 全局开关,否则不能正常安装。

安装完成后,可使用 require('requirejs') 来加载requirejs。

2. 下载r.js

如果不想使用npm,也可以直接下载r.js,并把它放到项目中达到同样的目的。

点击下载。

在项目中通过 require('/path/to/r.js') 来加载requirejs。

配置

配置requirejs

var requirejs=require('requirejs')

requirejs.config({

//把node自身的require方法传递给requirejs

nodeRequire: require

})

requirejs(["foo","bar"],function(foo,bar){})

在需要使用requirejs的地方可以用上面的代码来配置requirejs。首先加载requirejs模块,命名为 requirejs (可以为其他命名)。然后对 requirejs 进行配置。配置的方法和参数可以参照浏览器版本的requirejs的 配置说明 。不过有一点不同,如代码所示,我们需要把node的 require 方法引进来。最后一行是简单地加载模块的示例,requirejs会尝试把 foo 和 bar 两个模块当成AMD模块来加载,如果失败,则会调用node的 requie 方法来把它们当作commonjs模块加载。为了实现这样的适应性,所以我们需要配置node的 require 方法。但实际测试并不尽如人意,保险起见,还是对AMD模块使用 requirejs 加载,对commonjs模块使用 require 加载。

构造AMD格式的node模块

在node中定义的模块是commonjs模块,如果想要构造AMD模块,我们需要 amdefine 这个包。

安装amdefine

同样,可以使用npm进行安装,在项目目录下执行:

npm install amdefine

在windows下也存在无法全局安装的问题,需要对项目单独安装。

定义define方法

if(typeof define !== 'function'){

var define=require('amdefine')(module)

}

amdefine提供了包装AMD模块的 define 方法。不过上面代码中对于node中是否包含define方法的检测判断请保留,最好原封不动地将这几行拷贝到自己的项目中。这样,我们就可以像使用前端requirejs一样,定义和使用AMD模块。

将node自己的common模块转换为AMD模块

原本想通过引用`amdefine`包来实现node端AMD模块的定义,不过requirejs本身定义了`define`方法,不必额外引入其他包。