摘要:入門你必須知道的那些事最基本的一些操作和概念用執(zhí)行一段代碼在命令行中用切換到桌面創(chuàng)建一個(gè)文件夾和并用命令切換到這個(gè)文件夾創(chuàng)建一個(gè)文件并寫上簡(jiǎn)單的代碼在命令行中輸入命令行會(huì)輸出引用文件的方式采用了規(guī)范通過來引入一個(gè)文件新建文件并在文件中引入執(zhí)
入門node.js你必須知道的那些事 最基本的一些操作和概念 用node執(zhí)行一段js代碼
在命令行中用cd切換到桌面
創(chuàng)建一個(gè)文件夾和并用cd命令切換到這個(gè)文件夾
mkdir nodeTest && cd nodeTest
創(chuàng)建一個(gè)js文件并寫上簡(jiǎn)單的js代碼
touch a.js
`
var a = 10; console.log(a); console.log(a + 10);
`
在命令行中輸入node a.js
命令行會(huì)輸出 10 20
Node.js采用了CommonJS規(guī)范,通過require來引入一個(gè)js文件
新建文件b.js 并在文件中引入a.js
touch b.js
require("./a.js")
執(zhí)行b.js
node b.js 命令行會(huì)輸出10 20
node中的模塊概念node中一個(gè)模塊就是一個(gè)js文件,多個(gè)模塊組成一個(gè)特定功能的一堆文件叫包
一個(gè)js文件可以定義它自己暴露給外部的變量(意思就是另一個(gè)文件通過require引用它后需要怎么使用它),node中提供共了exports和module.exports兩個(gè)變量來實(shí)現(xiàn)它
a.js
function func1() { console.log("aaa") } function func2() { console.log("bbb") } exports.a = func1 exports.b = func2
b.js
var a = require("./a.js") a.a() //會(huì)打印出aaa a.b() //會(huì)打印出bbb
c.js
//es6 模式匹配寫法 var {fun1,fun2} = require("./a.js")//fun1和fun2必須跟a.js中的變量名相同,這里是固定的 fun1() //會(huì)打印出aaa fun2() //會(huì)打印出bbb
a.js
//類的寫法 function Test() { this.func1 = function() { console.log("aaa") } this.func2 = function() { console.log("bbb") } } module.exports = Hello
b.js
var Test = require("./a.js") var test = new Test() test.func1() test.func2()exports 和 module.exports 的關(guān)系
node中的npmexports 是module.exports的一個(gè)引用,意思就是指向同一塊內(nèi)存地址,node中真正生效的是module.exports,修改exports本質(zhì)上也是修改module.exports的值,
比如exports.a = 3,實(shí)際上module.exports.a也是等于3的
又比如exports = {},這樣exports就和module.exports的指向的對(duì)象就不一樣了,后面再怎么修改exports也不會(huì)影響到module.exports的值,也不會(huì)影響到文件輸出的變量
再比如module.exports={},這樣造成的效果和上面exports={}的效果是一樣的這里表達(dá)有問題,雖然module.exports={}和exports={}都是讓exports與module.exports的引用指向不同了,但是最后的效果實(shí)際上是不一樣的,具體用法參考評(píng)論區(qū)。感謝@琪琪好笨笨 指出的錯(cuò)誤
建議:如果你還傻傻分不清楚它們的區(qū)別,以后在不是必須用到module.exports的時(shí)候只用exports,如果導(dǎo)出一個(gè)類這樣的必須用到module.exports就不要使用exports了,不要混在一起用就不會(huì)出錯(cuò)了
node.js中自帶的那些模塊 http模塊node中默認(rèn)自帶了npm,npm是一個(gè)包管理器,上面說到包就是一個(gè)個(gè)模塊(js文件)組成的一個(gè)具有特定功能的一堆js文件,通過npm我們可以引入這些包(如果不理解,把包理解成一個(gè)個(gè)插件也沒有錯(cuò))來輕松實(shí)現(xiàn)一些功能
安裝一個(gè)模塊你只需要npm install xxx 就可以安裝了,然后在你自己的js中用var xxx = require("./xxx")就可以使用了
通過npm install xxx 安裝完xxx模塊后,你會(huì)發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè)node_modules文件夾,打開node_modules文件夾你會(huì)發(fā)現(xiàn)里面有一個(gè)xxx文件夾。你在執(zhí)行npm install xxx的時(shí)候,實(shí)際上npm也只是幫你把xxx這個(gè)包下載下來了而已,僅此而已
當(dāng)你通過npm安裝了十來個(gè)或者更多的包的時(shí)候你可能自己早就不知道自己安裝了哪些包了,因?yàn)楹芏喟蕾嚵似渌陌?一個(gè)包用到另一個(gè)包提供的功能是非常正常的行為,就像我們?cè)谟脛e人包里的功能一樣),所以npm提供了package.json這個(gè)文件來管理包
package.json 是一個(gè)文件,里面可以定義很多鍵值對(duì),其中有幾個(gè)字段非常重要,dependencies表示上線運(yùn)行時(shí)依賴的包,devDependencies表示開發(fā)時(shí)依賴的包,scripts可以定義自己的腳本,main表示所有的包你都會(huì)通過這個(gè)文件引入
當(dāng)你在dependencies和devDependencies定義好依賴,然后在命令行中輸入npm install,npm就會(huì)幫你自動(dòng)安裝好這些包;反過來你在命令行中輸入npm install xxx --save后npm就會(huì)在package.json中的dependencies自動(dòng)加上xxx,如果執(zhí)行的是npm install xxx --save-dev 就會(huì)在devDependencies中自動(dòng)加上xxx。
而在scripts中定義的腳本就直接可以在命令行中運(yùn)行了,如果還弄不懂,可以看一下我的另一篇文章,如何制作自己的npm包
使用別人的模塊,其實(shí)就是使用別人寫好的方法(函數(shù)),只需要搞清楚別人提供的方法是怎么用的就可以了,可以查node.js官網(wǎng)查api或者看看網(wǎng)上寫的教程就好。
下面演示了一個(gè)最簡(jiǎn)單的http模塊的使用方法,在當(dāng)前目錄下在命令行中輸入node test.js,http會(huì)掛起一個(gè)監(jiān)聽,只需要在瀏覽器中輸入http://localhost:8000,test.js就會(huì)跟瀏覽器返回
hello world顯示在頁面上:
test.js var http = require("http") var callBack = function(req, res) { res.write("url模塊hello world") res.end() } http.createServer(callBack).listen(8000)
在http模塊的例子中傳入了一個(gè)回調(diào)函數(shù),兩個(gè)參數(shù)分別是request和response,前者是瀏覽器傳給我們的對(duì)象,后者是我們傳給瀏覽器的對(duì)象。
其中req中包含了url這個(gè)屬性,可以在回調(diào)函數(shù)中把它打印出來console.log(req.url),加入你在瀏覽器中輸入的是:http://localhost:8000/aaa/bbb?abc=3,那么打印出來的值是:/aaa/bbb?abc=3
在這里我們需要使用到的是/aaa/bbb和abc=3分開來的結(jié)果,node給我們提供了一個(gè)處理url的模塊,就叫做url模塊.當(dāng)然如果你自己想處理這個(gè)url也是完全可以的,用正則表達(dá)式就可以,但是已經(jīng)有現(xiàn)成的為啥不用呢
下面簡(jiǎn)單演示一下用法,在瀏覽器輸入:http://localhost:8000/aaa/bbb?abc=3
test.js var http = require("http") var url = require("url") var callBack = function(req, res) { var urlString = url.parse(req.url) var path = urlString.pathname var query = urlString.query console.log(path,query)//打印出/aaa/bbb abc=3 res.write("fs模塊hello world") res.end() } http.createServer(callBack).listen(8000)
fs是一個(gè)提供文件操作功能的模塊,可以對(duì)文件進(jìn)行讀寫存刪等操作,下面演示向?yàn)g覽器返回本js的內(nèi)容:
test.js var http = require("http") var fs = require("fs") var callBack = function(req, res) { fs.readFile("./test.js", "utf-8", function(err, data) { res.write(data) res.end() }) } http.createServer(callBack).listen(8000)用http模塊、url模塊、http模塊搭建一個(gè)靜態(tài)服務(wù)器
var http = require("http") var url = require("url") var fs = require("fs") var callBack = function(req, res) { var pathname = url.parse(req.url).pathname if (pathname == "/") { pathname = "/index.html" } fs.readFile("." + pathname, "utf-8", function(err, data) { if (err) { res.write("Error 404") } else { res.write(data) } res.end() } )} http.createServer(callBack).listen(8000)使用外部模塊 簡(jiǎn)單說明
外部模塊都是第三方提供的模塊,node.js默認(rèn)是不提供的,所以需要用npm安裝,這里提供package.json文件,只需要執(zhí)行npm install 安裝就行了,另外是管理MongoDB數(shù)據(jù)庫的一個(gè)包,所以本地需要把MongoDB多帶帶安裝一下。
package.json { "dependencies": { "cheerio": "^1.0.0-rc.2", "eventproxy": "^1.0.0", "express": "^4.16.2", "koa": "^2.4.1", "superagent": "^3.8.1" } }express
express提供了基本的路由和靜態(tài)文件訪問的功能,當(dāng)然還有其它的功能,這里主要演示它的基本使用
下面1,2,3都是設(shè)置public和files目錄下為靜態(tài)文件,可以直接通過文件路徑訪問,1、2可以同時(shí)存在,即可以指定幾個(gè)目錄均為靜態(tài)文件目錄,在指定目錄為靜態(tài)文件后,訪問靜態(tài)文件需要省略這個(gè)目錄,比如訪問public目錄下的css/index.css:localhost:8000/css/index.css,直接省略了public,
可以通過3來指定替換目錄名稱的路徑,通過3設(shè)置后,要訪問public下的css/index.css:localhost:8000/public/css/index.css
var express = require("express") var app = express() 1. app.use(express.static("public")) 2. app.use(express.static("files")) 3. app.use("/static",express.static(public)) app.get("/", function (req, res) { res.send("Hello World");//一個(gè)回調(diào)方法對(duì)應(yīng)一個(gè)路徑 }) app.get("/user", function (req, res) { res.send("user"); }) app.listen(8000, function () { console.log("app is listening at port 3000"); })superagent、cheerio模塊
superagent是一個(gè)可以發(fā)http請(qǐng)求的模塊,回調(diào)函數(shù)中的res就是請(qǐng)求到的內(nèi)容
cheerio是在服務(wù)器端類式j(luò)query的框架,看代碼應(yīng)該能看出來
下面演示的是抓取糯米網(wǎng)的餐品列表鏈接
var superagent = require("superagent")
var cheerio = require("cheerio") var spideUrl = "https://t10.nuomi.com/pc/t10/index" superagent.get(spideUrl) .end(function(err, res) { if (err) { return console.error(err); } var foodUrls = []; var $ = cheerio.load(res.text) // 獲取首頁所有的鏈接 $(".j-item a").each(function(idx, element) { var $element = $(element) foodUrls.push($element.attr("href")) }) console.log(topicUrls) })eventproxy
在爬取一堆類式的鏈接的時(shí)候,一個(gè)個(gè)鏈接寫挺麻煩的,eventproxy提供了監(jiān)聽,然后觸發(fā)回調(diào)的方式來處理這類問題,下面是我拷貝的一段代碼,應(yīng)該挺容易看懂的
//得到一個(gè) eventproxy 的實(shí)例 var ep = new eventproxy() // 命令 ep 重復(fù)監(jiān)聽 urls.length 次(在這里也就是 10 次) ep.after("topic_html", urls.length, function (topics) { topics = topics.map(function(page) { var $ = cheerio.load(page) var userId = $(".runUserName a font").eq(0).text() return userId }); console.log(topics); }) urls.forEach(function(item) { superagent.get(item) .end(function (err, res) { ep.emit("topic_html", res.text) }) })總結(jié)
大部分學(xué)習(xí)前端其實(shí)是沒必要深入學(xué)習(xí)node.js的,一方面沒那個(gè)精力,然后也沒那么必要,但是一些基本的東西還是有必要好好學(xué)學(xué)的
大多數(shù)前端同學(xué)之所以覺得應(yīng)該學(xué)前端,其實(shí)是平時(shí)接觸到的npm、require模塊、es6的語法等問題覺得比較棘手,以為是自己不懂node.js,其實(shí)這些和node.js并無太大關(guān)系,這些已經(jīng)影響到學(xué)習(xí)前端其它內(nèi)容的地方還是需要好好學(xué)習(xí)的
學(xué)習(xí)node.js基本的東西還是有必要的,比如搭建個(gè)簡(jiǎn)單的服務(wù)器,做點(diǎn)基本的邏輯處理和數(shù)據(jù)處理,做個(gè)爬蟲啥的。而這些都很簡(jiǎn)單,看兩篇博客做幾個(gè)練習(xí)就夠了,再深入就根據(jù)實(shí)際情況學(xué)習(xí)就好了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89875.html
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:我從今年的月份開始在知乎上連續(xù)回答前端開發(fā)相關(guān)的問題,至今已有將近三個(gè)月,回顧寫過的一百多條回答,不少是給迷茫的前端工作者的建議。今天我把我的思考提煉整理成文,希望能給予在迷茫中前行中的前端學(xué)習(xí)工作者一些有用的建議。 本文首發(fā)于知乎專欄——前端指南作者:Mark MFS老師轉(zhuǎn)載請(qǐng)注明來源。 我從今年的2月份開始在知乎上連續(xù)回答前端開發(fā)相關(guān)的問題,至今已有將近三個(gè)月,回顧寫過的一百多條回...
摘要:面試如何防騙一份優(yōu)秀的前端開發(fā)工程師簡(jiǎn)歷是怎么樣的作為,有哪些一般人我都告訴他,但是他都不聽的忠告如何面試前端工程師 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfront/mo... 3月份前端資源分享 1. Javascript 使用judge.js做信息判斷 javascript...
摘要:前端日?qǐng)?bào)精選你可能不知道的前端知識(shí)點(diǎn)譯在服務(wù)端渲染的實(shí)現(xiàn)掘金小前端創(chuàng)建或文件并瀏覽器導(dǎo)出下載張?chǎng)涡聆慰臻g鑫生活代理服務(wù)器淺析知乎專欄快速打造簡(jiǎn)易高效的配置掘金中文譯組件解耦之道楓上霧棋的日志第期什么樣的工程師才能算老司機(jī) 2017-07-05 前端日?qǐng)?bào) 精選 你可能不知道的前端知識(shí)點(diǎn)[譯] React 在服務(wù)端渲染的實(shí)現(xiàn) - 掘金小tip:JS前端創(chuàng)建html或json文件并瀏覽器導(dǎo)出...
摘要:更多資源請(qǐng)文章轉(zhuǎn)自月份前端資源分享視頻前端技術(shù)論壇融合不可錯(cuò)過的迷你庫測(cè)試框架實(shí)例教程為你詳細(xì)解讀請(qǐng)求頭的具體含意解析的庫如果要用前端框架,開發(fā)流程是怎樣的與有什么區(qū)別正確使用的方法是什么流程圖插件小如何讓元素只能輸入純文本前端技術(shù)中 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfront...
閱讀 1482·2021-11-24 09:39
閱讀 3663·2021-09-29 09:47
閱讀 1598·2021-09-29 09:34
閱讀 3107·2021-09-10 10:51
閱讀 2573·2019-08-30 15:54
閱讀 3250·2019-08-30 15:54
閱讀 898·2019-08-30 11:07
閱讀 1039·2019-08-29 18:36