參考一 Node入門 七天學會NodeJS Node.js v4.2.4 手冊 & 文檔 Node.js 教程 node.js摸石頭系列 從零開始學習node.js What is npm? Node.js v4.4.7Documentationhtml
JS是腳本語言,腳本語言都須要一個解析器才能運行。對於寫在HTML頁面裏的JS,瀏覽器充當瞭解析器的角色。而對於須要獨立運行的JS,NodeJS就是一個解析器。前端
每一種解析器都是一個運行環境,不但容許JS定義各類數據結構,進行各類計算,還容許JS使用運行環境提供的內置對象和方法作一些事情。例如運行在瀏覽器中的JS的用途是操做DOM,瀏覽器就提供了document
之類的內置對象。而運行在NodeJS中的JS的用途是操做磁盤文件或搭建HTTP服務器,NodeJS就相應提供了fs
、http
等內置對象。node
編寫稍大一點的程序時通常都會將代碼模塊化。git
在NodeJS中,通常將代碼合理拆分到不一樣的JS文件中,每個文件就是一個模塊,而文件路徑就是模塊名(文件名就是模塊名)。程序員
在編寫每一個模塊時,都有require
、exports
、module
三個預先定義好的變量可供使用。github
require
函數用於在當前模塊中加載和使用別的模塊,傳入一個模塊名,返回一個模塊導出對象。web
require方能看到的只有module.exports這個對象,它是看不到exports對象的,而咱們在編寫模塊時用到的exports對象實際上只是對module.exports的引用。算法
exports
對象是當前模塊的導出對象,用於導出模塊公有方法和屬性。shell
別的模塊經過require
函數使用當前模塊時獲得的就是當前模塊的exports
對象npm
經過module
對象能夠訪問到當前模塊的一些相關信息,但最多的用途是替換當前模塊的導出對象。
例如模塊導出對象默認是一個普通對象,若是想改爲一個函數的話,可使用如下方式。
module.exports = function () { console.log('Hello World!'); };
一個模塊中的JS代碼僅在模塊第一次被使用時執行一次,並在執行過程當中初始化模塊的導出對象。以後,緩存起來的導出對象被重複利用。
經過命令行參數傳遞給NodeJS以啓動程序的模塊被稱爲主模塊。主模塊負責調度組成整個程序的其它模塊完成工做。
有經驗的C程序員在編寫一個新程序時首先從make文件寫起。一樣的,使用NodeJS編寫程序前,爲了有個良好的開端,首先須要準備好代碼的目錄結構和部署方式,就如同修房子要先搭腳手架。
require
函數支持斜槓(/
)或盤符(C:
)開頭的絕對路徑,也支持./
開頭的相對路徑。但這兩種路徑在模塊之間創建了強耦合關係。
require
函數支持第三種形式的路徑,寫法相似於foo/bar
,並依次按照如下規則解析路徑,直到找到模塊位置。
咱們已經知道了JS模塊的基本單位模塊是單個JS文件,但複雜些的模塊每每由多個子模塊組成。
爲了便於管理和使用,咱們能夠把由多個子模塊組成的大模塊稱作包
,並把全部子模塊放在同一個目錄裏。
在組成一個包的全部子模塊中,須要有一個入口模塊,入口模塊的導出對象被做爲包的導出對象。
當模塊的文件名是index.js
,加載模塊時可使用模塊所在目錄的路徑代替模塊文件路徑
var cat = require('/home/user/lib/cat'); var cat = require('/home/user/lib/cat/index');
若是想自定義入口模塊的文件名和存放位置,就須要在包目錄下包含一個package.json
文件,並在其中指定入口模塊的路徑。
NodeJS會根據包目錄下的package.json
找到入口模塊所在位置
一個標準的工程目錄都看起來像下邊這樣
- /home/user/workspace/node-echo/ # 工程目錄 - bin/ # 存放命令行相關代碼 node-echo + doc/ # 存放文檔 - lib/ # 存放API相關代碼 echo.js - node_modules/ # 存放三方包 + argv/ + tests/ # 存放測試用例 package.json # 元數據文件 README.md # 說明文件
NPM是隨同NodeJS的包管理工具
下載好以後,argv
包就放在了工程目錄下的node_modules
目錄中,所以在代碼中只須要經過require('argv')
的方式就好,無需指定三方包路徑。
用戶只需關心本身直接使用的三方包,不須要本身去解決全部包的依賴關係
第一次使用NPM發佈代碼前須要註冊一個帳號
終端下運行npm adduser
,以後按照提示作便可。帳號搞定後,接着咱們須要編輯package.json
文件,加入NPM必需的字段。
{ "name": "node-echo", # 包名,在NPM服務器上需要保持惟一 "version": "1.0.0", # 當前版本號 "dependencies": { # 三方包依賴,須要指定包名和版本號 "argv": "0.0.2" }, "main": "./lib/echo.js", # 入口模塊位置 "bin" : { "node-echo": "./bin/node-echo" # 命令行程序名和主模塊位置 } }
以後,咱們就能夠在package.json
所在目錄下運行npm publish
發佈代碼了。
讓前端以爲如獲神器的不是NodeJS能作網絡編程,而是NodeJS可以操做文件。小至文件查找,大至代碼編譯,幾乎沒有一個前端工具不操做文件。換個角度講,幾乎也只須要一些數據處理邏輯,再加上一些文件操做,就可以編寫出大多數前端工具。
使用NodeJS內置的fs
模塊
上邊的程序拷貝一些小文件沒啥問題,但這種一次性把全部文件內容都讀取到內存中後再一次性寫入磁盤的方式不適合拷貝大文件,內存會爆倉。對於大文件,咱們只能讀一點寫一點,直到完成拷貝
buffer 緩衝/
JS語言自身只有字符串數據類型,沒有二進制數據類型,所以NodeJS提供了一個與String
對等的全局構造函數Buffer
來提供對二進制數據的操做。
Buffer
與字符串有一個重要區別。字符串是只讀的,而且對字符串的任何修改獲得的都是一個新字符串,原字符串保持不變。至於Buffer
,更像是能夠作指針操做的C語言數組
當內存中沒法一次裝下須要處理的數據時,或者一邊讀取一邊處理更加高效時,咱們就須要用到數據流
NodeJS經過fs
內置模塊提供對文件的操做。fs
模塊提供的API基本上能夠分爲如下三類:
文件屬性讀寫。
其中經常使用的有fs.stat
、fs.chmod
、fs.chown
等等。
文件內容讀寫。
其中經常使用的有fs.readFile
、fs.readdir
、fs.writeFile
、fs.mkdir
等等。
底層文件操做。
其中經常使用的有fs.open
、fs.read
、fs.write
、fs.close
等等。
基本上全部fs
模塊API的回調參數都有兩個。第一個參數在有錯誤發生時等於異常對象,第二個參數始終用於返回API方法執行結果。
操做文件時不免不與文件路徑打交道。NodeJS提供了path
內置模塊來簡化路徑相關操做,並提高代碼可讀性。
path.normalize
將傳入的路徑轉換爲標準路徑,具體講的話,除了解析路徑中的.
與..
外,還能去掉多餘的斜槓。
path.join
將傳入的多個路徑拼接爲標準路徑。該方法可避免手工拼接路徑字符串的繁瑣,而且能在不一樣系統下正確使用相應的路徑分隔符
path.extname
當咱們須要根據不一樣文件擴展名作不一樣操做時,該方法就顯得很好用。
使用NodeJS編寫前端工具時,操做得最多的是文本文件,所以也就涉及到了文件編碼的處理問題。
咱們經常使用的文本編碼有UTF8
和GBK
兩種,而且UTF8
文件還可能帶有BOM。
在讀取不一樣編碼的文本文件時,須要將文件內容轉換爲JS使用的UTF8
編碼字符串後才能正常處理。
'http'模塊提供兩種使用方式:
做爲服務端使用時,建立一個HTTP服務器,監聽HTTP客戶端請求並返回響應。
做爲客戶端使用時,發起一個HTTP客戶端請求,獲取服務端響應。
https
模塊與http
模塊極爲相似,區別在於https
模塊須要額外處理SSL證書
處理HTTP請求時url
模塊使用率超高,由於該模塊容許解析URL、生成URL,以及拼接URL
querystring
模塊用於實現URL參數字符串與參數對象的互相轉換
zlib
模塊提供了數據壓縮和解壓的功能。
當咱們處理HTTP請求和響應時,可能須要用到這個模塊。
net
模塊可用於建立Socket服務器或Socket客戶端
NodeJS能夠感知和控制自身進程的運行環境和狀態,也能夠建立子進程並與其協同工做,這使得NodeJS能夠把多個程序組合在一塊兒共同完成某項工做,並在其中充當膠水和調度器的做用。
咱們已經知道了NodeJS自帶的fs
模塊比較基礎,把一個目錄裏的全部文件和子目錄都拷貝到另外一個目錄裏須要寫很多代碼。
process
不是內置模塊,而是一個全局對象
NodeJS最大的賣點——事件機制和異步IO,對開發者並非透明的。
在代碼中,異步編程的直接體現就是回調。異步編程依託於回調來實現,但不能說使用了回調後程序就異步化了。
JS自己是單線程運行的,不可能在一段代碼還未結束運行時去運行別的代碼,所以也就不存在異步執行的概念。
可是,若是某個函數作的事情是建立一個別的線程或進程,並與JS主線程並行地作一些事情,並在事情作完後通知JS主線程,那狀況又不同了。
NodeJS提供了domain
模塊,能夠簡化異步代碼的異常處理
在介紹該模塊以前,咱們須要首先理解「域」的概念
node package manager,是一個NodeJS包管理和分發工具,已經成爲了非官方的發佈Node模塊(包)的標準。
Nodejs自身提供了基本的模塊,可是開發實際應用過程當中僅僅依靠這些基本模塊則還須要較多的工做。幸運的是,Nodejs庫和框架爲咱們提供了幫助,讓咱們減小工做量。可是成百上千的庫或者框架管理起來又很麻煩,有了NPM,能夠很快的找到特定服務要使用的包,進行下載、安裝以及管理已經安裝的包。
If you've been working with Javascript for awhile, you might have heard of npm: npm makes it easy for Javascript developers to share the code that they've created to solve particular problems, and for other developers to reuse that code in their own applications.
Once you're depending on this code from other developers, npm makes it really easy to check to see if they've made any updates to it, and to download those updates when they're made.(能夠檢測所依賴的代碼塊是否有更新)
These bits of reusable code are called packages, or sometimes modules. A package is just a directory with one or more files in it, that also has a filed called "package.json" with some meta data about this package.
A typical application, such as a website, will depend on dozens or hundreds of packages. These packages are often small. The general idea is that you create a small building block which solves one problem and solves it well. This makes it possible for you to compose larger, custom solutions out of these small, shared building blocks.
So now that you have an idea of what npm can do, let's talk about how it works. When people talk about npm, they can be talking about one of three things. They could be talking about the website, which we've just been looking at. Or they could be talking about the registry, which is a big database of information about packages that people are sharing. Or the third thing they could be talking about is the client: when a developer decides to share their code, they use the npm client which is installed on their computer to publish that code up to the registry. And once there's an entry for this package in the registry, then other developers can use their npm clients to install the package from the registry. The entry in the registry for this package is also reflected on the website, where there's a page dedicated to this new package.(人們討論npm,是在討論三件事中的一件,一是本網站(官網),二是倉庫(或是代碼庫),三是客戶端上的行爲)
So that's what npm is. It's a way to reuse code from other developers, and also a way to share your code with them, and it makes it easy to manage the different versions of code.
Node.js REPL(Read Eval Print Loop:交互式解釋器) 表示一個電腦的環境,相似 Window 系統的終端或 Unix/Linux shell,咱們能夠在終端中輸入命令,並接收系統的響應。
Node 自帶了交互式解釋器,能夠執行如下任務:
讀取 - 讀取用戶輸入,解析輸入了Javascript 數據結構並存儲在內存中。
執行 - 執行輸入的數據結構
打印 - 輸出結果
循環 - 循環操做以上步驟直到用戶兩次按下 ctrl-c 按鈕退出。
這是一個完整 npmjs.org
鏡像站,你能夠用此代替官方版本(只讀),同步頻率目前爲 10分鐘 一次以保證儘可能與官方服務同步
安裝模塊
cnpm install [name]