node筆記01

進程

什么是進程

  • 每一個正在運行的應用程序都稱之為進程
  • 每一個應用程序都至少有一個進程
  • 進程是用來給應用程序提供一個運行環境
  • 進程是操作系統為應用程序分配資源的一個單位
傳統平臺的多線程
事件隊列和node內部的線程池

require

封裝一個簡單的require

function $require(id) {
  // 1. 先找到文件 如果文件不存在 Cannot find module './module/modu3.js'
  // 2. 讀取文件內容 內容是JS代碼
  const fs = require('fs');
  const path = require('path');
  
  // 要加載的JS文件路徑(完整路徑)
  const filename = path.join(__dirname, id);
  
  //C:\Users\iceStone\Desktop\fed01\day02\code\module\module4.js
  
  const dirname =  path.dirname(filename);
  //C:\Users\iceStone\Desktop\fed01\day02\code\module
  
  let code = fs.readFileSync(filename, 'utf8'); // 不會進入事件隊列
  // 3. 執行代碼, 所要執行的代碼 需要營造一個私有空間
  let module = { id: filename, exports: {} };
  let exports = module.exports;
  code =`
  (function($require, module, exports, __dirname, __filename) { 
    ${code} 
  })($require, module, exports, dirname, filename);`;
  
  eval(code);
  
  // 4. 返回值
  return module.exports;
}
require文件加載規則
  • require('./module');
    加載文件省略了 擴展名

  • requrie('./module.js');
    此時文件按JS文件加載執行

  • require('./module.json');
    此時加載的json文件

  • 通過./或../開頭:則按照相對路徑從當前文件所在文件夾開始尋找模塊;

  • require('../file.js'); => 上級目錄向下找file.js文件

  • 通過/開頭:則以系統根目錄開始尋找模塊;

  • require('/Users/iceStone/Documents/files.js');

  • 如果參數字符串不以"./"或"/"開頭,則表示加載的是一個默認提供的核心模塊(位于Node的系統安裝目錄)

  • require('fs'); => 加載核心模塊中的系統模塊

  • 或者從當前目錄向上搜索各級node_modules目錄中的文件;

  • require('my module'); => 各級node_modules文件夾中搜素my_module.js文件;

require加載目錄規則
  • 如果reqire傳入的是一個目錄路徑,會自動查看目錄的package.json文件,然后加載main字段指定的入口文件。
  • 如果packing.json文件沒有 main字段,或者根本沒有packing.json文件,則默認找目錄下點的index.js文件作為模塊:
  • require('./calcuator'); => 當前目錄下找calculator目錄中的index.js文件。

模塊的緩存

  • 第一次加載某個模塊時,Node會緩存該模塊。以后再加載該模塊時,就直接從緩存中取出該模塊的module.exports屬性(不會再次執行該模塊)
  • 如果需要多次執行模塊中的代碼,一般可以讓模塊暴露行為(函數);
  • 模塊的緩存可以通過require.cache拿到,同樣可以 刪除

清空緩存

setInterval(() => {
  //遍歷清空緩存
  Object.keys(require.cache).forEach(function(keys) {
    delete require.cache[key];
  });
  let date = require("./date.js");
}, 1000);

自己模擬緩存

function $require(id) {
  const fs = require('fs');
  const path = require('path');

  let filename = path.join(__dirname,id);
  let dirname = path.dirname(filename);
  //緩存
  $require.cache = $require.cache||{};
  if($require.cache){
    return $require.cache[filename].exports;
  }

  let code = fs.readFileSync(filename,'utf-8');
  let module = {
      id:filename,
      exports:{}
  };
  let exports = module.exports;


  let codes = `
    (($require,module,exports,__filename,__dirname)=>{
        ${code}
    })($require,module,exports,filename,dirname);
  `;
    eval(codes);
    //緩存
    $require.cache[filename] = module; 
    return module;

}

let g1 = $require("./game/03.js");
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,126評論 0 1
  • 1 Node.js模塊的實現# 之前在網上查閱了許多介紹Node.js的文章,可惜對于Node.js的模塊機制大都...
    七寸知架構閱讀 2,084評論 1 50
  • 1 Node.js模塊的實現 之前在網上查閱了許多介紹Node.js的文章,可惜對于Node.js的模塊機制大都著...
    zlx_2017閱讀 1,284評論 0 1
  • Node.js是目前非?;馃岬募夹g,但是它的誕生經歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,639評論 2 41
  • Dear diary 每次寫一些日記的時候,其實都感覺自己有更多其它的事情要做。 我不想寫這一篇日記,可是我的心情...
    過境南飛閱讀 297評論 0 0