學(xué)習視頻:尚硅谷2023版Node.js零基礎(chǔ)視頻教程,nodejs新手到高手
??path模塊
//導(dǎo)入 fs
const fs = require('fs');
const path = require('path');
//寫入文件,之前提到過可以借助__dirname規(guī)范絕對路徑,但其實不是很好
//fs.writeFileSync(__dirname + '/index.html', 'love');
//resolve:拼接規(guī)范(分隔符統(tǒng)一)的絕對路徑
console.log(path.resolve(__dirname, './index.html'));
//可以不寫./也表示絕對路徑
console.log(path.resolve(__dirname, 'index.html'));
//sep:獲取操作系統(tǒng)的路徑分隔符
console.log(path.sep); // windows下是\,Linux下是/
//parse解析路徑并返回對象
//console.log(__filename); //獲取文件的絕對路徑
let str = 'C:\\Users\\lalayouyi\\Desktop\\node\\03_path模塊\\代碼\\path.js ';
console.log(path.parse(str));
//basename:快速獲取文件名
console.log(path.basename(str));
//dirname:獲取路徑的目錄名
console.log(path.dirname(str));
//extname:獲取路徑的擴展名
console.log(path.extname(str));
??Node.js模塊化
??介紹
??模塊暴露數(shù)據(jù)
??模塊初體驗
- 創(chuàng)建
me.js
//聲明函數(shù) function lala(){ console.log('啦啦啦....'); } //暴露數(shù)據(jù) module.exports = lala;
- 創(chuàng)建
index.js
//導(dǎo)入模塊 const lala = require('./me.js'); //調(diào)用函數(shù) lala();
??暴露數(shù)據(jù)
-
模塊暴露數(shù)據(jù)的方式有兩種:
module.exports = value
exports.name = value
//me.js //聲明一個函數(shù) function lala(){ console.log('lalala...'); } function lolo(){ console.log('lololo....'); } //暴露數(shù)據(jù)(一) module.exports = { lala, lolo } //exports暴露數(shù)據(jù)(二) exports.lolo = lolo; exports.lala = lala;
//index.js //導(dǎo)入模塊 const me = require('./me.js'); //輸出 me console.log(me); me.lala(); me.lolo();
-
module.exports
可以暴露任意數(shù)據(jù)。//me.js module.exports = 'iloveyou521';
//導(dǎo)入模塊 const me = require('./me.js'); //輸出 me console.log(me);
-
不能使用
exports = value
的形式暴露數(shù)據(jù),模塊內(nèi)部 module 與 exports 的隱式關(guān)系exports = module.exports = {}
,require 返回的是目標模塊中module.exports
的值。//不能使用 `exports = value`的形式暴露數(shù)據(jù) //exports = 'iloveyou' //最后的輸出是{},也就是只會得到一個空對象 //exports = module.exports = {} console.log(module.exports);//{} console.log(module.exports === exports);//true
??導(dǎo)入文件模塊
-
在模塊中使用
require
傳入文件路徑即可引入文件。 -
require
使用的一些注意事項:- 對于自己創(chuàng)建的模塊,導(dǎo)入時路徑建議寫相對路徑 ,且不能省略 ./ 和 …/。
- js 和 json 文件導(dǎo)入時可以不用寫后綴,c/c++編寫的 node 擴展文件也可以不寫后綴,但是一般用不到。
- 如果導(dǎo)入其他類型的文件,會以 js 文件進行處理。
- 導(dǎo)入
node.js
內(nèi)置模塊時,直接require
模塊的名字即可,無需加 ./ 和 …/。
//導(dǎo)入模塊 const tiemo = require('./me.js'); //調(diào)用函數(shù) tiemo(); //省略后綴 JS const tiemo1 = require('./me'); tiemo1(); //導(dǎo)入 JSON 文件 const duanzi = require('./duanzi'); console.log(duanzi);//對象 //導(dǎo)入其他類型的文件 const test = require('./test'); console.log(test);
??導(dǎo)入文件夾的情況
- 如果導(dǎo)入的路徑是個文件夾,則會
- 首先檢測該文件夾下
package.json
文件中 main 屬性對應(yīng)的文件 - 如果存在則導(dǎo)入,反之如果文件不存在會報錯。
- 如果 main 屬性不存在,或者
package.json
不存在,則會嘗試導(dǎo)入文件夾下的index.js
和index.json
,如果還是沒找到,就會報錯。
- 首先檢測該文件夾下
針對這個main屬性相關(guān),大數(shù)據(jù)實驗實操中就有不少類似的main不對應(yīng)導(dǎo)致的報錯,應(yīng)該還對應(yīng)之后的包管理??
??導(dǎo)入模塊的基本流程
-
p72視頻講解指路文章來源:http://www.zghlxwxcb.cn/news/detail-643745.html
-
require導(dǎo)入自定義模塊的基本流程:文章來源地址http://www.zghlxwxcb.cn/news/detail-643745.html
- 將相對路徑轉(zhuǎn)為絕對路徑,定位目標文件。
- 緩存檢測。
- 讀取目標文件代碼。
- 包裹為一個函數(shù)并執(zhí)行(自執(zhí)行函數(shù))。通過
arguments.callee.toString()
查看自執(zhí)行函數(shù)。 - 緩存模塊的值。
- 返回
module.exports
的值。
/**
* 偽代碼
* 理解為node.js里require的實現(xiàn)
*/
function require(file){
//1. 將相對路徑轉(zhuǎn)為絕對路徑,定位目標文件
let absolutePath = path.resolve(__dirname, file);
//2. 緩存檢測
if(caches[absolutePath]){
return caches[absolutePath];
}
//3. 讀取文件的代碼
let code = fs.readFileSync(absolutePath).toString();
//4. 包裹為一個函數(shù) 然后執(zhí)行
let module = {};
let exports = module.exports = {};
(function (exports, require, module, __filename, __dirname) {
const test = {
name: '尚硅谷'
}
module.exports = test;
//輸出
console.log(arguments.callee.toString());
})(exports, require, module, __filename, __dirname)
//5. 緩存結(jié)果
caches[absolutePath] = module.exports;
//6. 返回 module.exports 的值
return module.exports;
}
const m = require('./me.js');
??CommonJS規(guī)范
-
module.exports
、exports
以及require
這些都是 CommonJS 模塊化規(guī)范中的內(nèi)容。 - 而 Node.js 是實現(xiàn)了 CommonJS 模塊化規(guī)范,二者關(guān)系有點像 JavaScript 與 ECMAScript。
到了這里,關(guān)于Node.js |(三)Node.js API:path模塊及Node.js 模塊化 | 尚硅谷2023版Node.js零基礎(chǔ)視頻教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!