nodejs教程之入門
前言
再不學(xué)nodeJs,我們就老了......在HTML5大浪襲來的時候,很多先輩就開始了NodeJs之旅,而那時我還在做服務(wù)器端的程序
后來轉(zhuǎn)成前端,和梯隊的距離已經(jīng)很大了,因為我會服務(wù)器端語言,還干了很久,所以至今才開始學(xué)習(xí)NodeJs,向完整的前端前進(jìn)
這次學(xué)習(xí)NodeJs的計劃是:
① 1-2周學(xué)習(xí)基礎(chǔ)知識
② 1周左右開發(fā)一個簡單項目
③ 利用NodeJs開發(fā)一套用于移動端調(diào)試的工具
④ 打包相關(guān)(這個可能比較遠(yuǎn)了)
NodeJs特點
① 異步
從文件讀取到網(wǎng)絡(luò)請求,NodeJs皆以異步完成,回調(diào)函數(shù)占據(jù)重要作用,在編程模型上Node是領(lǐng)先的
② 事件回調(diào)
事件回調(diào)讓程序變得輕巧,但是具體怎么樣還是取決于程序員。但是回調(diào)函數(shù)在閱讀上其實還是有一定難度的
③ 單線程
Node是單線程的,如果多線程的話,這門語言水又深了,問幾句進(jìn)程中的通信時很討厭的,但線程也沒有死鎖等問題
但是性能相關(guān)就有問題了,因為不能利用多核;
模塊機制/CommonJs
我們原來做服務(wù)器端的開發(fā),如果沒有很好的組織代碼的話,后期維護(hù)非常困難,所以才會有什么MVC,什么三層架構(gòu)
而現(xiàn)在前端的業(yè)務(wù)邏輯逐向后端靠攏,就單頁應(yīng)用來說,已經(jīng)超過后端的程序邏輯
頁面view不停的增加會帶來js代碼量的激增,如何很好的管理我們的前端代碼成了一個問題,所以requireJs出現(xiàn)了......
PS:尼瑪這段和nodeJs有一毛錢關(guān)系哇......
javascript是沒有模塊化系統(tǒng)的,于是就有CommonJs的提出,讓js具備開發(fā)大型應(yīng)用的基礎(chǔ)
模塊引用
我們?nèi)绻靡粋€模塊,比如數(shù)學(xué)計算相關(guān):
var math = require('math');
模塊定義
我們?nèi)绻x自己的模塊可以這樣干
exports.add = function () {
return sum;
}
如果此函數(shù)在math中定義的話,就能使用了
math.add();
模塊標(biāo)識
模塊標(biāo)識就是傳遞給require的參數(shù),需要為駝峰命名,指向的是一個文件路徑,這里和requireJS很類似的
模塊實現(xiàn)
Node中模塊實現(xiàn)分為兩類,一種是系統(tǒng)級別的核心模塊,一種是用戶編寫的文件模塊
核心模塊在編譯過程被翻譯成了二進(jìn)制文件,Node進(jìn)程啟動后,一些核心的模塊會直接加載進(jìn)內(nèi)存(文件定位、編譯執(zhí)行)
文件模塊需要動態(tài)加載,速度相對慢一點
但是一旦加載后,那些文件便會被緩存,二次引入時候便會讀取緩存文件(編譯后的文件)
這里扯遠(yuǎn)一點,我們在使用underscore過程中,會編譯Html形成模板函數(shù)(他真的只是一個函數(shù)),其實這個就可以做緩存
在部署項目之前保存編譯過后的函數(shù),去掉html模板文件(優(yōu)化效果不知)
在node中,每個模塊都是一個對象:
function Module(id, parent) {
this.id = id;
this.exports = {};
//parent是關(guān)鍵字,不應(yīng)該亂用
this.parent = parent;
if (parent && parent.children) {
parent.children.push(this);
}
this.filename = null;
this.loaded = false;
this.children = [];
}
編譯和執(zhí)行時引入文件模塊的最后一個階段,定位到具體文件后,node會新建一個模塊對象,然后根據(jù)路徑載入并編譯
每一個編譯成功的模塊都會將其文件路徑作為索引緩存在Module._cache上
每個模塊文件都存在require、exports、module三個變量,但是在文件中并未定義(__filename__、__dirname__ 變量也是)
其實在編譯過程中,Node對javascript文件內(nèi)容進(jìn)行了頭尾包裝(相當(dāng)于自定義函數(shù)傳入window)
(function (exports, require, module, __filename__, __dirname__) {
var math = require('math');
exports.area = function (radius) {
return '';
};
});
這樣,模塊與模塊之間做了隔離,不會互相影響,這里和underscore的編譯有些類似......
包與NPM
Node組織了自身的核心模塊,所以第三方文件模塊可以有序的編寫和使用,但是在第三方模塊中,模塊與模塊之間仍然散列在各地
相互之間不能直接引用,在模塊外包和NPM則是將聯(lián)系建立起來的一種機制
PS:很多模塊會形成一個包,這個包的概念和java包的概念,才#程序集的概念應(yīng)該相似
一個包結(jié)構(gòu)解壓后會形成幾個文件:
① package.json 描述文件
② bin 可執(zhí)行二進(jìn)制目錄
③ lib javascript代碼目錄
④ doc 文檔(尼瑪基本沒有)
⑤ test demo
以上都是CommonJS包的規(guī)范的一些東西,但是我們稍微了解一下便可(初學(xué)嘛),NPM則需要熟練掌握,借助NPM我們可以熟練安裝管理包
安裝依賴包
安裝依賴包是常用方法:
npm install express
執(zhí)行后就會在當(dāng)前目錄下創(chuàng)建node_modules目錄,然后再其下面創(chuàng)建express目錄......
PS:express是NodeJs上流行的web開發(fā)框架,幫助我們快速開發(fā)一個web應(yīng)用
安裝結(jié)束后就可調(diào)用了:
var express = require('express');
結(jié)語
這段簡單結(jié)束,后面我們項目實戰(zhàn)過程逐步深化
相關(guān)文章
npm報錯:request to httpsregistry.npm.taobao.org 
這篇文章主要介紹了npm報錯:request to httpsregistry.npm.taobao.org failed, reason certificate has expired的解決方案,文中有詳細(xì)的解決方案,需要的朋友可以參考下2024-03-03關(guān)于Node.js中Buffer的一些你可能不知道的用法
網(wǎng)上關(guān)于Node.js中Buffer用法的文章有很多,但是感覺還是不夠詳細(xì),所以這篇文章主要介紹了關(guān)于Node.js中Buffer的一些你可能不知道的用法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03Node.js實現(xiàn)用戶身份驗證和授權(quán)的示例代碼
在web開發(fā)中,我們常常需要對一些敏感的url進(jìn)行訪問權(quán)限控制,本文主要介紹了Node.js實現(xiàn)用戶身份驗證和授權(quán)的示例代碼,具有一定的參考價值,感興趣的了解一下2024-02-02