nodejs這些年的發展非常快,相信沒有哪個前端不知道的了,npm也成為了前端開發中經常用到了的一個命令。那么npm不是只用一個 "npm install xxx"命令就夠了嗎?實際上並不是這樣,發現有些團隊在使用npm的時候沒有認真去搞懂npm在團隊里面或者說是在項目里面的一些用法。
1.從認識package.json開始
在團隊里面開發,一般會分為開發模式和生產模式(可能會有不同的叫法),有時候還有測試模式,那么這些模式其實跟npm有很大的聯系的。首先看一個簡單的例子,先從npm依賴的package.json文件開始。
{
"name": "test",
"version": "1.0.0",
"description": "test",
"main": "app.js",
"scripts": {
"dev": "gulp dev && node app",
"pro": "node app"
},
"keywords": [
"test"
],
"dependencies": {
"koa": "^1.2.0"
},
"devDependencies": {
"gulp": "^3.9.1",
"koa": "^1.2.0"
},
"author": "test",
"license": "MIT"
}
這個很簡單的package.json寫法的例子,這里主要應用的是其中的 scripts、dependencies、devDependencies 這三個設置。
2.dependencies、devDependencies這兩個的配置
關於這個兩個配置,大致可以理解為當執行
npm install xxx --save
的時候,模塊會記錄在dependencies里面;
當執行
npm install xxx --save-dev
的時候,模塊會記錄在devDependencies里面。但是有一點的是,很多人在git clone 項目之后都是直接執行" npm i" 或者 "npm install" 就可以把項目的依賴配置好了,而這兩個命令都是安裝devDependencies里面的模塊,那么還需要dependencies來做什么?
"npm install" 模式的是開發模式,所以安裝模塊是devDependencies里面的模塊,在開發的時候確實夠用了,但是在部署到服務器的時候就不是這樣了。上面的package.json,dependencies(對應生產模式)和 devDependencies(對應開發模式),區別只是在於有沒有 gulp 這個模塊。
現在反過來想,我們在開發的時候需要用gulp來打包我們的靜態文件,那么到了生產模式,也就是部署到了服務器,我們已經不需要gulp來打包了,因為在開發模式把文件打包好,提交代碼的時候同步就可以了,所以在部署到服務器的時候我們完全不用多安裝gulp這么一個模塊了。
那么生產模式是怎么執行安裝呢?很簡單,
npm install --production
就可以了。這個例子為了理解,只是用了一兩個模塊,實際項目中生產模式和開發模式肯定不止區別一個模塊這么簡單,這個時候就更能體現出兩種模式分開的必要。
還要提過的測試模式,測試模式一般是歸於開發模式,即把測試模式需要用到的模塊放到devDependencies 里面,目前npm是還沒有獨立出來測試模式的依賴設置。
3.scripts的設置
大部分人開始開發的時候,對於gulp的構建一般就執行
gulp
這個命令,對於運行node的server一般運行
node app
這樣類似的命令,但是這樣在團隊里面的開發是不規范的,特別是有些命令加上各種參數,然后比較長的時候就會麻煩了,應該是使用"npm run" 命令和結合scripts的設置。
scripts是一個object,那么key就是對應的命令,value就是實際上執行的命令,這種命令再長也不怕了。可以看到上面的package.json里面的scripts,里面有兩個命令一本是dev另一個是pro,分別對應開發模式和生產模式。
當團隊成員開發的時候只需要運行
npm run dev
就可以開始開發,當部署到服務器的時候執行
npm run pro
就可以啟動服務了。前提是要安裝好依賴模塊,就是上面說到了兩種不同的安裝方式。
實際項目有可能不止這兩個命令,具體的命令也可能不一樣,比如有可能還有測試模式的命令,又比如只需要打包文件而不要http的服務,那么這時候開發模式和生產模式就是不同的gulp命令了。
4.關於團隊使用
團隊中使用,最主要的是規范,像npm這樣的使用確實要規范起來,減少團隊配合的阻礙吧,只要是增加了什么模式,只需要告訴他看packaga.json里面的scripts, npm run xxx一下就可以了。當然這里在團隊使用當中,每個項目都應該有一個README.md 的文檔來進行介紹和說明,這里就不詳細介紹了。