進程
什么是進程
- 每一個正在運行的應用程序都稱之為進程
- 每一個應用程序都至少有一個進程
- 進程是用來給應用程序提供一個運行環境
- 進程是操作系統為應用程序分配資源的一個單位
傳統平臺的多線程
事件隊列和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");