前言
本文的前置文章
JAVA程序員如何轉(zhuǎn)node_01
JAVA程序員如何轉(zhuǎn)node_02
本文會(huì)介紹的東西
1、npm node的包管理工具
2郁稍、koa 今天先簡單運(yùn)行一下,具體下節(jié)再分析
javascript的文件管理
談node總避不開npm苦囱,但是在談npm之前牙肝,我覺得你有必要先了解一下js中module和npm是什么關(guān)系。
歷史上javaScript是沒有文件組織關(guān)系的陌凳,想想你之前寫的前端js,是不是每次都用<script>標(biāo)簽包起來内舟,或者寫在一個(gè)js文件中合敦,然后在html中去引用他。
在最開始验游,javaScript的變量都是用var來定義充岛,這種情況下他相當(dāng)于直接把對(duì)象加載到了全局,你寫了之后在其他文件都能對(duì)其進(jìn)行訪問與修改耕蝉,這對(duì)文件的組織造成了極大的困難崔梗。試想一下你在兩個(gè)js文件中都使用var user來定義對(duì)象,這時(shí)候兩個(gè)js文件都被引用在一個(gè)html文件中時(shí)垒在,兩個(gè)對(duì)象就會(huì)相互沖突蒜魄。這個(gè)問題對(duì)js開發(fā)大型的、復(fù)雜的項(xiàng)目造成了巨大障礙场躯。
node要做后臺(tái)應(yīng)用谈为,勢(shì)必要對(duì)文件、模塊進(jìn)行管理踢关。所以到了后面伞鲫,有了module這種語法,有了以文件為單位的模塊化管理工具耘成,大家開始用let定義變量(let定義的對(duì)象生命周期在當(dāng)前函數(shù)之內(nèi))榔昔,在文件的末尾處module.export你要暴露出來的變量,在文件開頭用require引入變量瘪菌,文件的管理才變得有章可循撒会。
簡單舉個(gè)例子,新建兩個(gè)文件app.js 和utils.js师妙。
// utils.js
function add (a, b) {
return a + b;
}
module.exports = {
add
}
//app.js
let{ add } = require('./utils');
console.log(add(1,2));
在目錄下cmd執(zhí)行命令 node app.js,就會(huì)看到有3的輸出诵肛。
關(guān)于module的具體用法可以看
npm
而npm是node對(duì)包的管理工具,使用它的時(shí)候,你的項(xiàng)目就被組織成一個(gè)包的形式怔檩,它相當(dāng)于java中的maven褪秀。這時(shí)候工程目錄下就會(huì)有一個(gè)package.json記錄你這個(gè)項(xiàng)目用了哪些包(相當(dāng)與maven中的pom.xml)
要在本地中生成這個(gè)package.json,你只需要執(zhí)行 npm init,然后根據(jù)它的提示輸入信息就行,如果你什么都不想輸入薛训,一路回車也是可以的媒吗。這樣目錄中就多了package.json這個(gè)文件。
{
"name": "test4",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
其中name就是你的項(xiàng)目的包名乙埃,main就是你的包的程序主入口闸英,這里我把它改成了剛才寫的app.js。
scripts中的字段可以用npm run 來調(diào)用介袜,比如上面的test我可以在cmd中輸入npm run test甫何,它相當(dāng)于執(zhí)行了"echo "Error: no test specified" && exit 1" 這段腳本。
一般來說用npm將通用的方法打包成一個(gè)模塊供別人使用遇伞,都需要再npm官網(wǎng)注冊(cè)一個(gè)賬號(hào)辙喂,然后將npm模塊上傳到npm官網(wǎng)中。但是目前我一直都沒有注冊(cè)(主要是懶)鸠珠,所以一直都是用npm link本地鏈接使用或者使用公司的gitlab(相當(dāng)于github)來發(fā)布和托管巍耗。
為了顯示如何使用我當(dāng)前這個(gè)模塊,我先演示一下如何使用npm link引用剛才寫的包渐排。如果有人感興趣另一種方式芍锦,就留言一下。
首先飞盆,經(jīng)過剛才一番操作,我現(xiàn)在的代碼結(jié)構(gòu)目錄及內(nèi)容如下次乓。(package-lock.json不太重要)
在vscode中快捷鍵ctrl + J調(diào)出終端(cmd)吓歇,輸入 npm link。這時(shí)候票腰,npm 就會(huì)把你當(dāng)前這個(gè)包臨時(shí)存放在你本地全局存放npm包的地方城看。
現(xiàn)在我創(chuàng)建另一個(gè)test5目錄,同樣ctrl + J調(diào)出終端杏慰,輸入npm link test4(test4是剛才的包名)测柠。可以看到目錄下多了一個(gè)node_module文件夾缘滥,里面存放著一個(gè)test4文件夾轰胁。
test4的右邊有一個(gè)箭頭,說明它不是下載到當(dāng)前目錄的文件,只是一個(gè)類似快捷方式的引用而以。
現(xiàn)在我們就可以對(duì)其進(jìn)行引用了宫蛆,在當(dāng)前目錄下新建app.js,并鍵入require('test4')
執(zhí)行app.js即可看到輸出3右钾。這便是test4包中app.js所運(yùn)行的結(jié)果泼各。
簡單演示到這里偎肃。需要說明的是稽屏,npm引用也可以跟上面一樣
const utils = require('test4');
utils.add(); ....
這只取決于test4中的app.js有沒有module.exports變量出來卵贱。npm甚至可以將方法掛載到對(duì)象之中驮俗,比如將某些方法掛載到每次請(qǐng)求的實(shí)例對(duì)象之中懂缕,具體可以自行了解。
npm的方便之處
npm可太方便了王凑,無論你需要什么包搪柑,直接npm Install [包名]就可以下載到你的目錄當(dāng)中的node_modules文件夾中,如果你只是想臨時(shí)用一下一個(gè)包荤崇,就npm install [包名]拌屏。如果你想把這個(gè)包記錄在package.json中,就npm install --save [包名]术荤,項(xiàng)目上傳代碼一般不會(huì)把node_module中的文件一起帶上倚喂,但是會(huì)帶上package.json,這樣你拿到了代碼,只需要輸入npm install瓣戚,npm就會(huì)幫你把package.json中記錄的那些包都下到本地端圈。
為了顯示npm的方便我就簡單演示一下如何node是如何搭建網(wǎng)絡(luò)應(yīng)用的。
koa
1子库、進(jìn)入一個(gè)目錄舱权,點(diǎn)開cmd,輸入npm i koa
2仑嗅、在該目錄下新建app.js,輸入以下代碼
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => { ctx.body = 'Hello World';});
app.listen(8080);
console.log('Server running at http://127.0.0.1:8080/');
3宴倍、在cmd中輸入 node app.js
4、在瀏覽器地址欄中輸入127.0.0.1:8888仓技,就會(huì)看到hello world鸵贬!
注:async ctx => { ctx.body = 'Hello World';}是下面這個(gè)函數(shù)的簡寫。
async function func(ctx){
ctx.body = 'Hello World';
}
有沒有發(fā)現(xiàn)很簡單就實(shí)現(xiàn)了一個(gè)網(wǎng)絡(luò)應(yīng)用脖捻!不用像java一樣還需要寫servlet阔逼、將項(xiàng)目打包放入apache中、開啟服務(wù)地沮。統(tǒng)統(tǒng)不用嗜浮,node中直接就可以對(duì)請(qǐng)求進(jìn)行處理。
此外npm也使項(xiàng)目的構(gòu)建變得非常方便摩疑,簡單一個(gè)npm install方法就可以將模塊下載到本地node_module中危融,不用像maven一樣進(jìn)行配置、管理未荒。
此外专挪,npm init不僅可以生成package.json。它還可以對(duì)項(xiàng)目進(jìn)行初始化(簡單來說就是將某個(gè)框架的初始化目錄結(jié)構(gòu)整個(gè)拖拽到本地)這大大提高了應(yīng)用的開發(fā)效率。
后記
今天先寫到這寨腔,下一節(jié)估計(jì)會(huì)講一下node的網(wǎng)站開發(fā)和koa都做了什么速侈。
如果你覺得我的分享有用的話,可以留下你的點(diǎn)贊或者評(píng)論迫卢,蟹蟹倚搬!