Nodejs把前端開發帶入一個全新的階段,他使得js能夠跑在服務端上,大大強化了js這門語言的可塑性。
OK,環境配置不提,配置好了以後,直接來跑一些簡單的demo
以前一直沒搞懂nodejs複雜的目錄(其實是不懂linux),老把文件目錄和運行時的目錄搞錯。
在gitbash下,先進入對應的目錄,例如我的js文件在 D:\node\nodejs下,那麼應該:
$ cd d:
$ cd node/nodejs
這樣就OK啦,如果想跟IDE進行配合也不是不行,步驟如下:
1.在node.exe同級下建立project,命名爲 nodejs :
2.在IDE中添加新建項目,添加剛纔的文件夾路徑:
歐~~尅!
接着,在IDE裏面新建幾個js文件,然後在我們的Node上面跑一跑(CreateServer那個DEMO就不做了)。
建立第一個文件:hello.js (null文件)
建立第二個文件:world.js(null文件)
兩個文件可以在同級目錄,也可以不在。
將下列代碼填入hello.js:
function hello(){
console.log("hello")
}
exports.hello =hello();
打開gitBash,找到IDE中工程的目錄(最好把js文件放在工程目錄下即可,或者單獨建一個js文件夾):
然後輸入:$ node hello.js
然後將下列代碼填入 world.js :
var world = require("./hello.js");
world.hello
運行之,得出下圖:
可以看到,兩次的運行結果一樣。hello.js的運行結果爲hello不足爲奇,那麼world.js爲什麼也輸出hello呢?
這是因爲在hello.js中,打包出來一個公共模塊,exports.hello =function(){....}
而在world.js中,引入了這個模塊,並且賦值給變量world:
var world = require('./hello.js') /*引入【hello.js裏面打包的
模塊】*/
/*此時,world相當於擁有共有模塊的所有屬性和方法了,那麼此時,這個
world有一個方法爲hello,我們調用這個hello方法,world.hello ,自然
而然輸出hello*/
如果將hello.js改進一下,
var i=0 ;
function hello(){
++i;
console.log("hello for " + i)
};
運行 node hello.js
輸出: //hello for 1
同時更改world.js:
var world = require('./hello.js')
var world1 = require('./hello.js')
world.hello
world1.hello
運行 $node world.js
輸出//hello for 1甭管運行幾次,都是這個結果
這說明,引入模塊時,只有第一次引入時會初始化模塊。
模塊的集合:包(package)
所謂的包,就是內部集成了好多模塊,主要使用一個入口文件作爲包的入口,該文件的導出對象作爲包的公有模塊:
一 ---nodejs
|一 ----js
| -----main.js
| ------head.js
| ------body.js
| ------footer.js
|一 ------package.json
此時,main.js是包的入口和導出對象模塊,在main.js中,很有可能引入了head.js、body.js、footer.js的導出模塊,然後寫入一些功能和方法,最後導出一個公有方法,供其他的包或者模塊使用。
當模塊的文件名是index.js,加載模塊時可以使用模塊所在目錄的路徑代替模塊文件路徑,因此接着上例,以下兩條語句等價。
當引用包的入口文件時,require(‘./node/nodejs/main.js’)這樣給人感覺彷彿在引用一個模塊,而不是整個包。
解決方法是,將Main.js命名爲index.js,這樣,在引入包的入口文件時,直接填寫包入口文件的路徑:
var cat = require('./js/index.js');
var cat = require('/js');
//上面兩條語句等價
這樣處理後,就只需要把包目錄路徑傳遞給require函數,感覺上整個目錄被當作單個模塊使用,更有整體感。
也可以用json文件來聲明入口:
{
'main':'./main.js'
}
這樣,在引入包的入口文件時 require(‘./node/nodejs’)時,會優先查找json文件,並從中讀取入口配置,注意,此時的json一定要在引用的路徑之下。