node 模块引入与其他语言思路相通的一些分析

151 阅读2分钟

####1、模块 新建模块: module.js

var name;
exports.setName=function(thyName){
	name=thyName;
}
exports.sayHello=function(){
	console.log('hello  '+name);
}

解析:导出俩个方法

exports.setName=...
exports.sayHello=...

调用模块: 新建文件,getModule.js

var myModule = require('./module');
myModule.setName('can');
myModule.sayHello();

解析:

引入模块
var myModule = require('./module');

调用模块里面的方法
myModule.setName('can');
...

效果:

Paste_Image.png

改造: 在调用模块中怎加代码:

var myModule = require('./module');
myModule.setName('can');
myModule.sayHello();


var myModule2 = require('./module');
myModule2.setName('lky');
myModule.sayHello();//注意这里是调用上面一个对象

调用结果:

Paste_Image.png
问题:原来的myModule被后来的变量设置方法覆盖掉了。

也就是说,不论引入多少次,module 的模型调用的始终是同一个对象。 ##2、解决调用同一对象问题: 问题所在 先从代码分析:

var name;  //这个包里面只存在一个变量  name,所以引入的包也只存在一个n变量 name
exports.setName=function(thyName){
	name=thyName;
}
exports.sayHello=function(){
	console.log('hello  '+name);
}

包引入 require 默认只会引入一次,也就是说,无论 调用多少次,如果是一个包,都会是只引入一次,这也是当初设计者的初衷(避免包的重复引入)。 所以解决方案有以下: #######1、改造包里面的代码 #######2、改变调用包的代码 #######3、改变引入包的方式(require){不可取,违反设计初衷} 现在来改造包里面的代码 新建objModule.js

function student(){
	var name;
	this.setName =function(thyName){
		name = thyName;
	}
	this.sayHello=function(){
		console.log('hello '+ name);
	}

}
module.exports=student;//暴露接口

如果有其他语言基础的同学,可以将 student理解为一个对象。详情请看js的高级视频。通过 function student() 定义一个对象。 调用包的代码: getObjModule.js

var student = require('./objModule');
var stu1=new student();//实例化对象
stu1.setName('can');
stu1.sayHello();


var stu2=new student();//实例化对象
stu2.setName('lky');
stu1.sayHello();
stu2.sayHello();

这样问题就解决了。

Paste_Image.png

重新再看一边,有木有很熟悉的赶脚,思路是否似曾相识。都是通过或以下步骤: ######*1、新建对象类(js方式:function student(){}) ######*2、实例化对象类 (new student();) ######*3、调用实例对象的方法 (stu1.sayHello();) ###3、打造一个一个自己的包 新建package文件夹,文本架构如下

bin
doc
lib
test
package.json

package.json文件如下

{
  "main":"./lib/package.js"
  //主要        引入文件
}

lib文件夹的package.js

exports.say=function(){
console.log(" test package!");
}

//定义一个简单的接口

调用代码:

//直接引入包文件名,会默认去找index.js 或找package.json  main所指向的路径。
var pack=require("./package");
pack.say();

Paste_Image.png
######3.1、package.json的规范简单描述

  "name" : "xxx",//包的名字
  "version" : "0.0.0",//包的版本号
"description": "第一个node.js程序",//简要说明,这个是用来干嘛的
"keywords":["can","node.js","javascript"],
//关键词,用于包搜索,例如搜索can的话会搜索到该包,当然前提是你要发布出去
......

请参考完整的package.json

{
	"name": "Hello World",
	"version": "0.0.1",
	"author": "张三",
	"description": "第一个node.js程序",
	"keywords":["node.js","javascript"],
	"repository": {
		"type": "git",
		"url": "https://path/to/url"
	},
	"license":"MIT",
	"engines": {"node": "0.10.x"},
	"bugs":{"url":"http://path/to/bug","email":"bug@example.com"},
	"contributors":[{"name":"李四","email":"lisi@example.com"}],
	"scripts": {
		"start": "node index.js"
	},
	"dependencies": {
		"express": "latest",
		"mongoose": "~3.8.3",
		"handlebars-runtime": "~1.0.12",
		"express3-handlebars": "~0.5.0",
		"MD5": "~1.2.0"
	},
	"devDependencies": {
		"bower": "~1.2.8",
		"grunt": "~0.4.1",
		"grunt-contrib-concat": "~0.3.0",
		"grunt-contrib-jshint": "~0.7.2",
		"grunt-contrib-uglify": "~0.2.7",
		"grunt-contrib-clean": "~0.5.0",
		"browserify": "2.36.1",
		"grunt-browserify": "~1.3.0",
	}
}

具体package.json详细内容 愿看到这里的同学都涣然大悟,技术路上与你同行!