首先進入node的官網 下載node 可以使用LTS穩定版 也可使用CURRENT 在這裏使用後者
node的模塊規範 commonjs node裏面有global對象相當於瀏覽器中的window
process代表當前進程掛在global下面的可直接使用
commonjs
首先新建一個文件夾 然後新建文件 user.js 在裏面寫console.log(‘This is a china’) 在控制檯或終端 定位到這個文件夾 然後用 node user.js 命令 會打印出 這句 This is a china
如果想要看執行這句命令的時候 node究竟做了什麼 可以在控制檯輸入
node --inspect-brk normailze.js 啓動一個服務 然後 打開Chrome 在地址欄輸入
chrome://inspect 然後點擊頁面中的inspect 就可以看到實際代碼了
(function (exports, require, module, __filename, __dirname) { // const {normailze} = require('path')
// console.log(normailze('///user/bin.js'))
console.log('This is a china')
});
export代表模塊的輸出 對外提供一些接口 提供一些屬性
require代表調用別的模塊的時候調動的一些function
module代表模塊本身
其中 module屬性裏面還有個export需要注意 以及__filename代表文件路徑
__dirname代表文件所在文件夾的路徑 都是絕對路徑
commonjs 規定
- 每個文件都是一個模塊 有自己的作用域
- 在模塊內部 module變量代表模塊本身
- module.exports屬性代表模塊對外接口
require規則
- / 表示絕對路徑, ./表示相對與當前文件的路徑
- 支持js. json . node 擴展名 不寫的話依次嘗試
- 不寫路徑則認爲是build-in模塊或者各級node_modules內的第三方模塊
require特性
- module 被加載時執行 加載後緩存(也就是說當第二次調用就直接用緩存裏面的 如果在一個js裏面 require了兩個一摸一樣的模塊 只會調用一次)
- 一旦出現某個模塊被循環加載,就只輸出已經執行的部分,還未執行的部分不會輸出
引用系統內置模塊
const fs = require('fs')//fs是系統內置模塊 可進行讀寫刪除等操作
const result = fs.readFile('fs.js',(err,data)=>{ //在這裏用fs這個內置模塊讀自己 第一個參數是文件名 第二個參數是一個回調函數 因爲讀文件是異步操作 所以 下面打印的result會輸出undefined
if(err){
console.log(err)
}else{
console.log(data); //會輸出Buffer後跟16進制的數字 如果想讀懂的話就可以用 data.toString()
}
})
console.log(result);
引用第三方模塊
- 引用第三方模塊首先要用npm安裝第三方模塊 這裏會用chalk模塊來舉例
- 首先 npm install chalk 安裝完成之後會多一個node_modules的文件夾
const chalk = require('chalk')
console.log(chalk.red('This is red')) //此模塊的功能就是可以把輸出的字體變成自己想要的顏色
現在的node_modules下安裝的依賴 以及依賴的依賴都是平級的 之前是做成樹狀的 現在這種優化了查找以及可能一個依賴安裝十多遍 的問題
exports 和 modules.exports之間有什麼區別
- const exports = module.exports
- 根據上述語句可以看出 exports是module.exports的一個快捷方式 但是要注意一點 不要改變exports的指向 例如
- exports = {a:1} 這種就相當於改變了exports的指向 使之不指向 module.exports了
- 如果想使用引用值的話 就直接用module.exports = {}就行了
global全局對象
- CommonJS
- Buffer 、process、 console
- timer
- 簡單使用場景 如
moduleA.JS
const testVal = 1000;
global.testVal = 200 //如果沒有這一句 下面的console.log(testVal)會報錯
module.exports.testVal = testVal
moduleB.JS
const mod = require('./global.js')
console.log(mod.testVal)
console.log(testVal)
process進程中常用的方法
- 參數相關 (node啓動的時候查看啓動相關的參數)
- 可以在文件中通過以下代碼查看 這幾個對象裏面都是什麼
const {argv,argv0,execArgv,execPath} = process
argv.forEach(item=>{
console.log(item); //會打印出兩個參數 第一個是node的路徑
//第二個是當前文件的路徑
//也可以通過在控制檯輸入node argv.js --test a = 1之類的外部命令
//這樣就可以在控制檯讀出除了兩個參數外的 --test a = 1
})
console.log(argv0)//對argv第一個值的引用
console.log(execArgv) //可在node --inspect argv.js 在node讀取文件之間寫參數
console.log(execPath)//當前腳本的路徑 也就是argv裏面的第一個參數
- const {env} = process
- console.log(env) 可以看到很多的可以直接調用的屬性
- console.log(process.cwd())可以打印當前執行的路徑
- setImmediate(()=>{}) 這個是在global中的傳入一個參數 當前事件隊列執行完之後在執行 與之對應相關的是 process.nextTick(()=>{})也是傳入一個參數 但是他是放在了當前隊列的最後一個執行 而setImmediate是放在了下個隊列的隊首 所以process.nextTick要比setImmediate先執行 而setTimeout是在他們兩個中間 大部分情況下用setImmediate就行 因爲如果process.nextTick裏面循環調用就會阻塞後面的執行
調試
- 可以使用 Inspector 或者vscode
- 如果使用inspector 可以看commonjs模塊. 打斷點啥的都是平常差不多的
- 使用vscode調試步驟
- 點擊左側調試按鈕 也可Ctrl+Shift+D快捷鍵 然後點擊左側上方出現的設置圖標 然後替換代碼
{ // 使用 IntelliSense 瞭解相關屬性。 // 懸停以查看現有屬性的描述。 // 欲瞭解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Current file", "program": "${file}", "cwd": "${cwd}" }, { "type": "node", "request": "launch", "name": "Launch Program", "program": "${file}" } ] }
然後就可以調試了
也可點擊斷點添加條件調試 只有完成條件的時候纔會觸發