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');
...
效果:
改造:
在调用模块中怎加代码:
var myModule = require('./module');
myModule.setName('can');
myModule.sayHello();
var myModule2 = require('./module');
myModule2.setName('lky');
myModule.sayHello();//注意这里是调用上面一个对象
调用结果:
问题:原来的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();
这样问题就解决了。
重新再看一边,有木有很熟悉的赶脚,思路是否似曾相识。都是通过或以下步骤:
*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();
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详细内容
愿看到这里的同学都涣然大悟,技术路上与你同行!