【一】node基本使用
阿新 • • 發佈:2018-11-01
一、Node.js是什麼
- Node.js不是一門語言不是庫不是框架
- Node.js是javascript執行時環境。簡單來說就是Node.js可以解析和執行js程式碼,現在js可以脫離瀏覽器執行
- 瀏覽器中的js
- Ecmascript(基本語法,if,var,function)
- DOM
- BOM
- Node 中的 JavaScript
- 沒有DOM BOM(不能識別window和document)
- EcmaScript
- Node.js不操作頁面,為js提供一些伺服器端的操作:檔案的讀寫,網路服務的搭建,網路通訊等
- event-driven事件驅動、非阻塞i/o模型、輕量高效
二、Node.js使用
1、檔案的操作
終端用node 檔名開開啟檔案
fs 是 file-system 的簡寫,就是檔案系統的意思,在 Node 中如果想要進行檔案操作,就必須引入 fs 這個核心模組 var fs = require(‘fs’)
- 讀檔案fs.readFile
fs.readFile('./data/a.txt', function (error, data) { //第一個引數就是要讀取的檔案路徑 // 第二個引數是一個回撥函式 if(error){ console.log('有錯誤') }else{ console.log(data.toString()) } }
成功——data 資料,error undefined沒有資料
失敗—— data undefined沒有資料,
- 寫檔案 fs.writeFile(檔案路徑,寫入的內容,回撥函式)
- 讀取資料夾的目錄 fs.readdir()
2、伺服器的操作
- 建立一個 Web 伺服器
// 1. 載入 http 核心模組 var http = require('http') // 2. 使用 http.createServer() 方法建立一個 Web 伺服器,返回一個 Server 例項 var server = http.createServer() // 3.當客戶端請求過來,就會自動觸發伺服器的 request 請求事件,然後執行第二個引數:回撥處理函式 server.on('request', function () { console.log('收到客戶端的請求了') }) // 4. 繫結埠號,啟動伺服器 server.listen(3000, function () { console.log('伺服器啟動成功了,可以通過 http://127.0.0.1:3000/ 來進行訪問') })
- request 請求事件處理函式
server.on('request', function (request, response) {
console.log('收到客戶端的請求了,請求路徑是:' + request.url)
//request.url是 http://127.0.0.1:3000/ 後邊的東西
// response 物件有一個方法:write 可以用來給客戶端傳送響應資料
// write 可以使用多次,但是最後一定要使用 end 來結束響應,否則客戶端會一直等待
response.write('hello')
response.write(' nodejs')
// 告訴客戶端,我的話說完了,你可以呈遞給使用者了
response.end()
})
可以直接一句話 response.end(‘hello nodejs’)。響應內容只能是二進位制或字串
http.createServer(function(request,response){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(888);
- 頁面重定向
- 狀態碼設定為 302 臨時重定向(301永久重定向)
response.statusCode = 302
- 在響應頭中通過 Location 告訴客戶端往哪兒重定向
response.setHeader('Location', '/')
- 狀態碼設定為 302 臨時重定向(301永久重定向)
3、核心模組
檔案操作的fs模組、http服務構建的http模組、path路徑操作模組、os作業系統資訊模組等等。使用模組就要先引入var fs = require('fs)
var http = require('http')
4、require
require 是一個方法,它的作用就是用來載入模組的。在 Node 中,模組有兩種:- 具名的核心模組,例如 fs、http(fs是動態讀取檔案資訊)
- 使用者自己編寫的檔案模組
相對路徑必須加 ./
可以省略字尾名
相對路徑中的 ./ 不能省略,否則報錯
注意:
- 在 Node 中,沒有全域性作用域,只有模組作用域
- 外部訪問不到內部, 內部也訪問不到外部。預設都是封閉的
- 有時候,我們載入檔案模組的目的不是為了簡簡單單的執行裡面的程式碼,更重要是為了使用裡面的某個成員
5、http
-
埠號
- ip 地址定位計算機
- 埠號定位具體的應用程式
- 埠號的範圍是0-65536之間,一些計算機預設的埠號例如80 最好不要使用
-
Content-Type
- 伺服器最好把每次響應的資料是什麼內容型別都告訴客戶端,而且要正確的告訴
- 不同的資源對應的 Content-Type 是不一樣,具體參照:http://tool.oschina.net/commons
- 對於文字型別的資料,最好都加上編碼,目的是為了防止中文解析亂碼問題
- res.setHeader(‘Content-Type’, ‘text/plain; charset=utf-8’)——普通文字
- res.setHeader(‘Content-Type’, ‘text/html; charset=utf-8’) ——html 格式的字串
-
通過網路傳送檔案
- 傳送的並不是檔案,本質上來講傳送是檔案的內容
- 當瀏覽器收到伺服器響應內容之後,就會根據你的 Content-Type 進行對應的解析處理
6、apache目錄檔案
得到某目錄下的檔名和目錄名 fs.readdir- 獲取檔案目錄
- 將得到的檔名和目錄名替換到 template.html 中
data = data.replace('^_^', content)
- 傳送解析替換過後的響應資料res.end(data)
- 開啟伺服器就可以獲取到想要得到的檔名和檔案目錄
7、模板引擎art-template
可以在瀏覽器中使用也可以在node中使用- 在瀏覽器中使用
- 首先安裝npm install art-template
- 在瀏覽器中需要引用 lib/template-web.js 檔案
- 模板引擎不關心你的字串內容,只關心自己能認識的模板標記語法,例如 {{}}
<script type="text/template" id="tpl">
{{ name }}
</script>
<script>
var ret = template('tel',{
name:'jack'
})
</script>
//模板的迴圈
{{each 陣列]}
{{$value}}
{{/each}}
- 在node中使用
- 在需要使用的檔案模組中載入 art-template
require('art-template')
- 使用render渲染
- 在需要使用的檔案模組中載入 art-template
var ret = template.render(data.toString(), {
name: 'Jack',
})
- 服務端渲染和客戶端渲染的區別 (服務端渲染就是在服務端使用模板引擎)
- 客戶端渲染不利於 SEO 搜尋引擎優化
- 服務端渲染是可以被爬蟲抓取到的,客戶端非同步渲染是很難被爬蟲抓取到的
- 所以你會發現真正的網站既不是純非同步也不是純服務端渲染出來的
- 而是兩者結合來做的
- 例如京東的商品列表就採用的是服務端渲染,目的了為了 SEO 搜尋引擎優化
- 而它的商品評論列表為了使用者體驗,而且也不需要 SEO 優化,所以採用是客戶端渲染
8、路由模組
var url = require('url')
var obj = url.parse('/pinglun?name=的撒的撒&message=的撒的撒的撒', true)
引數為true的時候可以獲取到後面的search值,並將其轉為物件格式
query: { name: '的撒的撒', message: '的撒的撒的撒' }
9、匯出成員exports 和 module.exports
- 每個模組中都有一個 module 物件
- module 物件中有一個 exports 物件
- 我們可以把需要匯出的成員都掛載到 module.exports 介面物件中
- 也就是:
moudle.exports.xxx = xxx
的方式 - 但是每次都
moudle.exports.xxx = xxx
很麻煩,點兒的太多了 - 所以 Node 為了你方便,同時在每一個模組中都提供了一個成員叫:
exports
exports === module.exports
結果為true
- 所以對於:
moudle.exports.xxx = xxx
的方式 完全可以:expots.xxx = xxx
- 當一個模組需要匯出單個成員的時候,這個時候必須使用:
module.exports = xxx
的方式 - 不要使用
exports = xxx
不管用 - 因為每個模組最終向外
return
的是module.exports
- 而
exports
只是module.exports
的一個引用 - 所以即便你為
exports = xx
重新賦值,也不會影響module.exports
- 但是有一種賦值方式比較特殊:
exports = module.exports
這個用來重新建立引用關係的 - 總結:最後 return 的是 module.exports,不是 exports,所以你給 exports 重新賦值不管用。 多個成員可以
moudle.exports.xxx = xxx
或expots.xxx = xxx
,單個成員的時候只能module.exports = xxx
10、require優先快取載入
a載入過b,當再次require時不會重新載入。可以拿到其中的介面物件,但是不會重複執行裡邊的程式碼。目的:避免重複載入,提高模組載入效率11、require模組查詢機制
- 優先從快取載入
- 核心模組
- 路徑形式的檔案模組 ./ …/
- 第三方模組(凡是第三方模組都必須通過 npm 來下載)
- 既不是核心模組、也不是路徑形式的模組
- 先找到當前檔案所處目錄中的 node_modules 目錄
- node_modules/art-template/
- node_modules/art-template/package.json
- node_modules/art-template/package.json 裡main屬性中就記錄了 art-template 的入口模組
- package.json 檔案不存在或者 main 指定的入口模組是也沒有。node 會自動找該目錄下的 index.js
- 如果以上所有任何一個條件都不成立,則會進入上一級目錄中的 node_modules 目錄查詢
- 一個專案有且僅有一個 node_modules 而且是存放到專案的根目錄。最後找不到就會報錯
三、nodemon自動重啟模組
- 全域性安裝
npm install -g nodemon
- 本地安裝
npm i nodemon -D
- 啟動應用
nodemon [your node app]