####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詳細內容 願看到這裡的同學都渙然大悟,技術路上與你同行!