七天學不會nodejs --- node 入門

什麼是node

node不是一門語言,是基於ChromeV8引擎的 runtime(運行時),是 JS 在後端運行的一個環境,且不包括 JS 全集node

node與js

爲何使用node

咱們常常聽到node有以下優勢:web

  • 天生優秀的高併發處理能力
  • 非阻塞(異步、callback)
  • 強大的 I/O 處理能力
  • 模塊化(CommonJs)

理解如下關鍵詞:npm

  1. 什麼是同步異步
  2. 是什麼是異步 I/O
  3. 什麼是阻塞與非阻塞
  4. 什麼是事件循環與事件驅動
  5. 什麼是單線程
  6. 什麼是進程
  7. 什麼是子進程(擴展:啓動子進程、進程通訊)

初步瞭解進程

瀏覽器原理

瀏覽器進程

  • 瀏覽器是多進程的
  • 進程擁有多個線程,如上圖的 UI 線程
  • UI 線程與 JS 線程是互斥的
  • 瀏覽器渲染引擎又叫瀏覽器內核
  • Chrome插件對應一個進程(第三方插件進程)
  • GPU提升渲染效率,對應GPU進程

I/O 密集型(對比JAVA)

圖一:Tomcat多線程處理web任務 後端

Tomcat多線程

圖二:Node單線程處理web任務 瀏覽器

Node單線程

可見 node 在web應用中的 I/O (讀寫操做、輸入輸出、請求響應) 操做是很高效的。 Node 適合處理 I/O 密集型應用,而非 CPU 密集型應用bash

node 開發三大件

  • npm 包管理器(你們都懂)
  • nvm node版本管理工具(你們也懂)
  • nrm node npm源管理工具(你們也懂)

全局變量

  • console
  • process 經常使用於設置環境變量
  • Buffer
  • ……

process多線程

console.log(process);
複製代碼

mac設置NODE_ENV閉包

> $ export NODE_ENV=dev
複製代碼

node的模塊化

node 的每個文件都是一個模塊,是 node 模塊化的一個劃分規則併發

  • 問題
    • 在 node 文件中 console.log(this) 輸出結果是什麼?
    • 若是不用 var 聲明變量 a,那麼這個 a 會在哪裏?
  • 幾個須要注意的地方
    • 異步微任務,process.nextTick() 中的 this
    • setTimeout()setImmediate() 中的 this
    • talk is cheap, show me the code

箭頭函數 this 指向的是函數的父級做用域,因此在回調函數中儘可能使用 () => {}異步

setTimeout(() => {
    console.log(this);
    // console.log(arguments);
}, 0)
複製代碼

從上面的 arguments 例子中,咱們看到了 箭頭函數的父做用域,也就是當前 node 模塊是有 arguments 存在的。這是否是能夠證實 node 模塊本質就是一個閉包?(其實沒有那麼高深莫測哦~)

// try this
console.log(a);
複製代碼

因此 node 模塊化,一個模塊內被傳入

  • __dirname
  • __filename
  • exports
  • module
  • require()

模塊化有什麼好處

  • 高內聚
  • 低耦合
  • 易維護

node依賴的是 commonjs 規範

  • 一個文件就是一個模塊
  • 使用 require 來引用,require() 能夠寫入代碼邏輯,不用置頂
  • 使用 exports/module.exports

擴展:

  • 瀏覽器中的模塊化
    • CMD:seajs 就近依賴
    • AMD:requirejs 前置依賴
  • ES6標準模塊

經過一些例子深刻了解 node 的模塊化

第一個例子:node 模塊沒有輸出

// 文件a
const a = 1;
const b = function() { console.log('this is file a'); }

// 文件b
const fileA = require('./a.js');
console.log(fileA);
複製代碼

you know nothing

其實 node 模塊其中真正的實現是醬紫:

(function(exports, require, module, __filename, __dirname) {

    module.exports = exports = this = {};

    /*------ our code -------*/

    return module.exports;
})()
複製代碼

既然瞭解了 node 模塊輸入輸出究竟是怎麼回事,name看下面這個例子

// 文件a
exports = 123;

// 文件b
const fileA = require('./a');
console.log(fileA);
複製代碼

再看下面的一個問題:

上面咱們瞭解到了 node 模塊化的本質,在咱們以往的編碼經驗中,咱們也知道,require()過來的代碼對當即執行

// a文件
console.log('這裏是a文件');
const func = () => {
    console.log('這是a文件的函數');
}
module.exports = func;

// b文件
const fileA = require('./a');
fileA();
複製代碼

那麼再看下面的這個問題:

// a文件
console.log('這裏是a文件');
const func = () => {
    console.log('這是a文件的函數');
}
module.exports = func;

// b文件
require('./a');
require('./a');
require('./a');
複製代碼

系列文章將按期更新,往期文章會按期優化

相關文章
相關標籤/搜索