確實有感而發,Nodejs真的發展太快了,這么說的原因有兩點:自己去年冬天買了本《了不起的Node.js》,里面介紹Express的版本還是2.x.x;前些天小伙伴買了本《Node.js實戰》,結果依賴的Express是3.x.x。尼瑪如果安裝目前新版的Express4,那么這些書中的例子連項目都無法正常跑起來。
Nodejs相關的紙版書一上市就已經過時了!
此文的背景是由於俺某天手欠,升級了最新Express V4+后,發現項目不可用了(還好是公司內部的小工具),查找資料后整理了些許總結,介紹如何使用Express4搭建項目。
情況差不多就是這樣,那么咱們"深入淺出"一把Express項目吧。
如果看官想了解Express 4之前的安裝、使用可查看:http://www.cnblogs.com/Darren_code/p/node_express.html
--------------------------- 分割線 ---------------------------
目錄
建立工程環境
先介紹下各種環境吧:
進入俺們的項目所在目錄:
cd /home/work/node/project
npm安裝express , -g 指令讓express進入全局安裝:
$ npm install -g express
如果是express 4.0之前版本,那么執行“express -V”就可以得到版本號了,可express 4.0之后還需要再安裝express-generator包,如果沒有安裝還執行“express -V”命令會報錯。
執行安裝express-generator包:
$ npm install -g express-generator
現在執行“$ express -V”可查看express版本信息了。
發生這種情況的原因是,express4.0之后把創建一個APP的功能分離出來為express-generator,沒它你創建不了應用程序。
NPM和模塊
以下兩張express目錄(安裝samba,Windows下查看無壓力)的圖片可以更直觀的對比express包的變化,下圖左側是V3.15.0,下圖右側是V4.7.0:
目錄結構上看就缺少一個bin文件,這個bin目錄內存放的就是內部命令(下圖),只不過它們都是以獨立的文件形式存在的。
PS:bin是binary的縮寫,有關bin和sbin目錄的含義需要看官對linux的目錄結構有一點點了解,使用Google 百度一下"linux 目錄"即可找到對應資料。
再從模塊信息(node_modules/express/package.json)看它們的重要不同:
"bin": { "express": "./bin/express" }
需要注意npm模塊中的信息都在package.json里面,包括各種配置信息。
其中"bin"這個key就是申明用戶可以使用“command-name”這個命令,而輸入該命令后就會去執行“command-file”這個文件。如下:
{ ... "bin": { "command-name” : “command-file”
} ... }
所以在命令行輸入express命令時,其實對應的其實是去執行bin目錄下的express程序。
如果自己要制作模塊包,且希望可以命令行工具使用時,需要配置好bin字段,當全局模式安裝之后就可以在命令行直接執行使用。有關package.json的信息會再配置章節中再詳細介紹,"$ npm help json"可以獲取官方的詳細信息。
全局模式安裝的意義
npm安裝的時候區分本地模式安裝和全局模式安裝,“-g”就表示全局模式安裝,這種模式會被安裝在node安裝目錄的lib所在目錄的node_modules文件夾中,全局使用。
NPM是由Isaac Z.Schlueter創建的,提供給Node服務的Node包管理器,最開始需要獨立安裝,后來當Nodev0.6.3版本默認集成了NPM作為Node包管理器,所以在那之后,只要使用NPM安裝的全局包地址,都可以推算出來。
如Node在/usr/local/bin/node,那么模塊目錄就是/usr/local/lib/node_modules/下。
非全局那么就是本地模式安裝,這類模式安裝會被安裝在當前目錄的node_modules文件夾中,非全局使用。
如果express-generator不是全局模式安裝怎么辦?
非常不爽的就是命令行工具中直接使用"express [option] [dir]"就沒法完成了,只能手動的找到執行文件執行才可以,如本地模式安裝的時只能只能在當前目錄下執行
$ ./node_modules/express-generator/bin/express -V 4.2.0
創建項目
東扯西扯完畢,各方面也已經Ready,創建個Express項目開心一下:)
再確認一下所在的目錄位置
express myapp
$ cd myapp && npm install
npm install完成之后就可以run起來咯,執行:
$ DEBUG=myapp ./bin/www
執行“npm start”其效果一樣,下圖分別是這兩條語句執行情況:
PS:紅框中的內容是訪問時打印的信息。
可以看到倆條命令打印出來的信息有一行不一樣,執行完“DEBUG=myapp ./bin/www”后會打印出:“myapp Express server listening on port 8898 +0ms”
讓俺們來看看為神馬,執行命令:
$ vi ./bin/www
PS:默認PORT其實3000(紅框中的部分),俺手動修改后使用的是8898端口
Express4中引入了著名的debug模塊,所以debug模式讓我們更方便的玩轉Node中的模塊,其使用方法介紹起來較長,建議大家看看其官方的介紹:https://www.npmjs.org/package/debug
重要的package.json文件馬上會介紹,創建Express4項目俺們就說到這里。
目錄結構
了解目錄結構是玩轉一切項目的第一步:
- app.js,程序啟動文件
- bin,創建項目時已經提到,是真實的執行程序
- node_modules, 存放所有的項目依賴庫
- package.json,項目依賴配置及開發者信息
- public,靜態文件(css,js,img)
- routes,路由文件
- views,頁面文件
配置文件之神奇的package.json
在Nodejs項目中,package.json文件用來聲明項目基本信息和使用的模塊,這樣在新的環境部署時,只要在package.json文件所在的目錄執行npm install命令即可按照所需要的模塊啦。
下面俺們通過這個package.json文件再Build Express項目玩玩(生命不息折騰不止嘛)。
回到project目錄:
在project目錄下新加testpackage項目
$ mkdir testpackage && cd testpackage
把myapp中的package.json copy過來
$ cp ../myapp/package.json ./
創建個server.js,寫入簡單的幾行代碼,運行一把:
var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('Hello World'); }); var server = app.listen(8808, function() { console.log('Listening on port %d', server.address().port); }); app.get('/sayhi', function(req, res){ res.send('狗狗 黑喂狗'); });
上面倆圖就是運行結果。
查看package.json中的內容如下
會議下由package.json實現的快速項目搭建,俺們再來了解其內容意義:
- name
~ 在package.json中最重要的就是name和version字段。他們都是必須的,如果沒有就無法install;
~ 想好名字之前先去npm registry查看一下這個名字是否已經被使用了,http://registry.npmjs.org/ - version
~ version必須能被 node-semver解析,它被包在npm的依賴中;
~ name和version一起組成的標識在假設中是唯一的。改變包應該同時改變version - private
~ 如果你設置"private": true,npm就不會發布它;
~ 這是一個防止意外發布私有庫的方式。如果你要確定給定的包是只發布在特定registry(如內部registry)的,用publishConfighash的描述來重寫registry的publish-time配置參數 - scripts
~ “scripts”是一個由腳本命令組成的hash對象,他們在包不同的生命周期中被執行。key是生命周期事件,value是要運行的命令。 - dependencies
~ 依賴是給一組包名指定版本范圍的一個hash。這個版本范圍是一個由一個或多個空格分隔的字符串。依賴還可以用tarball或者git URL
以上五項僅僅是Express4 package.json使用的,其他細節可參考文檔 傳送門https://www.npmjs.org/doc/files/package.json.html
小結一下
文章在偏應用的層面上介紹了NPM和模塊信息,希望能對大家了解有所幫忙吧。
8月份的文章補上,俺們下一章再來介紹用Express+mongodb搭建個人網站,保佑老子千萬別跳票了...吼吼:)
資料
- http://expressjs.com
- http://www.npmjs.com/
- (英語)https://www.npmjs.org/doc/files/package.json.html
- (中文)http://mujiang.info/translation/npmjs/files/package.json.html