Node筆記一(環境&&調試)

首先進入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調試步驟
  1. 點擊左側調試按鈕 也可Ctrl+Shift+D快捷鍵 然後點擊左側上方出現的設置圖標 然後替換代碼
  2. { // 使用 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}" } ] }

然後就可以調試了
也可點擊斷點添加條件調試 只有完成條件的時候纔會觸發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章