node不是一門語言,是基於ChromeV8引擎的 runtime(運行時),是 JS 在後端運行的一個環境,且不包括 JS 全集node
咱們常常聽到node有以下優勢:web
理解如下關鍵詞:npm
圖一:Tomcat多線程處理web任務 後端
圖二:Node單線程處理web任務 瀏覽器
可見 node 在web應用中的 I/O (讀寫操做、輸入輸出、請求響應) 操做是很高效的。 Node 適合處理 I/O 密集型應用,而非 CPU 密集型應用bash
process多線程
console.log(process);
複製代碼
mac設置NODE_ENV閉包
> $ export NODE_ENV=dev
複製代碼
node 的每個文件都是一個模塊,是 node 模塊化的一個劃分規則併發
console.log(this)
輸出結果是什麼?var
聲明變量 a
,那麼這個 a
會在哪裏?process.nextTick()
中的 this
setTimeout()
與 setImmediate()
中的 this
箭頭函數 this 指向的是函數的父級做用域,因此在回調函數中儘可能使用 () => {}
異步
setTimeout(() => {
console.log(this);
// console.log(arguments);
}, 0)
複製代碼
從上面的 arguments
例子中,咱們看到了 箭頭函數的父做用域,也就是當前 node 模塊是有 arguments
存在的。這是否是能夠證實 node 模塊本質就是一個閉包?(其實沒有那麼高深莫測哦~)
// try this
console.log(a);
複製代碼
因此 node 模塊化,一個模塊內被傳入
模塊化有什麼好處
node依賴的是 commonjs 規範
require
來引用,require()
能夠寫入代碼邏輯,不用置頂exports
/module.exports
擴展:
第一個例子:node 模塊沒有輸出
// 文件a
const a = 1;
const b = function() { console.log('this is file a'); }
// 文件b
const fileA = require('./a.js');
console.log(fileA);
複製代碼
其實 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');
複製代碼
系列文章將按期更新,往期文章會按期優化