JavaScript >> Javascript 文檔 >  >> Node.js

Node.js 基礎知識:主要概念的簡明概述

Node.js 是一個高效且可擴展的非阻塞 I/O 平台,構建在 Google Chrome V8 引擎及其 ECMAScript 之上。這意味著大多數前端 JavaScript(ECMAScript 的另一種實現)對象、函數和方法都可以在 Node.js 中使用。如果您需要復習 JS 特定的基礎知識,請參閱 JavaScript FUNdamentals。

開發人員可以從其網站安裝 Node.js 並遵循主要 Node.js 概念的概述。有關更詳細的 Node.js 說明,請查看使用 JS 進行快速原型設計:敏捷 JavaScript 開發和節點學校。

Node.js 中的讀取-評估-打印循環(又名控制台)

與許多其他編程語言和平台一樣,Node.js 有一個由 $ node 打開的 read-eval-print 循環工具 命令。提示變為 > 我們可以執行類似於 Chrome 開發者工具控制台的 JavaScript。 Node.js 和瀏覽器中的 ECMAScript 實現略有不同(例如,{}+{} ),但大部分結果是相似的。

如您所見,我們可以整天在控制台中編寫 JavaScript,但有時我們可以保存腳本以便稍後運行。

啟動 Node.js 腳本

要從文件啟動 Node.js 腳本,只需運行 $ node filename ,例如,$ node program.js .如果我們只需要一組快速的語句,那麼有一個 -e 允許運行內聯 JavaScript/Node.js 的選項,例如 $ node -e "console.log(new Date());" .

Node.js 進程信息

每個運行的 Node.js 腳本本質上都是一個進程。例如,ps aux | grep 'node' 將輸出一台機器上運行的所有 Node.js 程序。方便地,開發人員可以使用 process 在代碼中訪問有用的流程信息 對象,例如 node -e "console.log(process.pid)"

在 Node.js 中訪問全局作用域

正如您從 JS FUNdamentals 中了解到的那樣,瀏覽器 JavaScript 默認情況下會將所有內容都置於其全局範圍內。這在 Douglas Crockford 著名的 [JavaScript:The Good Parts] 中被創造為 JavaScript 的壞部分之一。 Node.js 被設計成不同的行為方式,默認情況下一切都是本地的。如果我們需要訪問全局變量,有一個 global 目的。同樣,當我們需要導出某些東西時,我們應該明確地這樣做。

從某種意義上說,window 前端/瀏覽器 JavaScript 中的對像變形為 global 的組合 和 process 對象。不用說,document Node.js 中不存在代表網頁 DOM 的對象。

導出和導入模塊

另一個不好的部分 在瀏覽器 JavaScript 中,無法包含模塊。腳本應該使用不同的語言 (HTML) 鏈接在一起,但缺乏依賴管理。 CommonJS 和 RequireJS 使用 AJAX-y 方法解決了這個問題。 Node.js 從 CommonJS 概念中藉鑑了很多東西。

[旁注]

閱讀博客文章很好,但觀看視頻課程更好,因為它們更具吸引力。

許多開發人員抱怨 Node.js 上缺乏負擔得起的高質量視頻材料。觀看 YouTube 視頻會讓人分心,花 500 美元購買 Node 視頻課程很瘋狂!

去看看 Node University,它有關於 Node 的免費視頻課程:node.university。

[旁注結束]

要在 Node.js 中導出對象,請使用 exports.name = object; ,例如,

var messages = {
  find: function(req, res, next) {
  ...
  },
  add: function(req, res, next) {
  ...
  }, 
  format: 'title | date | author'
}
exports.messages = messages;

在我們導入上述腳本的文件中(假設路徑和文件名是 route/messages.js ):

var messages = require('./routes/messages.js');

但是,有時調用構造函數更合適,例如,當我們將屬性附加到 Express.js 應用程序時(Express.js FUNdamentals:An Essential Overview of Express.js 中有關 Express.js 的更多信息)。在這種情況下 module.exports 需要:

module.exports = function(app) {
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  return app;
}

在包含上述示例模塊的文件中:

...
var app = express();
var config = require('./config/index.js');
app = config(app);
...

更簡潔的代碼:var = express(); require('./config/index.js')(app); .

包含模塊時最常見的錯誤是文件路徑錯誤。對於核心 Node.js 模塊,只需使用不帶任何路徑的名稱,例如 require(‘name’)。 node_modules 中的模塊也是如此 文件夾。稍後將在 NPM 部分詳細介紹。

對於所有其他文件,請使用 . 帶或不帶文件擴展名,例如,

var keys = require('./keys.js'),
  messages = require('./routes/messages.js');

此外,對於後一類,可以使用帶有 __dirname 的更長的語句 和 path.join() ,例如,require(path.join(__dirname, ,'routes', 'messages'));`

如果 require() 指向一個文件夾,Node.js 將嘗試讀取 index.js 該文件夾中的文件。

Buffer 是 Node.js 的超級數據類型

Buffer 是 Node.js 對前端 JavaScript 中四種原語(布爾值、字符串、數字和正則表達式)和無所不包的對象(數組和函數也是對象)的補充。我們可以將緩衝區視為極其高效的數據存儲。事實上,Node.js 會盡可能地嘗試使用緩衝區,例如,從文件系統讀取,通過網絡接收數據包。

__dirname 與 process.cwd

__dirname 是調用此全局變量的文件的絕對路徑,而 process.cwd 是運行此腳本的進程的絕對路徑。如果我們從不同的文件夾(例如 $ node ./code/program.js)啟動程序,後者可能與前者不同 .

Node.js 中的實用工具

雖然,Node.js 平台的核心被有意保持較小,但它具有一些基本實用程序,例如

  • 網址
  • 加密
  • 路徑
  • 字符串解碼器

我們在本教程中使用的方法是 path.join 它使用適當的文件夾分隔符連接路徑(/\\ )。

在 Node.js 中讀寫文件系統

從文件讀取是通過核心 fs 完成的 模塊。有兩組方法:異步和同步。在大多數情況下,開發人員應該使用異步方法,例如 fs.readFile:

var fs = require('fs');
var path = require('path');
fs.readFile(path.join(__dirname, '/data/customers.csv'), {encoding: 'utf-8'}, function (err, data) {
  if (err) throw err;
  console.log(data);
});

以及寫入文件:

var fs = require('fs');
fs.writeFile('message.txt', 'Hello World!', function (err) {
  if (err) throw err;
  console.log('Writing is done.');
});

Node.js 中的流式數據

流數據是一個術語,表示應用程序在接收數據的同時處理數據。這對於超大型數據集非常有用,例如視頻或數據庫遷移。

下面是一個使用流輸出二進製文件內容的基本示例:

var fs = require('fs');
fs.createReadStream('./data/customers.csv').pipe(process.stdout);

默認情況下,Node.js 對流使用緩衝區。

要獲得更身臨其境的訓練,請在流冒險和流手冊中尋找戰利品。

使用 NPM 安裝 Node.js 模塊

NPM 帶有 Node.js 平台,並允許無縫的 Node.js 包管理。方式npm install work 在某種程度上類似於 Git,它遍歷工作樹以查找當前項目。首先,請記住我們需要 package.json 文件或 node_modules 文件夾,以便使用 $ npm install name 在本地安裝模塊 ,例如 $ npm install superagent;在 program.js 中:var suparagent = requier('superagent'); .

NPM 最好的地方在於它將所有依賴項保持在本地,因此如果模塊 A 使用模塊 B v1.3,模塊 C 使用模塊 B v2.0(與 v1.3 相比有重大更改),則 A 和 C 都將具有他們自己的不同版本 B 的本地化副本。與 Ruby 和其他默認使用全局安裝的平台不同,這被證明是一種更優越的策略。

最佳做法是不包含 一個 node_modules 當項目是應該在其他應用程序中使用的模塊時,將文件夾放入 Git 存儲庫。但是,建議包含 node_modules 用於可部署的應用程序。這可以防止因不幸的依賴更新而導致損壞。

注意:NPM 創建者喜歡稱它為 npm (小寫)。

帶有 HTTP Node.js 模塊的 Hello World 服務器

雖然 Node.js 可以用於各種各樣的任務,但它主要用於構建 Web 應用程序。 Node.js 因其異步特性和內置的 net 和 http 等模塊而在網絡中蓬勃發展。

這是一個典型的 Hello World 示例,我們創建一個服務器對象,定義請求處理程序(帶有 req 和 res 參數的函數),將一些數據傳回給接收者並啟動整個事情。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');]

req 和 res 參數對應地包含有關給定 HTTP 請求和響應的所有信息。此外,req 和 res 都可以作為流使用(參見上一節)。

調試 Node.js 程序

最好的調試器是 console.log() ,但有時我們需要查看調用堆棧並在異步代碼中定位自己。為此,請輸入 debugger 代碼中的語句並使用 $ node debug program.js 開始調試過程。如需更多開發者友好的界面,請下載節點檢查器。

在 Node.js 中馴服回調

回調能夠異步編寫 Node.js 代碼,但是來自 Java 或 PHP 的不熟悉 JavaScript 的程序員在看到 Callback Hell 上描述的 Node.js 代碼時可能會感到驚訝:

fs.readdir(source, function(err, files) {
  if (err) {
    console.log('Error finding files: ' + err)
  } else {
    files.forEach(function(filename, fileIndex) {
      console.log(filename)
      gm(source + filename).size(function(err, values) {
        if (err) {
          console.log('Error identifying file size: ' + err)
        } else {
          console.log(filename + ' : ' + values)
          aspect = (values.width / values.height)
          widths.forEach(function(width, widthIndex) {
            height = Math.round(width / aspect)
            console.log('resizing ' + filename + 'to ' + height + 'x' + height)
            this.resize(width, height).write(destination + 'w' + width + '_' + filename, function(err) {
              if (err) console.log('Error writing file: ' + err)
            })
          }.bind(this))
        }
      })
    })
  }
})

只要使用兩個空格的縮進,這裡就沒有什麼好怕的。;-) 但是,回調代碼可以通過使用事件發射器、promise 或使用異步庫來重寫。

Ryan Dahl 介紹 Node.js

最後但並非最不重要的一點:

使用 Express.js 向前發展

在您掌握了本文中的 Node.js 基礎知識之後,您可能想閱讀 Express.js FUNdamentals:Express.js 的基本概述,並考慮編寫一個關於 Express.js 框架的交互式課程,該課程截至目前是NPM 上最受歡迎的模塊。


Tutorial JavaScript 教程
  1. 刪除數組中的重複項

  2. 超越 React 16:時間切片和懸念 API

  3. 如何使用 Service Worker 優化您的 JavaScript 應用

  4. 將 ID 添加到 Dropzone.js 中的預覽 div

  5. 公共解決方案:創建隨機糖果袋

  6. 使用 Figma、CSS、HTML、JS 創建交互式表單😀

  7. 為什麼選擇 NX ==現代 Web 開發

  1. 在 JavaScript 中使用 While 和 Do While 循環

  2. 從 SCSS 遷移到樣式化組件:優點和注意事項

  3. 35+ 免費 React 模板和主題

  4. 讓我們談談虛假

  5. 如何使用 Angular 檢測網絡連接是否在線/離線 - RXJS

  6. 在您的 vue 3 應用程序中使用 Paystack 接受付款

  7. 你應該知道的前 5 個 JavaScript 庫

  1. 數據結構系列:鍊錶

  2. 除非你需要,否則不要製作 NPM 包

  3. NgRx 最佳實踐系列:1. Cache &LoadStatus

  4. Vue.js 注意mounted不保證所有子組件也都已經掛載了?