node 模組引入與其他語言思路相通的一些分析

lkycan發表於2017-12-14

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

相關文章